当控制台与Tkinter聚焦时,Python捕获事件

时间:2016-03-04 22:23:26

标签: python tkinter

我正在构建一个控制台应用程序,并希望实时捕获按键。以下代码完美运行,直到另一个窗口获得焦点。从那时起,我无法恢复到只能在控制台可见的情况下再次捕获击键和其他事件的状态。

import tkinter as tk
app = tk.Tk()

def handleKeypress(event):
    key = event.char
    if(key == 'q'):
        app.destroy()
    else:
        print(key)

app.bind_all('<Key>', handleKeypress)
app.withdraw()
app.mainloop()

我尝试过使用各种方法(抓取和聚焦)将焦点重定向到我的应用。我能做的最好的事情就是让Tkinter窗口可见并使用deiconify()聚焦,但我无法再次隐藏它以使其成为控制台是唯一的窗口。

在Tkinter窗口中添加以下结果会反复出现和消失:

def lostFocus(event):
    app.deiconify()
    app.focus_force()
    app.withdraw()

app.bind_all('<FocusOut>', lostFocus)

如何在发布后立即返回应用程序所处的状态?或者甚至更好,如何强制它获取所有事件而不必使Tkinter窗口可见并且对焦?

1 个答案:

答案 0 :(得分:1)

你无法做你想做的事。 Tkinter设计 - 与大多数GUI工具包一样 - 仅在具有焦点时处理事件。这是整个焦点:操作系统知道发送事件的位置。

它最初工作的事实可能是tkinter中的一个错误。虽然,也许可以通过窗口最初具有焦点的事实来解释,当你撤回窗口时,操作系统不会移动焦点

恢复焦点的唯一方法是使窗口可见。