我在Python 3.4中运行tkinter。即使在应用程序终止后,按钮事件似乎仍然与命令绑定。代码段:
# application class
class DataSel:
def __init__(self,parent):
self.parent = parent
<...>
self.button_sel = tk.Button(self.parent,text='Select')
self.button_sel.grid(row=1,sticky='nesw')
self.button_sel.bind('<Button-1>',self.sel_click)
self.button_quit = tk.Button(self.parent,text='Quit')
self.button_quit.grid(row=2,sticky='nesw')
self.button_quit.bind('<Button-1>',self.quit_click)
def sel_click(self,event):
self.filename = askopenfilename(parent=self.parent)
<...>
def quit_click(self,event):
self.parent.destroy()
# main part of application
root = tk.Tk()
root.lift()
sel = DataSel(root)
root.lift()
root.mainloop()
当我从头开始重新启动解释器并运行此应用程序时,没有错误消息。但是,在button_sel
方法完成后,sel_click
按钮仍保持按下(低浮雕)。然后,如果我退出应用程序并重新运行它,我会在shell中收到以下消息:
invalid command name ".94227256"
while executing
"$w cget -state"
(procedure "tk::ButtonDown" line 12)
invoked from within
"tk::ButtonDown .94227256"
(command bound to event)
每次重新运行时,数字.94227256
会发生变化。
除了此消息,以及按钮保持低浮雕的事实,所有其他功能都可以。但似乎按钮事件不知何故仍然与陈旧的命令绑定!
答案 0 :(得分:4)
发生的事情是你的绑定发生在按钮小部件能够处理同一事件之前。您在处理事件期间正在执行此操作,并且您没有告诉Tkinter停止进一步处理事件。因此,当Tkinter开始让窗口小部件处理click事件时,窗口不再存在,并且tkinter会抛出错误。
问题的根源在于您将绑定放在按钮上。你不应该这样做。如果要从按钮调用函数,则需要使用按钮的command
属性。
如果你真的认为你需要通过绑定(而不是通过command
属性)来做这件事,你需要你的函数返回'“break”`告诉tkinter停止对事件的任何进一步处理。