我需要帮助更改Tkinter GUI中的变量。 我有一个基本脚本,但有一个错误:缺少1个必需的位置参数
这是脚本:
from tkinter import *
num_picked = ""
root = Tk()
Label(root, text='What is your favourite number?').pack()
def b1_s(num_picked):
print ("So your favourite number is 1")
num_picked = 1
def b2_s(num_picked):
print ("So your favourite number is 2")
num_picked = 2
def b3_s(num_picked):
print ("So your favourite number is 3")
num_picked = 3
Label(root, text= num_picked).pack()
b1 = Button(root, text="1", command=b1_s)
b1.pack()
b2 = Button(root, text="2", command=b2_s)
b2.pack()
b3 = Button(root, text="3", command=b3_s)
b3.pack()
mainloop()
root.mainloop()
但是当我单击运行中的按钮时,空闲的python shell会出现错误。
答案 0 :(得分:0)
这个常见问题源于函数与函数返回的值之间的差异。一个tkinter
小部件的command
参数需要传递一个函数,就像在代码中一样。但是,您要使用的函数需要参数。如果您只是使用command
参数中的参数调用该函数:
b1 = Button(root, text="1", command=b1_s(1))
Button
会失败,因为command
将是None
,b1_s(1)
函数的返回值,而您无法调用{{ 1}}因为它不是一个功能。因此,我们要做的就是使用一种称为None
函数的东西,这是一种定义内联函数的方法。这给了我们这样的东西:
lambda
这为我们提供了我们期望的输出。但是,我们可以做更多的事情。由于我们现在能够将参数传递给函数,因此在这种情况下我们甚至不需要单独的函数。
您与b1 = Button(root, text="1", command=lambda: b1_s(1))
的合作方式也存在问题。首先,您应该在同一个语句中创建Label
和Label
,否则就无法将该小部件保存到引用中 - 无论如何您都不会这样做,这使得很难与那些pack()
合作。将Label
保存在一个语句中,将Label
保存在另一个语句中。接下来,如果您希望函数能够使用在函数外部分配的引用,则需要将该引用作为参数传递。
这导致以下代码,当用户按下按钮时,将该按钮的编号打印到控制台并在GUI窗口中显示该编号。
pack()