Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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上的变量已更改,但显示未更改_Python_Tkinter - Fatal编程技术网

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

Python 尽管tkinter上的变量已更改,但显示未更改,python,tkinter,Python,Tkinter,我想写一个程序,在用户输入文本并单击按钮后,文本成为标签,按钮文本被更改。我的代码是: # Imports import os, sys import tkinter """ Tkinter program 1 text box + button + label """ # Button Entry def enter(inputtedinfo, randvar, EnterMessage): randvar =

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

# 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()

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

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

为了执行您想要执行的操作,您必须使正在调用的函数可以访问
StringVar()
s。因此,您既可以获取条目的内容,也可以更改按钮和标签的值。为此,最好将字符串变量和小部件作为属性添加到您已经创建的顶层(
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输入(输入信息、随机变量、输入消息):
#使用.set()更新StringVar
randvar.set(inputedInfo.get())
entremessage.set(“已提交!”)
def main():
something=tkinter.Tk()
标题(“我的第一个Tkinter窗口”)
几何学(“600x400”)
randvar=tkinter.StringVar()#更改为StringVar()
EnterMessage=tkinter.StringVar(value=“Enter”)#更改为StringVar()
inputedInfo=tkinter.StringVar()
userLabel=tkinter.Label(something,textvariable=randvar)#使用textvariable代替text选项
userEntry=tkinter.Entry(something,textvariable=InputedInfo)
userButton=tkinter.Button(something,textvariable=EnterMessage,command=lambda:enter(inputedInfo,randvar,EnterMessage))
grid(行=0,列=0)
userLabel.grid(行=0,列=1)
网格(行=0,列=2)
something.mainloop()

command=enter(…)
将立即执行
enter(…)
,并将
None
分配给
命令
选项。因此,当点击按钮时,不会发生任何事情。除此之外。这不是Python变量的工作方式。
enter
中的
EnterMessage
main
中的
EnterMessage
无关。您正在传递该变量的值,但它不是指针;您不能在调用函数中更改
entremessage
的值。