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

Python tkinter:动态更改标签文本,无需重复If测试,python,dictionary,tkinter,focusin,Python,Dictionary,Tkinter,Focusin,我希望与某些小部件名称关联的唯一消息在这些小部件聚焦时显示为单个标签的文本。消息是字典中对应于字典键的值,字典键是与小部件名称相同的字符串。如图所示,如果我使用重复的if语句来识别键并显示相应的值,那么这是可行的,但是我想用一个函数来替换将成为一个if语句的大集合的内容,该函数可以不重复地执行相同的操作。我已经在Javascript中完成了这项工作,但是我对编码的理解还不足以将js翻译成Python。我已经为此工作了好几天,并且通过从组合框中获取条目选择来做类似的事情。如果我有经验去猜测组合框是

我希望与某些小部件名称关联的唯一消息在这些小部件聚焦时显示为单个标签的文本。消息是字典中对应于字典键的值,字典键是与小部件名称相同的字符串。如图所示,如果我使用重复的if语句来识别键并显示相应的值,那么这是可行的,但是我想用一个函数来替换将成为一个if语句的大集合的内容,该函数可以不重复地执行相同的操作。我已经在Javascript中完成了这项工作,但是我对编码的理解还不足以将js翻译成Python。我已经为此工作了好几天,并且通过从组合框中获取条目选择来做类似的事情。如果我有经验去猜测组合框是如何知道里面发生了什么,理论上这可能适用于我的案例。另外,如果不需要textvariable,那么如何在没有它的情况下实现这一点,但由于我“在两个或多个小部件之间共享变量”(根据Bryan Oakley),我认为可能需要它。我甚至可能需要两个文本变量?谢谢

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()
将tkinter作为tk导入
从tkinter导入ttk
def清除(事件):
statusBar_值设置(“”)
def set_状态栏(事件):
w=小部件名称
focw=root.focus\u get()
如果entry1==focw:
statusBar_值.set(w['entry1'])
如果entry2==focw:
statusBar_值.set(w['entry2'])
root=tk.tk()
statusBar_value=tk.StringVar()
statusBar_value.set('状态栏…'))
小部件名称={'entry1':'entry1有焦点','entry2':'entry2有焦点'}
entry1=ttk.Entry(根)
虚拟=ttk.条目(根)
entry2=ttk.Entry(根)
statusBar=ttk.Label(根,textvariable=statusBar\u值)
entry1.grid()
dummy.grid()
entry2.grid()
statusBar.grid()
entry1.bind(“”,设置_状态栏)
入口1.绑定(“”,清除)
entry2.bind(“”,设置_状态栏)
入口2.绑定(“”,清除)
root.mainloop()

一个简单的方法是使条目小部件成为
小部件名称
字典的键:

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()
将tkinter作为tk导入
从tkinter导入ttk
def清除(事件):
statusBar_值设置(“”)
def set_状态栏(事件):
statusBar\u value.set(小部件名称[事件.小部件])
root=tk.tk()
statusBar_value=tk.StringVar()
statusBar_value.set('状态栏…'))
entry1=ttk.Entry(根)
虚拟=ttk.条目(根)
entry2=ttk.Entry(根)
小部件名称={entry1:'entry1有焦点',entry2:'entry2有焦点'}
statusBar=ttk.Label(根,textvariable=statusBar\u值)
entry1.grid()
dummy.grid()
entry2.grid()
statusBar.grid()
entry1.bind(“”,设置_状态栏)
入口1.绑定(“”,清除)
entry2.bind(“”,设置_状态栏)
入口2.绑定(“”,清除)
root.mainloop()

所以我需要的动态引用是[event.widget],我猜它是指触发绑定事件的小部件。您还删除了dict键中的引号,并将dict创建移动到dict键中引用的小部件的创建下方。谢谢,这比我想象的要简单。“Lutherman,如果我的回答对你有帮助,请考虑一下。”是,
event.widget
是触发事件的小部件。这使得编写处理多个小部件的回调变得容易。通过删除引号,我们将小部件对象本身用作
widget\u name
中的键。任何可哈希对象都可以用作dict键(或set项)。如果试图使用不可损坏的对象,它将引发
TypeError:unhabable type