【问题标题】:Tkinter: KeyError when assigning function to a buttonTkinter:将功能分配给按钮时出现KeyError
【发布时间】:2020-05-06 20:28:21
【问题描述】:

所以,我有一个相当复杂的程序,我遇到了一个我似乎无法解决的问题。 这是我的程序有问题的部分:

import tkinter as tk
window = tk.Tk()
variable = "enter"
vars()[variable] = tk.Entry()
vars()[variable].insert(0, "hello")
vars()[variable].pack()

def hi():
    text = vars()[variable].get()

button = tk.Button(text = "Click", command = hi)
button.pack()

我需要按下一个按钮来获取名为“enter”的条目的内容。由于我的程序是如何工作的,这个名字“enter”必须存储在一个变量中,我在这里称之为“variable”。 发生了什么,当我按下按钮时,我得到一个 KeyError。

更奇怪的是,当我执行以下操作时,程序实际上可以运行:

import tkinter as tk
window = tk.Tk()
variable = "enter"
vars()[variable] = tk.Entry()
vars()[variable].insert(0, "hello")
vars()[variable].pack()


text = vars()[variable].get()

button = tk.Button(text = "Click")
button.pack()

这里获取“enter”的内容不是通过按钮完成的,而是在程序运行时自动完成的。这不是我想要的,但由于某种原因它有效。

我该怎么做才能使第一个代码正常工作?

【问题讨论】:

    标签: python variables tkinter text keyerror


    【解决方案1】:

    当您在hi 函数中本地执行vars 时,会创建一个新的dict 对象,它与全局创建的dict 对象不同。
    您可以保存对变量的引用并在 hi 函数中使用该变量。

    import tkinter as tk
    
    window = tk.Tk()
    variable = "enter"
    vars()[variable] = tk.Entry()
    vars()[variable].insert(0, "hello")
    vars()[variable].pack()
    
    d = vars()
    
    def hi():
        text = d[variable].get()
    
    button = tk.Button(text="Click", command=hi)
    button.pack()
    
    window.mainloop()
    

    【讨论】:

    • 非常感谢,帮了大忙!
    【解决方案2】:

    我需要按下一个按钮来获取名为“enter”的条目的内容。由于我的程序是如何工作的,这个名字,“enter”必须存储在一个变量中,

    比使用vars()[variable] 更好的解决方案是将您的小部件存储在字典中。使用vars() 提供的价值很小,但代价是使代码更难理解。

    import tkinter as tk
    
    window = tk.Tk()
    variable = "enter"
    
    widgets = {}
    widgets[variable] = tk.Entry()
    widgets[variable].insert(0, "hello")
    widgets[variable].pack()
    
    def hi():
        text = widgets[variable].get()
        print(text)
    
    button = tk.Button(text = "Click", command = hi)
    button.pack()
    

    【讨论】:

    • 谢谢你!我会尝试用字典重写代码。
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2013-12-28
    • 2021-06-30
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多