更改Tkinter GUI变量

时间:2015-04-18 16:48:20

标签: python tkinter

我需要帮助更改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会出现错误。

1 个答案:

答案 0 :(得分:0)

这个常见问题源于函数与函数返回的值之间的差异。一个tkinter小部件的command参数需要传递一个函数,就像在代码中一样。但是,您要使用的函数需要参数。如果您只是使用command参数中的参数调用该函数:

b1 = Button(root, text="1", command=b1_s(1))

Button会失败,因为command将是Noneb1_s(1)函数的返回值,而您无法调用{{ 1}}因为它不是一个功能。因此,我们要做的就是使用一种称为None函数的东西,这是一种定义内联函数的方法。这给了我们这样的东西:

lambda

这为我们提供了我们期望的输出。但是,我们可以做更多的事情。由于我们现在能够将参数传递给函数,因此在这种情况下我们甚至不需要单独的函数。

您与b1 = Button(root, text="1", command=lambda: b1_s(1)) 的合作方式也存在问题。首先,您应该在同一个语句中创建LabelLabel,否则就无法将该小部件保存到引用中 - 无论如何您都不会这样做,这使得很难与那些pack()合作。将Label保存在一个语句中,将Label保存在另一个语句中。接下来,如果您希望函数能够使用在函数外部分配的引用,则需要将该引用作为参数传递。

这导致以下代码,当用户按下按钮时,将该按钮的编号打印到控制台并在GUI窗口中显示该编号。

pack()