避免全局变量



我做了一个简单的代码,我的问题是,如果有一种方法来避免全局变量在tkinter在这种情况下:

root = Tk()
root.title('Main')
root.minsize(400, 450)

toggle = True

def change_now():
global toggle
root.config(bg='blue') if toggle else root.config(bg='black')
toggle = not toggle
my_button = Button(root, text='Click me!', command=change_now)
my_button.pack()
root.mainloop()

我知道最好的选择是面向对象的方法,但这意味着重构整个代码,在这个例子中有一个快速的解决方案吗?我知道使用全局变量是不好的做法。

在这种情况下,有一种方法:使用tkinter变量,而不是全局变量

from tkinter import Tk, Button, BooleanVar
root = Tk()
root.title('Main')
root.minsize(400, 450)
toggle_tkinter = BooleanVar(value=True)
def change_now():
root.config(bg='blue') if toggle_tkinter.get() else root.config(bg='black')
toggle_tkinter.set(not toggle_tkinter.get())
my_button = Button(root, text='Click me!', command=change_now)
my_button.pack()
root.mainloop()

尽管如此,我个人发现了一个案例,其中全局变量做出了一个不错的设计选择(坚持在OOP不可用的假设下):想象你有30个变量,你需要传递给一个检查函数来验证输入,然后只使用这些变量的子集(或它们的混合物),这取决于用户输入。在这种情况下,而不是将所有30个变量传递给你的检查器函数,然后你的检查器函数传递任何需要的东西,我选择将它们全部设置为全局变量-这样它们就可以更容易地提取和管理;如果对这样的用例感兴趣,请参阅此处(repo包含相关的readme和描述基础架构的论文)。

您可以通过使用背景色作为布尔值来消除管理全局变量的需要。如果当前为蓝色则设置为黑色,如果当前为黑色则设置为蓝色。

def chande_now():
color = “black” if root.cget(“bg”) == “blue” else “blue”
root.configure(bg=color)

最新更新