Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter mainloop负责吗?从逻辑中分离UI_Python_Python 3.x_Tkinter - Fatal编程技术网

Python tkinter mainloop负责吗?从逻辑中分离UI

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)

我仍在试图找出如何将UI与程序逻辑分开。我是Python新手,也许你可以帮我

我试图将我的UI从程序中分离出来,希望以后能够从tkinter切换到其他GUI。所以我想让我的主程序做一些事情,并调用一个tk框架来显示我的数据

这是我的展示课,效果很好:

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"