使用按钮命令的Python Tkinter错误

时间:2017-11-18 07:39:31

标签: python python-2.7 tkinter

您好我正在尝试使用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()

然而,问题是屏幕只附加/每当我点击任何按钮并最终导致//////////////

enter image description here

/是内容列表的最后一个元素,我想

有问题
command=lambda : self.txtDisplay.insert(END, Contents[i])

我可以解释为什么会发生这种情况以及如何处理它吗?

1 个答案:

答案 0 :(得分:1)

lambda循环中for的问题非常严重。你可以找到很多答案。

lambda在您创建按钮时不使用i的值,但是当您按下按钮时 - 所有按钮都使用相同的值i指向最后一个按钮。

您必须为i中的参数指定lambda,并在创建按钮时从i复制值

command=lambda x=i: self.txtDisplay.insert(END, Contents[x])