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()
Другие вопросы по тегам