tkinter: динамически изменять текст метки без повторов
Я хочу, чтобы уникальные сообщения, связанные с определенными именами виджетов, отображались как текст одной метки, когда эти виджеты фокусируются. Сообщения - это значения в словаре, соответствующие ключам словаря, которые являются строками, идентичными именам виджетов. Как показано, это работает, если я использую повторяющиеся операторы IF для идентификации ключей и отображения соответствующих значений, но я хочу заменить то, что станет большой коллекцией операторов IF, одной функцией, которая делает то же самое без повторения. Я сделал это в Javascript, но мне пришлось обратиться за помощью, и я недостаточно хорошо понимаю кодирование, чтобы перевести js на Python. Я работал над этим в течение нескольких дней, и самый близкий пример, который я нашел, делает что-то похожее, получая выбор записи из выпадающего списка. Теоретически это может относиться к моему случаю, если бы у меня был опыт угадать, как комбо-бокс знает, что происходит внутри него. Также, если textvariable не нужен, то как это сделать без него, но, поскольку я "делю переменную между двумя или более виджетами" (согласно Брайану Оукли), я думаю, что это может быть необходимо. Мне могут даже понадобиться две текстовые переменные? Благодарю.
import tkinter as tk
from tkinter import ttk
def clear(event):
statusBar_value.set('')
def set_statusBar(event):
w = widget_name
focw = root.focus_get()
if entry1==focw:
statusBar_value.set(w['entry1'])
if entry2==focw:
statusBar_value.set(w['entry2'])
root = tk.Tk()
statusBar_value = tk.StringVar()
statusBar_value.set('Status Bar...')
widget_name = {'entry1':'Entry 1 has focus', 'entry2':'Entry 2 has focus'}
entry1 = ttk.Entry(root)
dummy = ttk.Entry(root)
entry2 = ttk.Entry(root)
statusBar = ttk.Label(root, textvariable = statusBar_value)
entry1.grid()
dummy.grid()
entry2.grid()
statusBar.grid()
entry1.bind('<FocusIn>', set_statusBar)
entry1.bind('<FocusOut>', clear)
entry2.bind('<FocusIn>', set_statusBar)
entry2.bind('<FocusOut>', clear)
root.mainloop()
1 ответ
Простой способ сделать это - сделать виджеты Entry ключами widget_name
толковый словарь:
import tkinter as tk
from tkinter import ttk
def clear(event):
statusBar_value.set('')
def set_statusBar(event):
statusBar_value.set(widget_name[event.widget])
root = tk.Tk()
statusBar_value = tk.StringVar()
statusBar_value.set('Status Bar...')
entry1 = ttk.Entry(root)
dummy = ttk.Entry(root)
entry2 = ttk.Entry(root)
widget_name = {entry1:'Entry 1 has focus', entry2:'Entry 2 has focus'}
statusBar = ttk.Label(root, textvariable = statusBar_value)
entry1.grid()
dummy.grid()
entry2.grid()
statusBar.grid()
entry1.bind('<FocusIn>', set_statusBar)
entry1.bind('<FocusOut>', clear)
entry2.bind('<FocusIn>', set_statusBar)
entry2.bind('<FocusOut>', clear)
root.mainloop()