我知道有很多关于tkinter的问题,但我看了很多问题,但似乎没有一个能帮助我。
import tkinter
class Calculator:
def __init__(self):
window = tkinter.Tk()
window.geometry("200x300")
window.title("Calculator")
lbl = tkinter.Label(window, text="placeholder", bg="blue", textvariable="labelText")
lbl.grid(row=0, column=0, columnspan=3)
self.firstNumArray = []
self.secondNumArray = []
self.operation = ""
self.currentNum = "first"
def appendNumber(self, number):
print("Appending Number")
if self.currentNum == "first":
self.firstNumArray.append(number)
print("".join(str(x) for x in self.firstNumArray))
lbl.config(text="".join(str(x) for x in self.firstNumArray))
window.update()
else:
self.secondNumArray.append(number)
for i in range(1,4):
string = "Creating button at ({0},{1})".format(0,i)
print(string)
button = tkinter.Button(text=i, command=lambda: appendNumber(self, i))
button.grid(row=1, column=i-1)
for i in range(1,4):
string = "Creating button at ({0},{1})".format(1,i)
print(string)
button = tkinter.Button(text=i+3, command=lambda: appendNumber(self, i+3))
button.grid(row=2, column=i-1)
for i in range(1,4):
string = "Creating button at ({0},{1})".format(2,i)
print(string)
button = tkinter.Button(text=i+6, command=lambda: appendNumber(self, i+6))
button.grid(row=3, column=i-1)
div = tkinter.Button(text="/")
mult = tkinter.Button(text="*")
add = tkinter.Button(text="+")
sub = tkinter.Button(text="-")
add.grid(row=1, column=3)
sub.grid(row=2, column=3)
mult.grid(row=3, column=3)
div.grid(row=4, column=3)
button = tkinter.Button(text="0")
button.grid(row=4, column=1)
window.mainloop()
calc = Calculator()
当我启动程序时,窗口打开。当我单击按钮时,标签中的文本不会更改。我尝试使用StringVar
作为textvariable
,然后调用set()
函数,但这也不起作用。我认为这与功能的范围有关。我必须将appendNumber()
函数放在__init__()
中,因为出于某种原因,self.lbl = tkinter.Label()
根本没有弹出任何内容。
答案 0 :(得分:1)
您的代码存在一些问题。
labelText
当然应该是StringVar
而不是字符串......
labelText = tkinter.StringVar()
lbl = tkinter.Label(window, bg="blue", textvariable=labelText)
lbl.grid(row=0, column=0, columnspan=3)
现在您可以使用labelText.set
更新文本。此外,无需self
参数或window.update
def appendNumber(number):
if self.currentNum == "first":
self.firstNumArray.append(number)
labelText.set("".join(str(x) for x in self.firstNumArray))
else:
self.secondNumArray.append(number)
您可以使用//
(整数(!)除法)和%
(模数)运算将所有按钮放在一个循环中。此外,请注意,lambda
中的变量在调用函数时进行评估,而不是在声明函数时进行评估,即所有lambdas
将使用i
的最后一个值({{ 1}}在这种情况下) - 见例如here。作为补救措施,请使用9
。
lambda n=i+1: appendNumber(n)
不是真正的问题,但由于您不需要对这些按钮的引用,您可以使代码更紧凑(对其他代码也一样):
for i in range(9):
btn = tkinter.Button(text=i+1, command=lambda n=i+1: appendNumber(n))
btn.grid(row=i//3+1, column=i%3)