Python Tkinter: How do I avoid global variables in a changing class?
I made several changes:
- Create a new class NumberBoxesList to avoid global variables and make program's logic more visible
- Remove
root.after
method: this method should not be used for updates immediately following user's actions - Use
import tkinter as tk
:import *
is bad practice
Result:
import tkinter as tkclass 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()
like this:
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 -= 1Button(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()
by defining the variable in the class (but outside the __init__
it becomes owned by all instances of the class as a single variable, so changing it in one affects all instances