Фокус окна 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

(из https://groups.google.com/forum/)

Помогают ли 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()
Другие вопросы по тегам