Python Tkinter - 如何从主 window class 外部更改变量?
Python Tkinter - How do I change variables from outside the main window class?
现在我理解了实例变量和 classes 的概念,我以前从来没有遇到过它们的问题,而且我经常使用它们。但是,当我创建主窗口 class 时,一切都很顺利,直到我尝试访问实例变量。
http://pastebin.com/tDs5EJhi 是完整的代码,但此时它只是放置标签和框架等等,没有实际的逻辑在进行。 window 看起来不错,没有什么不好的事情发生。
我的问题是当我尝试从外部更改 window 内部的内容时。我想我可以像往常一样创建 class 的实例并从那里更改变量(即 instancevariable.ImageCanvas.itemconfig()),但 Tkinter 对此并不友好,我认为这是一个结果Tkinter 的 mainloop().
这是我在使用 class 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
这就是我学会如何编辑实例变量的方式。当 window 弹出时,itemconfig 命令实际上并没有像它在 class 中那样应用(或者它可能应用了但 window 只是没有更新?)和关闭 window 后出现此错误:
_tkinter.TclError: invalid command name
我认为这只是因为它试图将一种方法应用于不再存在的变量,现在 window 已经关闭。
所以我想这是我的大问题 - 我有一个 MainWindow class,据我所知,class 之外无法更改任何内容,因为 Tk.mainloop () 是 运行ning 并且不会停止让其他代码在它之后 运行,例如 itemconfig。我该如何改变这些变量?实例变量声明之后的代码似乎 运行 直到 MainWindow() 关闭。
mainloop
之后的代码不是 运行,你是对的。确实如此,但只有在 GUI 被销毁之后。 Tkinter 旨在调用 mainloop
成为最后(或几乎最后)行可执行代码。一旦被调用,所有其他工作都必须作为对事件的反应来完成。这就是 GUI 编程的本质。
"how do I go about changing the variables" 的答案很简单:在调用 mainloop
之前执行此操作,或者响应某个事件执行此操作。例如,在按钮的回调中执行,在绑定到事件的函数中执行,或通过 after
绑定到基于时间的事件,等等。
现在我理解了实例变量和 classes 的概念,我以前从来没有遇到过它们的问题,而且我经常使用它们。但是,当我创建主窗口 class 时,一切都很顺利,直到我尝试访问实例变量。
http://pastebin.com/tDs5EJhi 是完整的代码,但此时它只是放置标签和框架等等,没有实际的逻辑在进行。 window 看起来不错,没有什么不好的事情发生。
我的问题是当我尝试从外部更改 window 内部的内容时。我想我可以像往常一样创建 class 的实例并从那里更改变量(即 instancevariable.ImageCanvas.itemconfig()),但 Tkinter 对此并不友好,我认为这是一个结果Tkinter 的 mainloop().
这是我在使用 class 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
这就是我学会如何编辑实例变量的方式。当 window 弹出时,itemconfig 命令实际上并没有像它在 class 中那样应用(或者它可能应用了但 window 只是没有更新?)和关闭 window 后出现此错误:
_tkinter.TclError: invalid command name
我认为这只是因为它试图将一种方法应用于不再存在的变量,现在 window 已经关闭。
所以我想这是我的大问题 - 我有一个 MainWindow class,据我所知,class 之外无法更改任何内容,因为 Tk.mainloop () 是 运行ning 并且不会停止让其他代码在它之后 运行,例如 itemconfig。我该如何改变这些变量?实例变量声明之后的代码似乎 运行 直到 MainWindow() 关闭。
mainloop
之后的代码不是 运行,你是对的。确实如此,但只有在 GUI 被销毁之后。 Tkinter 旨在调用 mainloop
成为最后(或几乎最后)行可执行代码。一旦被调用,所有其他工作都必须作为对事件的反应来完成。这就是 GUI 编程的本质。
"how do I go about changing the variables" 的答案很简单:在调用 mainloop
之前执行此操作,或者响应某个事件执行此操作。例如,在按钮的回调中执行,在绑定到事件的函数中执行,或通过 after
绑定到基于时间的事件,等等。