我正在构建一个控制台应用程序,并且希望实时捕获击键。以下代码可以完美运行,直到另一个窗口获得焦点。从那时起,我无法回到可以再次捕获击键和其他事件且仅控制台可见的状态。
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()
我尝试使用各种方法(抓取和聚焦)将焦点重定向到我的应用程序。我能做的最好的事情就是使用 deiconify() 使 Tkinter 窗口可见并处于焦点,但我无法再次隐藏它以使其看起来好像控制台是唯一的窗口。
添加以下结果会导致 Tkinter 窗口反复出现和消失:
def lostFocus(event):
app.deiconify()
app.focus_force()
app.withdraw()
app.bind_all('<FocusOut>', lostFocus)
如何返回应用程序启动后的状态?或者更好的是,我如何强制它获取所有事件,而不必使 Tkinter 窗口可见并处于焦点?
最佳答案
你不能做你想做的事。与大多数 GUI 工具包一样,Tkinter 的设计目的是仅在获得焦点时处理事件。这就是重点:让操作系统知道将事件发送到哪里。
它最初起作用的事实可能是 tkinter 中的一个错误。不过,也许可以用以下事实来解释:窗口最初具有焦点,当您撤回窗口时,操作系统不会移动焦点
恢复焦点的唯一方法是使窗口可见。
关于当控制台具有焦点时,Python 使用 Tkinter 捕获事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35807175/