Окно Tkinter фокусируется на Mac OS X

Я пишу приложение на Python с графическим интерфейсом Tkinter. Он прослушивает события клавиатуры и мыши, поэтому он должен иметь фокус. Когда он запускается с терминала в Ubuntu, работает следующий код:

from Tkinter import *

root = Tk()
root.focus_force()

def key(event):
    print "pressed", event.char

def callback(event):
    print "clicked at", event.x, event.y 

frame = Frame(root, width=100, height=100)
frame.bind("<Key>", key)
frame.bind("<Button-1>", callback)
frame.pack()
frame.focus_force()

root.mainloop()

Однако при запуске с терминала в Mac OS X 10.8.4 (запас Python 2.7.2) фокус сохраняется эмулятором терминала до тех пор, пока пользователь не нажмет на него окно. Кто-нибудь знает об обходном пути для этого?

Ответ 1

Я пробовал это, и это сработало для меня:

from os import system
from platform import system as platform

# set up your Tk Frame and whatnot here...

if platform() == 'Darwin':  # How Mac OS X is identified by Python
    system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')

Конечно, это приведет ваше приложение на передний план, а не только определенное окно, но после этого вы можете использовать focus_force() в определенном кадре или окне, и это будет перемещено, чтобы стать самый передний из всех окон вашего приложения.

Для тех, кого это интересует, я сам не писал сам вызов system(). Я нашел его в этой теме на SourceForge.

Тот факт, что я положил вызов system() в блок if, который проверяет это, работает на OS X, делает решение кросс-платформой - я понимаю, что focus_force() работает на всех других платформах точно так, как вы хотите, и просто выполнение этого после вызова system() не вызовет никаких проблем в OS X.

Ответ 2

пришел сюда, задаваясь вопросом о том же вопросе, но я нашел этот мудрый звуковой ответ от Кевина Вальзера, который предлагает использовать py2app:

Да, это стандартное поведение для OS X. Запуск приложения в терминале сохраняет фокус в терминале, если вы не переключитесь, щелкнув окна. Поведение командной строки определяется системой окон, а не вновь созданный процесс.

Способы обернуть ваше приложение в стандартном приложении Mac с помощью py2app. Средний пользователь Mac не собирается запускать Игра на основе Python из командной строки.

Кевин

(из https://groups.google.com/forum/#!topic/comp.lang.python/ZPO8ZN5dx3M)

Ответ 3

Помогает ли wait_visibility и event_generate помощь?

например. что-то вроде -

from Tkinter import *

root = Tk()

def key(event):
    print "pressed", event.char

def callback(event):
    print "clicked at", event.x, event.y 

frame = Frame(root, width=100, height=100)
frame.bind("<Key>", key)
frame.bind("<Button-1>", callback)
frame.pack()

frame.focus_set()

root.wait_visibility()
root.event_generate('<Button-1>', x=0, y=0)

root.mainloop()