尽管tkinter上的变量已更改,但显示未更改

2024-09-26 16:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个程序,在用户输入文本并单击按钮后,文本成为标签,按钮文本被更改。我的代码是:

# Imports

import os, sys

import tkinter

"""
Tkinter program 1
text box + button + label
"""


# Button Entry

def enter(inputtedinfo, randvar, EnterMessage):

    randvar = inputtedinfo.get()

    EnterMessage = "Submitted!"

# Main Function

def main():

    something = tkinter.Tk()

    something.title("My First Tkinter Window")

    something.geometry("600x400")

    randvar = ""

    EnterMessage = "Enter"

    inputtedinfo = tkinter.StringVar()

    userLabel = tkinter.Label(something, text = randvar)

    userEntry = tkinter.Entry(something, textvariable = inputtedinfo)
    
    userButton = tkinter.Button(something, text = EnterMessage, command = enter(inputtedinfo, randvar, EnterMessage))

    userEntry.grid(row=0,column=0)

    userLabel.grid(row=0,column=1)

    userButton.grid(row=0,column=2)

    something.mainloop()

    sys.exit(0)

if(__name__ == "__main__"):

    main()

用户输入可以工作,但单击按钮不会执行任何操作,尽管它应该更改按钮和标签显示的变量。我在什么地方搞砸了吗


2条回答

command参数采用函数名。如果使用参数编写完整的调用,则不是函数名,而是这个函数调用返回的内容。因此,您的按钮将无法工作。它将具有命令None

为了做你想做的事情,你必须让你正在调用的函数能够访问StringVar()。因此,您既可以获取条目的内容,也可以更改按钮和标签的值。为此,最好将字符串变量和小部件作为属性添加到您已经创建的顶层(something)。因此,它们对所有功能都可用,您可以获取和更改信息:


# Button Entry

def enter():

    something.randvar.set(something.inputtedinfo.get())

    something.userButton["text"] = "Submitted!"

# Main Function

def main():

    global something

    something = tkinter.Tk()

    something.title("My First Tkinter Window")

    something.geometry("600x400")

    something.randvar = tkinter.StringVar()

    something.randvar.set("")

    EnterMessage = "Enter"

    something.inputtedinfo = tkinter.StringVar()

    userLabel = tkinter.Label(something, textvariable = something.randvar)

    something.userEntry = tkinter.Entry(something, textvariable = something.inputtedinfo)
    
    something.userButton = tkinter.Button(something, text = EnterMessage, command = enter)

    something.userEntry.grid(row=0,column=0)

    userLabel.grid(row=0,column=1)

    something.userButton.grid(row=0,column=2)

    something.mainloop()


if(__name__ == "__main__"):

    main()

您的代码中几乎没有问题:

  • 将字符串赋值给textvariable,应改为使用StringVar
  • command=enter(...)将立即执行enter(...),然后将None分配给command选项,应改为使用lambda
  • 更新enter()内的字符串不会自动更新标签和按钮,应改为使用StirngVar上的.set()

以下是修改代码:

def enter(inputtedinfo, randvar, EnterMessage):
    # used .set() to update StringVar
    randvar.set(inputtedinfo.get())
    EnterMessage.set("Submitted!")

def main():
    something = tkinter.Tk()
    something.title("My First Tkinter Window")
    something.geometry("600x400")
    randvar = tkinter.StringVar()  # changed to StringVar()
    EnterMessage = tkinter.StringVar(value="Enter") # changed to StringVar()
    inputtedinfo = tkinter.StringVar()
    userLabel = tkinter.Label(something, textvariable=randvar) # used textvariable instead of text option
    userEntry = tkinter.Entry(something, textvariable=inputtedinfo)
    userButton = tkinter.Button(something, textvariable=EnterMessage, command=lambda: enter(inputtedinfo, randvar, EnterMessage))
    userEntry.grid(row=0,column=0)
    userLabel.grid(row=0,column=1)
    userButton.grid(row=0,column=2)
    something.mainloop()

相关问题 更多 >

    热门问题