0

我正在使用 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
4

2 回答 2

2

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

一种简单的方法是使用匿名函数来包装您的函数并适当地调用它:

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 个按钮,每个按钮调用相同的底层函数,参数略有不同,这就开始变得非常冗长。

于 2013-01-17T15:34:29.810 回答
1

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

换句话说,改变

command=self.addkey("b")

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

如果self.addkey不需要任何额外的参数,你可以这样做command=self.addkey,但因为情况并非如此,你需要lambda.

于 2013-01-17T15:33:01.657 回答