【问题标题】:tkinter: Dynamically change label text without repetitive If testingtkinter:动态更改标签文本而不重复如果测试
【发布时间】:2018-08-19 07:34:51
【问题描述】:

我希望与某些小部件名称关联的唯一消息在这些小部件获得焦点时显示为单个标签的文本。消息是字典中的值,对应于字典的键,这些键是与小部件名称相同的字符串。如图所示,如果我使用重复的 IF 语句来识别键并显示相应的值,这将起作用,但我想用一个函数替换将成为大量 IF 语句的集合,该函数在没有重复的情况下执行相同的操作。我已经在 J​​avascript 中完成了此操作,但 had to get help 并且我对编码的理解不够好,无法将 js 转换为 Python。我已经为此工作了好几天,closest example I've found 通过从组合框中获取条目选择做了类似的事情。如果我有经验猜测组合框如何知道其中发生了什么,这在理论上可能适用于我的案例。此外,如果不需要 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()

【问题讨论】:

    标签: python dictionary tkinter focusin


    【解决方案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()
    

    【讨论】:

    • 所以我需要的动态引用是 [event.widget] 我猜它是指触发绑定事件的小部件。您还从 dict 键中删除了引号,并将 dict 创建移动到 dict 键中引用的小部件的创建下方。谢谢,这比我想象的要简单。
    • @Lutherman 如果我的回答对您有所帮助,请考虑accepting。是的,event.widget 是触发事件的小部件。这使得编写处理多个小部件的回调变得容易。通过删除引号,我们将小部件对象本身用作widget_name 中的键。任何可散列对象都可以用作字典键(或设置项)。如果您尝试使用不可散列的对象,它将引发TypeError: unhashable type
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多