当控制台具有焦点时,Python 使用 Tkinter 捕获事件

标签 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()

我尝试使用各种方法(抓取和聚焦)将焦点重定向到我的应用程序。我能做的最好的事情就是使用 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/

相关文章:

python - 在 numpy 数组中找到最大上三角项的索引的有效方法?

python - Heroku - 进程以状态 255 退出

python - Tkinter - 预加载窗口?

python - tkinter:检查修改

python - Tkinter在带有lambda的for循环中分配按钮命令

python - 使用 slider 编辑颜色值

python - Python subprocess.run无法处理大参数字符串

python - Swift REPL 抛出 python 错误?

python - 内存 Zip 文件中的 Python 错误

python - 使用 Tkinter 用户输入作为函数中的变量