Python Tkinter - 如何从主窗口类外部更改变量?

时间:2016-04-06 20:36:59

标签: python tkinter tkinter-canvas

现在我理解了实例变量和类的概念,我之前从未遇到过它们的问题,而且我经常使用它们。但是,当我创建我的MainWindow类时,在我尝试访问实例变量之前,一切都很好。

http://pastebin.com/tDs5EJhi是完整的代码,但此时它只是放置标签和框架等等,没有实际的逻辑正在进行。窗户看起来很好,没有任何不好的事情发生。

当我尝试在外部改变窗口内部的东西时,我的问题就出现了。我想我可以创建一个类的实例并从那里更改变量(即instancevariable.ImageCanvas.itemconfig()),就像我通常可以,但是Tkinter并不是很好,我认为这是Tkinter的mainloop的结果( )。

这是我的班级MainWindow()的故事,我遇到了麻烦(ln 207)

            ...
            self.C4 = Tk.PhotoImage(file="temp.png")
            self.card4 = self.CardCanvas.create_image(120,46,image=self.C4, state=Tk.NORMAL)
            #self.CardCanvas.itemconfig(4, state=Tk.HIDDEN) # < It works here
            ...
        self.root.mainloop()

window = MainWindow()
window.CardCanvas.itemconfig(4, state=Tk.HIDDEN) # < It doesn't work here

这就是我学习如何编辑实例变量的方法。当窗口弹出时,itemconfig命令实际上并不像它在类中那样应用(或者它可能并且窗口只是没有更新?)并且在关闭窗口后我得到这个错误:

_tkinter.TclError: invalid command name

我假设只是因为它试图将方法应用于不再存在的变量,现在窗口已经关闭。

所以我猜这是我的一个大问题 - 我有一个MainWindow类,从我所知道的,没有什么可以从类外部改变,因为Tk.mainloop()正在运行并且不会停止让其他运行后的代码,如itemconfig。我该如何改变这些变量?在MainWindow()关闭之前,实例变量声明之后的代码似乎不会运行。

1 个答案:

答案 0 :(得分:0)

mainloop之后运行的代码是正确的。它确实如此,但只有在GUI被销毁之后。 Tkinter专为调用mainloop而设计,是最后一行(或非常接近最后一行)的可执行代码。一旦被调用,所有其他工作必须作为对事件的反应来完成。这就是GUI编程的本质。

答案&#34;我如何改变变量&#34;很简单:在调用mainloop之前执行此操作,或者在对事件做出反应时执行此操作。例如,在回调按钮时执行此操作,在绑定到事件的函数中执行此操作,或通过after执行基于时间的事件,依此类推。