繁体   English   中英

Python Tkinter:如何避免在变化的类中使用全局变量?

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

目前,我正在做一个大型项目,以帮助我学习我的第一门编程语言(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()

像这样:

from tkinter import *

root = Tk()

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

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


def change_number(operation):
    if operation == "add":
        NumberBox.display_number += 1
    if operation == "subtract":
        NumberBox.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()

通过在类中定义变量(但在__init__之外,该类将成为该类的所有实例的一个变量,因此将其更改为一个变量会影响所有实例

我做了几处更改:

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

结果:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM