您好我正在尝试使用tkinter gui和python制作简单的计算器。 但首先我尝试创建按钮,一旦点击它们,它们就会附加到屏幕上显示的结果中。 (就像现实生活中的计算器一样,如果屏幕显示12并且我点击3,则屏幕显示123)
from Tkinter import *
class Calculator(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title('Calculator')
self.pack()
self.screen=Frame(self, borderwidth=20, relief=SUNKEN)
self.screen.pack()
self.txtDisplay = Text(self.screen, width=20, height=2)
self.txtDisplay.pack()
self.screen.grid(row=0, columnspan=5) #columnspan to span multiple columns
Contents = ['1','2','3','+','4','5','6','-','7','8','9','*','C','0','=','/']
Buttons = [None]*16
j=1
count=0
for i in range(16):
Buttons[i]=Button(self, text=Contents[i], command=lambda : self.txtDisplay.insert(END, Contents[i]), height=2, width=5, borderwidth=5)
Buttons[i].grid(row=j, column=i%4)
count+=1
if count%4==0:
j+=1
count=0
Calculator().mainloop()
然而,问题是屏幕只附加/每当我点击任何按钮并最终导致//////////////
/是内容列表的最后一个元素,我想
有问题command=lambda : self.txtDisplay.insert(END, Contents[i])
我可以解释为什么会发生这种情况以及如何处理它吗?
答案 0 :(得分:1)
lambda
循环中for
的问题非常严重。你可以找到很多答案。
lambda
在您创建按钮时不使用i
的值,但是当您按下按钮时 - 所有按钮都使用相同的值i
指向最后一个按钮。
您必须为i
中的参数指定lambda
,并在创建按钮时从i
复制值
command=lambda x=i: self.txtDisplay.insert(END, Contents[x])