Python Tkinter:如何在更改类中避免全局变量?

时间:2015-07-31 08:43:25

标签: 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()

2 个答案:

答案 0 :(得分:1)

像这样:

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 :(得分:0)

我做了一些改变:

  1. 创建一个新类NumberBoxesList以避免全局变量并使程序的逻辑更加可见
  2. 删除from zope import schema from zope.schema.vocabulary import SimpleVocabulary emailVocab = SimpleVocabulary.fromItems(( ('sysn', u'System notifications (strongly recommended)'), ('mark', u'Marketing emails'), ('offe', u'Special offers'))) ... email_optin = schema.List( title = u'', description = u'', required = False, value_type = schema.Choice(source=emailVocab)) 方法:此方法不应在用户操作后立即用于更新
  3. 使用root.afterimport tkinter as tk是不好的做法
  4. 结果:

    import *