Python tkinter mainloop负责吗?从逻辑中分离UI
我仍在试图找出如何将UI与程序逻辑分开。我是Python新手,也许你可以帮我 我试图将我的UI从程序中分离出来,希望以后能够从tkinter切换到其他GUI。所以我想让我的主程序做一些事情,并调用一个tk框架来显示我的数据 这是我的展示课,效果很好:Python tkinter mainloop负责吗?从逻辑中分离UI,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我仍在试图找出如何将UI与程序逻辑分开。我是Python新手,也许你可以帮我 我试图将我的UI从程序中分离出来,希望以后能够从tkinter切换到其他GUI。所以我想让我的主程序做一些事情,并调用一个tk框架来显示我的数据 这是我的展示课,效果很好: import tkinter as tk class TestClass(tk.Frame): def __init__(self, master=None): super().__init__(master)
import tkinter as tk
class TestClass(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.label1 = tk.Label(text="Label1")
self.label1.pack()
self.changeLabel1("change from within") # <-- this works
def changeLabel1(self, changeText):
self.label1.config(text=changeText)
self.update_idletasks()
def writeSomething(self, outputText):
print(outputText)
(实际上更长,只是回溯的最后一行。)
搜索使我得出结论,它可能与mainloop()有关,但我不确定如何处理这个问题
什么是最佳实践?我是在tkinter类中调用mainloop,还是在调用tkinter类的测试文件中调用mainloop
这是一种分离UI和逻辑的方法,还是我有什么地方出错了,应该用另一种方法(从UI类中调用程序逻辑)
我希望我已经说得够清楚了…在典型的GUI中,主循环负责处理用户事件(通过将它们发送到事件处理程序回调)。在您的代码段中,调用
x.mainloop()
后的代码仅在主窗口关闭且循环退出时执行
是的,显而易见的答案是UI代码(事件处理程序回调)负责调用“逻辑”代码(最好称为“域模型”代码-UI中也有一些“逻辑”)-当您考虑它时,这一点最为明显:您的域模型代码应该对UI一无所知,因此您可以将其用于不同的UI(GUI、基于文本的、web、命令行脚本等)
如果您希望您的UI根据域模型层中发生的事情(这是任何非平凡GUI应用程序的常见要求)进行自我更新,那么最好的选择是模式(真实的东西,而不是web衍生产品),其中“模型”是您的域模型(或其周围的一些包装器),“控制器”是您的事件处理程序回调,“视图”是您的UI组件(或它们周围的包装器)。这里的关键是使用它,让UI订阅模型发送的事件 在典型的GUI中,主循环负责处理用户事件(通过将它们分派给事件处理程序回调)。在您的代码段中,调用
x.mainloop()
后的代码仅在主窗口关闭且循环退出时执行
是的,显而易见的答案是UI代码(事件处理程序回调)负责调用“逻辑”代码(最好称为“域模型”代码-UI中也有一些“逻辑”)-当您考虑它时,这一点最为明显:您的域模型代码应该对UI一无所知,因此您可以将其用于不同的UI(GUI、基于文本的、web、命令行脚本等)
如果您希望您的UI根据域模型层中发生的事情(这是任何非平凡GUI应用程序的常见要求)进行自我更新,那么最好的选择是模式(真实的东西,而不是web衍生产品),其中“模型”是您的域模型(或其周围的一些包装器),“控制器”是您的事件处理程序回调,“视图”是您的UI组件(或它们周围的包装器)。这里的关键是使用它,让UI订阅模型发送的事件 将
x.mainloop()
放在程序的最末尾。好的,对不起,我应该说明我将这两个调用放在我的UI类的函数中,以表明在调用mainloop之后我无法更改标签。将x.mainloop()
放在程序的最末尾。好的,对不起,我应该清楚地表明,我将这两个调用放在我的UI类的函数中,以表明在调用mainloop之后,我不能对我的标签进行更改。谢谢!我想这就是职业选手和业余选手的区别;)非常感谢。我想这就是职业选手和业余选手的区别;)
# starter for TestClass
import TestClass
x = TestClass.TestClass()
x.mainloop()
x.writeSomething("Test") <-- nothing happens
x.changeLabel1("Test") <-- nothing happens
_tkinter.TclError: invalid command name ".!label"