3 回答
TA贡献1794条经验 获得超7个赞
您实际上并没有将函数作为回调传递,而是传递了返回值。要解决此问题,请lambda:在所有内容之前添加:
button1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=lambda: buttonEntry("1"))
button2 = Button(frame_bottom, text="2", width="20", height="6", bg=buttonColor, command=lambda: buttonEntry("2"))
等等。
TA贡献2016条经验 获得超9个赞
问题在于您如何为每个按钮设置命令:
command=buttonEntry("1")
因为buttonEntry是一个函数,所以在此时调用它,打印数字并分配None给命令。
command在这里也期待一个可调用的。您需要做的是创建一个工厂来创建返回预期值的函数,然后更新您的Button设置:
def buttonEntryFactory(num):
def buttonEntry():
print num
return buttonEntry
button1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=buttonEntryFactory("1"))
现在,当您定义按钮时,它会为它创建一个buttonEntry带有正确值的特定函数,并将该函数分配给command。当您单击按钮时,它将按预期调用该函数。
总结:command期望得到一个函数(或可调用的)作为参数,所以如果你想为命令添加自定义参数,你需要使用工厂来创建一个包含这些参数的函数。(另一种选择是使用lambda,但我发现工厂方法更简洁)。
TA贡献1982条经验 获得超2个赞
Button 小部件将回调函数作为其最后一个参数,该函数将在单击按钮时调用。但是,您传入的是buttonEntry("1")
,即None
,因为调用这样的buttonEntry
函数将设置一个名为n
be的局部变量num
,然后打印num
,但不返回任何内容,即None
.
如果您希望在单击按钮时调用该函数,则需要传递函数本身,而不是结果:
button1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=buttonEntry)
当然,那样的话,回调就不会知道哪个按钮被调用了,因为它们都会调用buttonEntry()
. 因此,您可以创建一个将被调用的 lambda 函数,然后buttonEntry
使用正确的值调用该函数,而不是直接将函数作为回调提供:
button1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=lambda: buttonEntry("1"))
阅读有关函数、返回值的更多信息,以及lambda
如果您想了解更多有关其工作原理的信息。
添加回答
举报