tkinter:动态更改标签文本,而无需重复测试

时间:2018-08-19 07:34:51

标签: python dictionary tkinter focusin

我希望与某些小部件名称相关联的唯一消息在这些小部件获得焦点时显示为单个标签的文本。消息是字典中与字典键对应的值,这些键是与小部件名称相同的字符串。如图所示,如果我使用重复的IF语句来标识键并显示相应的值,那么这是可行的,但是我想用一个函数来替换将成为大量IF语句的集合,该函数可以执行相同的操作而无需重复。我已经用Javascript完成了此操作,但是had to get help却不十分了解将js转换为Python的编码。我已经为此工作了好几天,closest example I've found通过从组合框中获取条目选择来做类似的事情。如果我有经验来猜测组合框如何知道其内部发生的情况,那么这在理论上可能适用于我的情况。另外,如果不需要textvariable,那么在没有它的情况下如何做到这一点,但是由于我“在两个或更多小部件之间共享变量”(根据Bryan Oakley的说法),我认为可能是必需的。我什至需要两个textvariables?谢谢。

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 个答案:

答案 0 :(得分:2)

一种简单的方法是使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()