Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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时如何将数据与GUI分离_Python_User Interface_Tkinter - Fatal编程技术网

Python 使用Tkinter时如何将数据与GUI分离

Python 使用Tkinter时如何将数据与GUI分离,python,user-interface,tkinter,Python,User Interface,Tkinter,用Tkinter进行设计的正确方法让我有些困惑。我读过几十个Tkinter示例,但由于大多数都描述了简单而具体的案例,因此我很难为我的脚本找到正确的全局设计。我正在尝试尽可能多地将GUI代码与数据模型分离(我正在开发一个非常简单的纸牌游戏) 我的主要问题是如何从不同的函数和类全局访问Tkinter元素。目前,我正在一个大型gui_build()函数中构建整个界面,就在我的数据类定义之后。此函数是从main()函数以及所有数据初始化内容调用的。问题是,即使我从gui_build()返回Tk根对象以

用Tkinter进行设计的正确方法让我有些困惑。我读过几十个Tkinter示例,但由于大多数都描述了简单而具体的案例,因此我很难为我的脚本找到正确的全局设计。我正在尝试尽可能多地将GUI代码与数据模型分离(我正在开发一个非常简单的纸牌游戏)

我的主要问题是如何从不同的函数和类全局访问Tkinter元素。目前,我正在一个大型gui_build()函数中构建整个界面,就在我的数据类定义之后。此函数是从main()函数以及所有数据初始化内容调用的。问题是,即使我从gui_build()返回Tk根对象以便main()可以传递它,在需要时访问Tk元素也会遇到问题

例如,我有几个回调函数用于全局范围内的不同Tk按钮。如果其中一个需要检查单选按钮的状态,那么显然不可能在Tk根层次结构中按名称找到它,并且到处传递对单选按钮的引用似乎非常不雅观

我可以通过在全球范围内声明单选按钮来实现这一点,但这会破坏将所有GUI代码保持在同一位置的目的

在尝试重新发明轮子之前,想知道什么是“最佳实践”


谢谢。

我已经制作Tkinter接口两年了,现在。起初我也面临同样的问题。根据我的经验,我建议您定义一个继承Tk根小部件的类,然后将元素小部件指定为该类的属性,并将回调函数指定为该类的函数。这将使访问全局小部件(按钮)和功能变得容易。这些小部件和函数在类定义中是全局的。这使它们易于访问。您可以遵循以下模板

from tkinter import *

class Interface(Tk):
    def __init__(self, title):
        Tk.__init__(self)
        self.title(title)
        self.build()
    
    def build(self):
        self.UserNameLabel = Label(self, text="User Name")
        self.UserNameLabel.grid(row=0, column=0, sticky=E, pady=10)
        
        self.UserNameEntry = Entry(self)
        self.UserNameEntry.grid(row=0, column=1, sticky=W, pady=10)
        
        self.PassWordLabel = Label(self, text="Password")
        self.PassWordLabel.grid(row=1, column=0, sticky=E, pady=10)
        
        self.PassWordEntry = Entry(self, show='*')
        self.PassWordEntry.grid(row=1, column=1, sticky=W, pady=10)
        
        self.status = Label(self, text='Please enter User Name and Password')
        self.status.grid(row=2, column=0, columnspan=2, pady=10)
        
        self.LoginButton = Button(self, text='Login', width=20, command=self.checkCreadentials)
        self.LoginButton.grid(row=3, column=0, columnspan=2, pady=10)
    
    def checkCreadentials(self):
        if (self.UserNameEntry.get().strip() == 'username') and (self.PassWordEntry.get()=='password'):
            self.status['text']= 'Welcome !'
        else:
            self.status['text']= 'Invalid User Name or Password!!!'
            self.bell()
        
Interface('Login').mainloop()

我已经制作Tkinter接口两年了,现在。起初我也面临同样的问题。根据我的经验,我建议您定义一个继承Tk根小部件的类,然后将元素小部件指定为该类的属性,并将回调函数指定为该类的函数。这将使访问全局小部件(按钮)和功能变得容易。这些小部件和函数在类定义中是全局的。这使它们易于访问。您可以遵循以下模板

from tkinter import *

class Interface(Tk):
    def __init__(self, title):
        Tk.__init__(self)
        self.title(title)
        self.build()
    
    def build(self):
        self.UserNameLabel = Label(self, text="User Name")
        self.UserNameLabel.grid(row=0, column=0, sticky=E, pady=10)
        
        self.UserNameEntry = Entry(self)
        self.UserNameEntry.grid(row=0, column=1, sticky=W, pady=10)
        
        self.PassWordLabel = Label(self, text="Password")
        self.PassWordLabel.grid(row=1, column=0, sticky=E, pady=10)
        
        self.PassWordEntry = Entry(self, show='*')
        self.PassWordEntry.grid(row=1, column=1, sticky=W, pady=10)
        
        self.status = Label(self, text='Please enter User Name and Password')
        self.status.grid(row=2, column=0, columnspan=2, pady=10)
        
        self.LoginButton = Button(self, text='Login', width=20, command=self.checkCreadentials)
        self.LoginButton.grid(row=3, column=0, columnspan=2, pady=10)
    
    def checkCreadentials(self):
        if (self.UserNameEntry.get().strip() == 'username') and (self.PassWordEntry.get()=='password'):
            self.status['text']= 'Welcome !'
        else:
            self.status['text']= 'Invalid User Name or Password!!!'
            self.bell()
        
Interface('Login').mainloop()

你读过这个吗?我现在有了。现场直播,非常有趣而且很有帮助。非常感谢。你读了这个吗?我现在有了。现场直播,非常有趣而且很有帮助。非常感谢。我这样做,但我不使用通配符导入,我将其作为tk导入,而不是tk。我使用super。谢谢。这基本上是@Atlas435()提供的链接中详细介绍的想法。该讨论还提到了一个非常有价值且易于理解的文档,该文档解释了在类中构建Tk应用程序的原则:。非常适合初学者阅读。是的,我读过@Atlas435是的,我们不应该做通配符导入,以防我们使用其他模块,因为名称可能会冲突,在这里我使用它来避免编写很多tk's,我这样做,但我不使用通配符导入,我将它作为tk导入,而不是tk。uuuu init__________;(self)我使用super。_____。这基本上是@Atlas435()提供的链接中详细介绍的想法。该讨论还提到了一个非常有价值且易于理解的文档,该文档解释了在类中构建Tk应用程序的原则:。非常适合初学者阅读。是的,我读过@Atlas435是的,如果我们正在使用其他模块,我们不应该进行通配符导入,因为名称可能会冲突,这里我使用它来避免编写大量tk