Tkinter中的Python计算器 - 函数自动运行

时间:2013-01-17 15:30:51

标签: python tkinter

我正在使用Tkinter在Python 2.7.3中制作图形计算器。我已经设置好了,所以当用户按下“b”按钮时,它会将'b'打印到控制台。我这样做是通过创建一个函数来传递一个名为'key'的变量,然后将其添加到标签中。但是,当我第一次启动程序时,它会自动调用该函数并将'b'打印到控制台。每当我点击按钮时,它什么都不做。这是我的代码:

from Tkinter import *

class Application(Frame):
    def addkey(self,key):
        print str(key)

    def removekey(self):
        if len(self.displaytext) > 0:
            self.displaytext = self.displaytext[0:-1]

    def createWidgets(self):
        self.maxlength = 20
        self.displaytext = ""

        self.frame1 = Frame(self)
        self.display = Label(self.frame1,textvariable=self.displaytext,width=self.maxlength+3,bg="black",fg="white",height=2)
        self.frame1.pack()
        self.display.pack()

        self.frame2 = Frame(self)
        self.bksp = Button(self.frame2,text="b",width=4,height=2,command=self.addkey("b"))
        self.frame2.pack()
        self.bksp.pack()


    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

app = Application()
app.mainloop()

try:
    root.destroy()
except:
    pass

2 个答案:

答案 0 :(得分:2)

command = ...期望传递函数(接受0个参数)。实际上,您传递的是函数的结果(在这种情况下为None)。

一种简单的方法是使用anonymous function来包裹你的函数并适当地调用它:

command=lambda: self.addkey("b")

或者你可以更详细地说:

def button_func():
    return self.addkey("b")
self.bksp = Button(self.frame2,text="b",width=4,height=2,command=button_func)

但如果您有15个按钮,每个按钮调用相同的基础函数,但参数略有不同,则会开始变得非常冗长。

答案 1 :(得分:1)

您正在调用self.addkey并将其结果分配给command参数。相反,您需要传递一个可以调用的函数。

换句话说,改变

command=self.addkey("b")

command=lambda: self.addkey("b")

如果self.addkey不需要任何其他参数,您可以command=self.addkey,但由于情况并非如此,您需要lambda