【问题标题】:Python 3 and Tkinter. Too many global variablesPython 3 和 Tkinter。全局变量太多
【发布时间】:2016-10-31 23:08:41
【问题描述】:

我开始使用 Tkinter 库在 Python 中编写一个简单的 GUI 应用程序。 一切正常,但是,要动态更改任何小部件(例如,从“登录”到“注销”的按钮等),我必须从外部获取包含小部件对象本身的变量。 我可以通过两种方式做到这一点:

  1. 将小部件作为参数传递;
  2. 使用全局变量。

一个简化的例子:

1) 作为参数传递:

def changeLabel(b):
    b.config(text='Logout')

btn1 = Button(f0,text="Login",width=15)
btn1.grid(row=1,column=2,rowspan=1,padx=10,ipadx=10)
changeLabel(btn1)

2) 或者使用全局变量:

def changeLabel():
    global btn1
    btn1.config(text='Logout')

btn1 = Button(f0,text="Login",width=15)
btn1.grid(row=1,column=2,rowspan=1,padx=10,ipadx=10)
changeLabel(btn1)

现在,我知道应该避免全局变量,但是通过许多函数将每个小部件作为参数传递,即使在简单的应用程序中,这也是一团糟。

那么,在运行时操作 Tkinter 小部件的最佳方法是什么?你能建议我正确的方法吗? 谢谢

【问题讨论】:

  • 难道你就不能完全没有changeLabel 函数,而是将btn1.config(text="Logout") 内联吗?顺便说一句,方法#2 中不需要global 语句,因为您没有为btn1 分配任何东西。
  • 第三种选择是使用类,其中小部件是类的一个属性。
  • 我的示例是自愿简化的,在我的应用程序中,我需要: - 隐藏一个按钮并显示另一个 - 每次点击更改文本 - 隐藏/显示框架 - 等等...
  • @Kevin:我会说调用函数是最佳实践。像这样的内联代码会使程序随着时间的推移更难维护。
  • 顺便说一句,您已经将 130 多个名称导入到全局命名空间中,因为您使用了 from tkinter import *。最好是import tkinter as tk

标签: python python-3.x tkinter


【解决方案1】:

在运行时操作 tkinter 小部件的最佳方式是将这些小部件存储为类的属性。

例如:

class Example(...):
    def create_widgets(self):
        ...
        self.btn1 = Button(...)
        ...
    def changeLabel(self):
        self.bt1.config(...)

欲了解更多信息,请参阅Best way to structure a tkinter application

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 2022-12-20
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2018-10-26
    相关资源
    最近更新 更多