Python 为什么赢了';t Tkinter可执行文件捕获密钥组合?

Python 为什么赢了';t Tkinter可执行文件捕获密钥组合?,python,tkinter,pyinstaller,Python,Tkinter,Pyinstaller,我正在Python3.7上构建一个tkinter应用程序,并在Windoows 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

我正在Python3.7上构建一个tkinter应用程序,并在Windoows 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()
将tkinter作为tk导入
root=tk.tk()
txt=tk.StringVar()
lbl=tk.Label(根,textvariable=txt)
def钥匙手柄(事件):
全局文本
txt.set(event.keysym)
def kc_句柄(事件):
tk.messagebox.showinfo('组合键','按下组合键')
root.bind(“”,键\u句柄)
root.bind(“”,kc_句柄)
lbl.pack()
root.mainloop()
然后调用Pyinstaller作为
Pyinstaller-w-F key\u test.py


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

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

import tk.messagebox


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

您是否在terminal/console/cmd.exe中运行了.exe以查看是否显示错误消息?如果删除
bind(“”)
?当我运行它(没有空闲)时,我得到了一个错误
“tkinter”没有属性“messagebox”
,因为你忘记了
导入tkinter.messagebox
。IDLE是使用
tkinter
构建的,它可以导入它供自己使用,并且您的代码可以在没有此导入的情况下工作,但它将无法正常工作。从终端运行可执行文件不会给出任何错误消息。导入
tkinter.messagebox
确实为我修复了测试代码。此解决方案也适用于原始应用程序。(在应用程序中,我使用的是
tkinter.simpledialog