Python Tkinter : How do I avoid global variables in a changing class?

标签 python class variables tkinter global

我目前正在做一个大型项目,以帮助我学习我的第一种编程语言(Python),但我遇到了一些未知的领域。我知道使用全局变量通常不好,并且有更好的解决方案,但我无法弄清楚我的情况。

我编写了下面的代码作为我想要实现的目标的简单示例。除了使用全局变量之外,最好的方法是什么?

此外,我在下面的代码中是否犯了任何一般错误?

提前致谢

from tkinter import *

root = Tk()

display_number = 5


class NumberBox():
    def __init__(self):
        global display_number
        self.number_label = Label(root, text=display_number)
        self.number_label.pack()
        self.engine()

    def engine(self):
        self.number_label.config(text=display_number)
        root.after(10, self.engine)


def change_number(operation):
    global display_number
    if operation == "add":
        display_number += 1
    if operation == "subtract":
        display_number -= 1

Button(root, text="Add Class", command=lambda: NumberBox()).pack()
Button(root, text="Number UP", command=lambda: change_number("add")).pack()
Button(root, text="Number DOWN", command=lambda: change_number("subtract")).pack()

for _ in range(5):
    NumberBox()

root.mainloop()

最佳答案

我做了一些更改:

  1. 创建一个新类NumberBoxesList以避免全局变量并使程序逻辑更加可见
  2. 删除 root.after 方法:此方法不应用于在用户操作后立即进行更新
  3. 使用import tkinter as tk:import *是不好的做法

结果:

import tkinter as tk

class NumberBox():
    def __init__(self, root,  display_number):
        self.number_label = tk.Label(root, text=display_number)
        self.number_label.pack()

    def changeNumber(self, display_number):
        self.number_label.config(text=display_number)

class NumberBoxesList():    
    def __init__(self, root,  start_number = 5):
        self.number = start_number
        self.root = root
        self.boxes = []
        tk.Button(root, text="Add Class", command= self.addBox).pack()
        tk.Button(root, text="Number UP", command=lambda: self.change_number("add")).pack()
        tk.Button(root, text="Number DOWN", command=lambda: self.change_number("subtract")).pack()

    def addBox(self):
        self.boxes.append(NumberBox(self.root,  self.number))

    def change_number(self,  operation):
        if operation == "add":
            self.number += 1
        if operation == "subtract":
            self.number -= 1
        for box in self.boxes:
            box.changeNumber(self.number)

root = tk.Tk()
boxList = NumberBoxesList(root)

for _ in range(5):
    boxList.addBox()

root.mainloop()

关于Python Tkinter : How do I avoid global variables in a changing class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31741819/

相关文章:

python - 无法比较类型 'ndarray(dtype=int64)' 和 'int64'

php - 如何在 php 中取消设置命名空间以访问全局类

python - 仅使用字母的名称输入验证

bash - shell脚本变量使用

python - 从 IronPython Access MS Access 时出现问题

python - 从同一父目录中的不同文件夹导入模块时出错

python - 如何在 Jupyter Notebook 上迭代绘制图形

java - 在抽象类中初始化最终变量 (Java)

javascript - JavaScript 类实例是否克隆函数?

python - 为什么我不能在 python 中更改另一个模块变量?