我正在使用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
答案 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
。