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

我希望在按下按钮后执行我的功能。但是当我运行程序时,按钮会在我单击它们之前调用所有按钮的函数。当我按下按钮时,在我的输出显示后,所有按钮都不起作用。


程序中的其余按钮以相同的方式正常工作。


#all the buttons calling the same function buttonEntry(num) with different parameters


button1 = 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 pressed

def buttonEntry(num):

    n=num

    print(n)

我希望按下按钮 1 时显示 1,按下按钮 2 时显示 2,所以,继续。但是当我运行程序时,所有按钮都会同时运行它们的命令并显示如下输出:


1

2

3

4

5

6

7

8

9

0


Process finished with exit code 0

之后按下的按钮不显示任何内容。


牧羊人nacy
浏览 451回答 3
3回答

慕田峪9158850

您实际上并没有将函数作为回调传递,而是传递了返回值。要解决此问题,请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"))等等。

慕沐林林

问题在于您如何为每个按钮设置命令:command=buttonEntry("1")因为buttonEntry是一个函数,所以在此时调用它,打印数字并分配None给命令。command在这里也期待一个可调用的。您需要做的是创建一个工厂来创建返回预期值的函数,然后更新您的Button设置:def buttonEntryFactory(num):    def buttonEntry():        print num    return buttonEntrybutton1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=buttonEntryFactory("1"))现在,当您定义按钮时,它会为它创建一个buttonEntry带有正确值的特定函数,并将该函数分配给command。当您单击按钮时,它将按预期调用该函数。总结:command期望得到一个函数(或可调用的)作为参数,所以如果你想为命令添加自定义参数,你需要使用工厂来创建一个包含这些参数的函数。(另一种选择是使用lambda,但我发现工厂方法更简洁)。

临摹微笑

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如果您想了解更多有关其工作原理的信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python