1

当这些小部件获得焦点时,我希望与某些小部件名称关联的唯一消息显示为单个标签的文本。消息是字典中的值,对应于字典的键,这些键是与小部件名称相同的字符串。如图所示,如果我使用重复的 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()
4

1 回答 1

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()
于 2018-08-19T08:02:10.257 回答