Фокус окна Tkinter на Mac OS X
Я пишу приложение на Python с каркасом Tkinter GUI. Он слушает события клавиатуры и мыши, поэтому должен иметь фокус. Когда он запускается из терминала в 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), эмулятор терминала сохраняет фокус до тех пор, пока пользователь не нажмет на окно. Кто-нибудь знает обходной путь для этого?
3 ответа
Я попробовал это, и это сработало хорошо для меня:
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, либо.
Пришел сюда, задавая тот же вопрос, но я нашел этот мудрый звучащий ответ от Кевина Уолцера, который предлагает использовать py2app
:
Да, это стандартное поведение для OS X. Запуск приложения в Терминале сохраняет фокус в Терминале, если вы не переключаетесь нажатием окна. Поведение Command-Tab определяется системой управления окнами, а не вновь порожденным процессом.
Обходной путь - обернуть ваше приложение в стандартный пакет приложений Mac, используя py2app. Средний пользователь Mac не собирается запускать игру на основе Python из командной строки.
Kevin
Помогают ли 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()