【问题标题】:Python entry to store input into a variable stores nothing, returns initial value将输入存储到变量中的 Python 条目不存储任何内容,返回初始值
【发布时间】:2020-05-17 20:48:19
【问题描述】:

好的,基本的故事。我创建了一个条目。引入文本后,您必须单击按钮将输入的文本存储到稍后打印的变量中。 代码如下:

from Tkinter import * 

def myClick(entry_name, var):#defines function to get input from entry and store into var
   var = entry_name.get()

root = Tk()#creates initial tk

lbl1 = Label(root, text = "hello")#before entry label
lbl1.grid(row = 0, column = 0)#label griding

ent = Entry(root, width = 15)# the entry
ent.grid(row = 1, column = 0)#entry gridding

hello = None #variable to store entry input
bt1 = Button(root, command = myClick(ent, hello))#button 1 creation and function attribution
bt1.grid(row = 3, column = 0)#button 1 griding

root.mainloop()
print(hello)

我很不清楚为什么该函数没有从条目中获取输入。

【问题讨论】:

    标签: python python-3.x tkinter tkinter-entry


    【解决方案1】:
    bt1 = Button(root, command = myClick(ent, hello))
    

    在这一行中,您调用带有参数的 myClick 函数,而不仅仅是传递它。这意味着 myClick 在模块启动后执行一次,然后什么也不做。如果要打印条目输入,我建议您执行以下操作:

    from tkinter import *
    
    root = Tk()
    
    lbl1 = Label(root, text="hello")
    lbl1.grid(row=0, column=0)
    
    ent = Entry(root, width=15)
    ent.grid(row=1, column=0)
    
    
    def myClick():
        var = ent.get()
        print(var)
    
    
    bt1 = Button(root, command=myClick)
    bt1.grid(row=3, column=0)
    
    root.mainloop()
    

    root.mainloop() 之后的代码也不会执行。

    【讨论】:

    • 但是在root.mailoop()之后,变量var还会有输入赋值吗?这就是存储到变量中的要点...... print() 是检查它是否被分配......
    • @alex,root.mainloop() 之后的代码不会执行,但不要将其视为程序的结束。它可以防止窗口立即关闭,并且您可以在它永远运行之前拥有无限循环之类的东西。如果我理解正确,我上面提供的示例正是您想要的。您可以随时在输入字段中输入文本,并通过按下按钮检查变量是否被重新分配。
    • 我需要将myClick函数中分配给var的entry输入数据存入一个全局变量中,例如hello,前面已经定义好了。
    • @alex,在定义 myClick 函数 (var = None) 之前初始化 var 变量并通过 global 访问它(在函数定义的开头添加 global var
    • 是的,这可能有效,但我需要将此函数与多个全局变量一起使用,并且我不会为每个变量定义函数。我需要使用变量名称的函数参数将给定字符串的条目输入存储在实际的全局变量中,而不是在函数中使用 'global var'...
    【解决方案2】:

    只定义一个普通函数:

    from tkinter import * 
    
    def blinta():
        var = ent.get()
        ent.delete(0,END)
        print(var)
    root = Tk()#creates initial tk
    
    lbl1 = Label(root, text = "hello")#before entry label
    lbl1.grid(row = 0, column = 0)#label griding
    
    ent = Entry(root, width = 15)# the entry
    ent.grid(row = 1, column = 0)#entry gridding
    bt1 = Button(root, command = blinta)
    bt1.grid(row = 3, column = 0)
    root.mainloop()
    

    我相信这会奏效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 2015-11-09
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多