tkinter:应用程序终止后事件绑定仍然存在?

时间:2015-01-22 12:40:35

标签: python tkinter

我在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会发生变化。

除了此消息,以及按钮保持低浮雕的事实,所有其他功能都可以。但似乎按钮事件不知何故仍然与陈旧的命令绑定!

1 个答案:

答案 0 :(得分:4)

发生的事情是你的绑定发生在按钮小部件能够处理同一事件之前。您在处理事件期间正在执行此操作,并且您没有告诉Tkinter停止进一步处理事件。因此,当Tkinter开始让窗口小部件处理click事件时,窗口不再存在,并且tkinter会抛出错误。

问题的根源在于您将绑定放在按钮上。你不应该这样做。如果要从按钮调用函数,则需要使用按钮的command属性。

如果你真的认为你需要通过绑定(而不是通过command属性)来做这件事,你需要你的函数返回'“break”`告诉tkinter停止对事件的任何进一步处理。