Переадресация Tkinter предотвращает определенные события в Mac и Linux

Я пишу программу на Python с интерфейсом Tkinter. Я хочу иметь маленькое окно без строки заголовка. Это окно должно получать ввод с клавиатуры. Я не привередлив, является ли это в форме виджета Entry или просто привязкой к KeyPress.overrideredirect(True) как правило, как заголовок отключен. К сожалению, (кроме Windows), это, кажется, препятствует получению многих событий. Я написал этот код для иллюстрации проблемы:

#!/usr/bin/env python
from __future__ import print_function
import Tkinter

class AppWindow(Tkinter.Tk):
    def __init__(self, *args, **kwargs):
        Tkinter.Tk.__init__(self, *args, **kwargs)
        self.overrideredirect(True)
        self.geometry("400x25+100+300")

        titleBar = Tkinter.Frame(self)
        titleBar.pack(expand = 1, fill = Tkinter.BOTH)

        closeButton = Tkinter.Label(titleBar, text = "x")
        closeButton.pack(side = Tkinter.RIGHT)
        closeButton.bind("<Button-1>", lambda event: self.destroy())

        self.bind("<KeyPress>", lambda event: print("<KeyPress %s>" % event.char))
        self.bind("<Button-1>", lambda event: print("<Button-1>"))
        self.bind("<Enter>", lambda event: print("<Enter>"))
        self.bind("<Leave>", lambda event: print("<Leave>"))
        self.bind("<FocusIn>", lambda event: print("<FocusIn>"))
        self.bind("<FocusOut>", lambda event: print("<FocusOut>"))

if __name__ == "__main__":
    app = AppWindow()
    app.mainloop()

Это создает небольшое окно (без строки заголовка), которое печатает название общих событий, когда оно получает их. Я запустил этот скрипт на Windows 7, Mac OSX (El Capitan) и Ubuntu 14.04.1. Я запускал только Ubuntu на виртуальной машине (VMWare).

В Windows это, кажется, работает как ожидалось. Все события, которые проверяет мой код, могут быть получены.

В Ubuntu окно Tkinter получает<Enter>, <Leave>, а также<Button-1> события, как и ожидалось, но<KeyPress>, <FocusIn>, а также<FocusOut> никогда не принимаются. Фактически, даже после щелчка по окну последнее окно с фокусом продолжает получать нажатия клавиш.

В OSX окно Tkinter получает<Button-1> события, как и ожидалось, но<KeyPress>, <FocusIn>, а также<FocusOut> никогда не принимаются. Последнее окно с фокусом не продолжает получать нажатия клавиш, как в Ubuntu.<Enter> а также<Leave> события ведут себя немного странно.<Enter> событие не получено до тех пор, пока не будет нажата кнопка. Затем, как только<Leave> происходит событие, нужно снова щелкнуть окно, чтобы получить другое<Enter> событие.

Я также пыталсяself.focus_force() незадолго до конца__init__ функция. Это заставляет окно получать<FocusIn> событие, когда программа запускается, но не дальше<KeyPress>, <FocusIn>, или же<FocusOut> события никогда не принимаются.

В конечном счете, мой вопрос заключается в следующем: есть ли способ скрыть строку заголовка, но продолжать получать ввод с клавиатуры в OSX и Linux?

Мне известны некоторые другие вопросы, касающиеся этой же проблемы. На эти три вопроса:

Python Tkinter overrideredirect; не может получать нажатия клавиш (Linux)root.overrideredirect и привязка <Any-KeyPress>Как связать Tkinter destroy () с ключом в Debian?

Принятым ответом является использованиеself.attributes('-fullscreen', True), который не будет работать для меня, так как я хочу маленькое окошко, а не полноэкранное приложение.

Есть еще один вопрос:Tkinter overrideredirect больше не получает привязки событий, Это кажется очень близким к моему вопросу, но предоставлено меньше деталей и не имеет ответа.

Обновить: Я пытался исследовать основной механизм моей проблемы. Я знаю, что Tkinter - это оболочка для Tcl / Tk, поэтому я решил попробовать переписать свой код на Tcl. Я действительно не знаю Tcl, но я думаю, что мне удалось (более или менее) перевести мой Python:

#!/usr/bin/env wish
wm overrideredirect . True
wm geometry . "400x25+100+300"
bind . <KeyPress> {puts "<KeyPress %K>"}
bind . <Button-1> {puts "<Button-1>"}
bind . <Enter> {puts "<Enter>"}
bind . <Leave> {puts "<Leave>"}
bind . <FocusIn> {puts "<FocusIn>"}
bind . <FocusOut> {puts "<FocusOut>"}

Я попробовал получившуюся программу в Windows и Mac OSX. В винде я получил<KeyPress> событий, но в OSX я этого не сделал. Безwm overrideredirect . True линия, OSX действительно получает<KeyPress> События. Поэтому похоже, что эта проблема не с Python, а с Tcl / Tk.

Ответы на вопрос(1)

Ваш ответ на вопрос