我知道有很多关于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
as作为textvariable
,然后调用该set()
函数,但这也不起作用。我认为这与功能范围有关。我必须将appendNumber()
函数放置在内,__init__()
因为出于某种原因self.lbl = tkinter.Label()
根本无法弹出任何内容。
您的代码有一些问题。
labelText
当然应该是aStringVar
而不是字符串...
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
(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)
并不是真正的问题,但是由于不需要引用这些按钮,因此可以使代码更紧凑(其他代码相同):
tkinter.Button(text="/").grid(row=1, column=3)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句