Apr-05-2022, 04:55 AM
(This post was last modified: Apr-05-2022, 04:55 AM by deanhystad.)
There is no currentCalcInput in the global scope. There is an is Gui.__init__(), but global looks for variables in the global (module) scope, not the enclosed scope. You should either make currentCalcInput a mutable type, or pass it as an argument to the function. Here I make it mutable by putting the string in a list. buttonPress() changes the value in the list. It does not assign a new value to currentCalcInput.
from tkinter import * class Gui(Tk): def __init__(self): super().__init__() currentCalcInput = [""] def buttonPress(key): currentCalcInput[0] += key print(currentCalcInput) def generateButtons(): posOffset = (0, 0) buttonSizes = (6, 3) buttonNames = ["1", "4", "7", "Clear", "2", "5", "8", "0", "3", "6", "9", "=", "+", "-", "*", "/"] buttonNamesIndex = 0 for x in range(4): for y in range(4): Button(self, text=buttonNames[buttonNamesIndex], width=buttonSizes[0], height=buttonSizes[1], command=lambda buttonId=buttonNames[buttonNamesIndex]: buttonPress(buttonId)). \ grid(column=x + posOffset[0], row=y + posOffset[1]) buttonNamesIndex += 1 generateButtons() self.mainloop() Gui()I don't like this design pattern at all. You are using an obscure and confusing (to me) enclosing scope behavior where you should be using an instance variable and method.
import tkinter as tk class Gui(tk.Tk): def __init__(self): super().__init__() self.currentCalcInput = "" # <- Instance variable buttons = ("1", "4", "7", "Clear", "2", "5", "8", "0", "3", "6", "9", "=", "+", "-", "*", "/") for index, btn in enumerate(buttons): tk.Button(self, text=btn, width=6, height=3, command=lambda arg=btn: self.buttonPress(arg)). \ grid(row=index % 4, column=index // 4) def buttonPress(self, key): self.currentCalcInput += key # <- Instance variable print(self.currentCalcInput) Gui().mainloop()