Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改Tkinter GUI变量_Python_Tkinter - Fatal编程技术网

Python 更改Tkinter GUI变量

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

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

这个常见问题源于函数和函数返回的值之间的差异。一个
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作为标签的文本变量。感谢您的帮助。我现在明白了。谢谢你的帮助