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

时间:2019-01-24 04:29:56

标签: python button tkinter tkinter-entry

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

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

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

我希望在按下button1时显示1,在按下button2时显示2,等等。但是当我运行程序时,所有按钮都立即运行其命令,并显示如下输出:

1
2
3
4
5
6
7
8
9
0

Process finished with exit code 0

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

3 个答案:

答案 0 :(得分:0)

您实际上没有传递函数作为回调,而是传递了返回值。要解决此问题,请在所有内容前添加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"))

以此类推。

答案 1 :(得分:0)

Button小部件将回调函数作为其最后一个参数,单击按钮时将调用该函数。但是,您要传入int d = a; if (d > b) { d = b; } if (d > c) { d = c; } return d; ,即buttonEntry("1"),因为这样调用None函数会将名为buttonEntry的局部变量设置为n,并且然后打印num,但不返回任何内容,即num

如果您希望在单击按钮时调用该函数,则需要传递函数本身,而不是结果:

None

当然,那样的话,回调函数将不知道调用了哪个按钮,因为它们所有人都将调用button1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=buttonEntry) 。因此,您可以制作一个将被调用的lambda函数,而不是直接提供该函数作为回调,然后使用正确的值调用buttonEntry()函数:

buttonEntry

要详细了解函数,返回值和button1 = Button(frame_bottom, text="1", width="20", height="6", bg=buttonColor, command=lambda: buttonEntry("1")) ,如果您想进一步了解它的工作原理。

答案 2 :(得分:0)

问题在于如何设置每个按钮的命令:

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