Окно 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()