【问题标题】:Why won't Tkinter executable capture key combinations?为什么 Tkinter 可执行文件不能捕获组合键?
【发布时间】:2019-12-14 20:15:48
【问题描述】:

我正在 Python 3.7 上构建一个 tkinter 应用程序,并在 Windows 10 中使用 Pyinstaller 3.5 创建一个 .exe。从 IDE 运行代码时,所有预期的键盘命令都按预期工作。但是,在可执行文件中,组合键不起作用,而单键按下是可以的。

下面是一些演示问题的测试代码:

import tkinter as tk

root = tk.Tk()

txt = tk.StringVar()
lbl = tk.Label(root, textvariable=txt)

def key_handle(event):
    global txt
    txt.set(event.keysym)

def kc_handle(event):
    tk.messagebox.showinfo('Key Combo', 'Key Combo pressed')

root.bind('<Key>', key_handle)
root.bind('<Alt-b>', kc_handle)

lbl.pack()
root.mainloop()

Pyinstaller 然后以pyinstaller -w -F key_test.py 调用。

我知道的一件事是绑定的顺序似乎没有什么区别。如何让组合键在可执行文件中起作用?

【问题讨论】:

  • 您是否在终端/控制台/cmd.exe 中运行 .exe 以查看它是否显示错误消息?如果您删除 bind('&lt;Key&gt;') 会怎样?
  • 当我运行它(没有 IDLE)然后我得到错误'tkinter' has no attribute 'messagebox',因为你忘记了import tkinter.messagebox。 IDLE 是使用tkinter 构建的,它可以将其导入以供自己使用,并且您的代码可以在没有此导入的情况下工作,但它将无法正常工作。
  • 从终端运行可执行文件没有给出任何错误消息。导入tkinter.messagebox 确实为我修复了测试代码。此解决方案也适用于原始应用程序。 (在我使用的应用程序中tkinter.simpledialog。)

标签: python tkinter pyinstaller


【解决方案1】:

IDLE 是使用tkinter 构建的,它可以导入所有需要的模块供自己使用,并且您的代码可以正常工作,但是当您在没有IDLE 的情况下运行它时,您必须导入您在代码中使用的所有模块。在您的示例中,它将是

import tk.messagebox

顺便说一句:mainloop() 经常有类似的问题。 IDLE aready 运行 mainloop() 所以代码可以在没有自己的 mainloop() 的情况下工作。但通常(没有IDLE)它需要使用mainloop()。最好检查terminal/console/cmd.exe 中的代码,看看是否有错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2015-06-30
    • 1970-01-01
    • 2011-11-18
    • 2011-06-18
    相关资源
    最近更新 更多