为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的按钮会在我点击之前调用一个函数?

为什么我的按钮会在我点击之前调用一个函数?

牧羊人nacy 2021-10-19 10:37:47
我希望在按下按钮后执行我的功能。但是当我运行程序时,按钮会在我单击它们之前调用所有按钮的函数。当我按下按钮时,在我的输出显示后,所有按钮都不起作用。程序中的其余按钮以相同的方式正常工作。#all the buttons calling the same function buttonEntry(num) with different parametersbutton1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=buttonEntry("1"))button2 = Button(frame_bottom, text="2", width="20", height="6", bg=buttonColor, command=buttonEntry("2"))button3 = Button(frame_bottom, text="3", width="20", height="6", bg=buttonColor, command=buttonEntry("3"))button4 = Button(frame_bottom, text="4", width="20", height="6", bg=buttonColor, command=buttonEntry("4"))button5 = Button(frame_bottom, text="5", width="20", height="6", bg=buttonColor, command=buttonEntry("5"))button6 = Button(frame_bottom, text="6", width="20", height="6", bg=buttonColor, command=buttonEntry("6"))button7 = Button(frame_bottom, text="7", width="20", height="6", bg=buttonColor, command=buttonEntry("7"))button8 = Button(frame_bottom, text="8", width="20", height="6", bg=buttonColor, command=buttonEntry("8"))button9 = Button(frame_bottom, text="9", width="20", height="6", bg=buttonColor, command=buttonEntry("9"))button0 = Button(frame_bottom, text="0", width="20", height="6", bg=buttonColor, command=buttonEntry("0"))#function which doesn't execute when button is presseddef buttonEntry(num):    n=num    print(n)我希望按下按钮 1 时显示 1,按下按钮 2 时显示 2,所以,继续。但是当我运行程序时,所有按钮都会同时运行它们的命令并显示如下输出:1234567890Process finished with exit code 0之后按下的按钮不显示任何内容。
查看完整描述

3 回答

?
慕田峪9158850

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"))

等等。


查看完整回答
反对 回复 2021-10-19
?
慕沐林林

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,但我发现工厂方法更简洁)。


查看完整回答
反对 回复 2021-10-19
?
临摹微笑

TA贡献1982条经验 获得超2个赞

Button 小部件将回调函数作为其最后一个参数,该函数将在单击按钮时调用。但是,您传入的是buttonEntry("1"),即None,因为调用这样的buttonEntry函数将设置一个名为nbe的局部变量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如果您想了解更多有关其工作原理的信息。


查看完整回答
反对 回复 2021-10-19
  • 3 回答
  • 0 关注
  • 450 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信