为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Tkinter 时如何从 GUI 中分离数据

使用 Tkinter 时如何从 GUI 中分离数据

潇湘沐 2023-06-13 14:47:45
我对使用 Tkinter 进行设计的正确方法感到困惑。我已经阅读了数十个 Tkinter 示例,但由于它们中的大多数都描述了简单和具体的案例,所以我在为我的脚本找到正确的全局设计时遇到了麻烦。我正在尝试尽可能多地将 GUI 代码与数据模型分开(我正在开发一个非常简单的纸牌游戏)。我的主要问题是如何从不同的函数和类全局访问 Tkinter 元素。目前,我正在一个大型 gui_build() 函数中构建整个界面,就在我的数据类定义之后。从 main() 函数调用此函数以及所有数据初始化内容。问题是,即使我从 gui_build() 返回 Tk 根对象以便 main() 可以传递它,我在需要时也无法访问 Tk 元素。例如,我有几个回调函数用于全局范围内的不同 Tk 按钮。如果其中一个需要检查单选按钮的状态,显然不可能通过名称在 Tk 根层次结构中找到它,并且到处传递对单选按钮的引用似乎非常不雅。我可以通过全局声明单选按钮来使其工作,但这违背了将所有 GUI 代码保存在同一位置的目的。在尝试重新发明轮子之前想知道什么可以被视为“最佳实践”。
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我制作 Tkinter 界面已有 2 年了,现在。我最初面临同样的问题。根据我的经验,我建议您定义一个继承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()


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信