Tkinter: KeyError при назначении функции кнопке - PullRequest
0 голосов
/ 06 мая 2020

Итак, у меня довольно сложная программа, и я столкнулся с проблемой, которую не могу решить. Вот проблема c части моей программы:

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

Мне нужно получить содержимое записи с именем «ввод» нажатием кнопки. Из-за того, как работает моя программа, это имя, «ввод», должно храниться в переменной, которую я здесь назвал «переменная». Что происходит, когда я нажимаю кнопку, я получаю 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()

Здесь получается содержание «ввода» не выполняется с помощью кнопки, но выполняется автоматически по мере выполнения программы. Это не то, что я хочу, но по какой-то причине это работает.

Что я могу сделать, чтобы 1-й код работал правильно?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Мне нужно получить содержимое записи под названием «ввод» нажатием кнопки. Из-за того, как работает моя программа, это имя, «ввод», должно быть сохранено в переменной,

Лучшее решение, чем использование 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()
0 голосов
/ 06 мая 2020

Когда вы выполняете vars локально в функции hi, создается новый объект 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()
...