Python 更改Tkinter GUI变量
我需要帮助更改Tkinter GUI中的变量。 我有一个基本脚本,但有一个错误:缺少1个必需的位置参数 以下是脚本:Python 更改Tkinter GUI变量,python,tkinter,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
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会出现错误。这个常见问题源于函数和函数返回的值之间的差异。一个
tkinter
小部件的命令
参数需要传递一个函数,就像您在代码中所做的那样。但是,要使用的函数需要一个参数。如果只需使用命令
参数中的参数调用该函数:
b1 = Button(root, text="1", command=b1_s(1))
按钮
将失败,因为命令
将是None
,是b1_s(1)
函数的返回值,您不能调用None
,因为它不是函数。所以,我们要解决的是使用一个叫做lambda
函数的函数,这是一种定义内联函数的方法。这给了我们这样的东西:
b1 = Button(root, text="1", command=lambda: b1_s(1))
这给了我们期望的输出。然而,我们可以做得更多。因为我们现在可以将参数传递给函数,所以在这种情况下我们甚至不需要单独的函数
您使用Label
s的方式也存在问题。首先,您应该在同一条语句中创建一个标签和pack()
它,否则就无法将该小部件保存到引用中—您无论如何都没有这样做,这使得使用这些标签很困难。在一条语句中保存标签
,在另一条语句中保存pack()
标签。接下来,如果希望函数能够使用在函数外部指定的引用,则需要将该引用作为参数传入
这将导致以下代码,当用户按下按钮时,会将该按钮的编号打印到控制台,并在GUI窗口中显示该编号
from tkinter import *
root = Tk()
def fav_num(label, num_picked):
print ("So your favourite number is", str(num_picked))
label.config(text=str(num_picked))
title_label = Label(root, text='What is your favourite number?')
title_label.pack()
mylabel = Label(root, text='')
mylabel.pack()
b1 = Button(root, text="1", command=lambda: fav_num(mylabel, 1))
b1.pack()
b2 = Button(root, text="2", command=lambda: fav_num(mylabel, 2))
b2.pack()
b3 = Button(root, text="3", command=lambda: fav_num(mylabel, 3))
b3.pack()
mainloop()
root.mainloop()
问题的哪一部分需要帮助?很明显,你的函数接受了参数,而且按钮没有传递参数。您是想知道如何传递参数,还是想编写不需要参数的函数?您好,您遇到了什么错误?你能将错误消息添加到帖子中吗?按钮的命令不会传递参数,你的三个函数都需要一个参数,因此当调用它们时,它们会丢失一个必需的参数,就像错误消息告诉你的那样。只需从函数定义中删除num\u picked
,它们就没有理由存在。请注意,更改num picked
变量不会自动更新标签,您必须使用小部件进行此操作。configure(text=…)
或使用StringVar或IntVar作为标签的文本变量。感谢您的帮助。我现在明白了。谢谢你的帮助