You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Tkinter中获焦Entry组件的StringVar及组件名称?

如何获取Tkinter获焦Entry组件的自身变量名及绑定的StringVar变量名

当你用self.root.focus_get()获取到获焦的Entry组件时,返回的是Tkinter内部生成的标识(如.!labelframe2.!entry),无法直接得到你定义的组件变量名(比如self.f1e1_entry)和对应的StringVar变量名(比如self.f1e1)。要解决这个问题,你需要手动建立Entry对象与自定义名称的映射关系——因为Python对象本身不会保存它被哪个变量引用的信息。

下面是修改后的完整代码:

# focus_get.py

import tkinter as tk

class Focus_Get:
    def __init__(self):
        # 创建主窗口
        self.root = tk.Tk()
        self.root.geometry('300x800')
        self.root.title('Focus_Get')

        # 新增:建立Entry对象与自定义名称的映射字典
        self.entry_to_name = {}  # Entry对象 → 组件变量名
        self.entry_to_var_name = {}  # Entry对象 → StringVar变量名

        # 创建第一个LabelFrame
        self.f1 = tk.LabelFrame(self.root,text='This Is The First Frame')
        self.f1.pack(pady=10)
        self.f1e1 = tk.StringVar()
        self.f1e2 = tk.StringVar()

        self.f1e1_label = tk.Label(self.f1,text='Frame 1 Entry 1',).pack(padx=5,pady=5)
        self.f1e1_entry = tk.Entry(self.f1,textvariable=self.f1e1,width='7')
        self.f1e1_entry.pack(pady=5)
        # 将当前Entry和对应的名称存入字典
        self.entry_to_name[self.f1e1_entry] = "self.f1e1_entry"
        self.entry_to_var_name[self.f1e1_entry] = "self.f1e1"

        self.f1e2_label = tk.Label(self.f1,text='Frame 1 Entry 2').pack(padx=5,pady=5)
        self.f1e2_entry = tk.Entry(self.f1,textvariable=self.f1e2,width='7')
        self.f1e2_entry.pack(pady=5)
        self.entry_to_name[self.f1e2_entry] = "self.f1e2_entry"
        self.entry_to_var_name[self.f1e2_entry] = "self.f1e2"

        # 创建第二个LabelFrame
        self.f2 = tk.LabelFrame(self.root,text='This Is The Second Frame')
        self.f2.pack(pady=10)
        self.f2e1 = tk.StringVar()
        self.f2e2 = tk.StringVar()

        self.f2e1_label = tk.Label(self.f2,text='Frame 2 Entry 1').pack(padx=5,pady=5)
        self.f2e1_entry = tk.Entry(self.f2,textvariable=self.f2e1,width='7')
        self.f2e1_entry.pack(pady=5)
        self.entry_to_name[self.f2e1_entry] = "self.f2e1_entry"
        self.entry_to_var_name[self.f2e1_entry] = "self.f2e1"

        self.f2e2_label = tk.Label(self.f2,text='Frame 2 Entry 2').pack(padx=5,pady=5)
        self.f2e2_entry = tk.Entry(self.f2,textvariable=self.f2e2,width='7')
        self.f2e2_entry.pack(pady=5)
        self.entry_to_name[self.f2e2_entry] = "self.f2e2_entry"
        self.entry_to_var_name[self.f2e2_entry] = "self.f2e2"

        # 创建按钮Frame
        self.f3 = tk.LabelFrame(self.root,text='This Is The Button Frame')
        self.f3.pack(pady=10)
        self.btn1 = tk.Button(self.f3,text='Who Has Focus',command=self.show_focus).pack(pady=5)
        self.btn2 = tk.Button(self.f3,text='Clear',command=self.clear_focus).pack(pady=5)
        self.btn3 = tk.Button(self.f3,text='Exit',command=self.close_it,).pack(pady=5)

        self.who_text = tk.Listbox(self.root,width=18,height=8,font=('Arial',16))
        self.who_text.pack(pady=5)

        self.root.protocol('WM_DELETE_WINDOW', self.close_it)
        self.root.mainloop()

    def show_focus(self):
        focused = self.root.focus_get()
        if isinstance(focused, tk.Entry):  # 确保当前获焦的是Entry组件
            # 从映射字典中获取名称
            entry_name = self.entry_to_name.get(focused, "Unknown Entry")
            var_name = self.entry_to_var_name.get(focused, "Unknown StringVar")
            self.who_text.insert(tk.END, f"Entry名称: {entry_name}")
            self.who_text.insert(tk.END, f"StringVar名称: {var_name}")
        else:
            self.who_text.insert(tk.END, "当前无Entry获焦")

    def clear_focus(self):
        self.root.focus()
        self.who_text.delete(0,tk.END)

    def close_it(self):
        self.root.destroy()

if __name__ == '__main__':
    Focus_Get()

关键修改说明:

  • 新增两个字典self.entry_to_name和self.entry_to_var_name,分别存储Entry对象到自定义组件变量名、StringVar变量名的映射关系。
  • 每创建一个Entry组件后,立刻将该组件对象与对应的名称存入字典中。
  • 修改show_focus方法:先判断获焦对象是否为Entry组件,再通过字典直接取出对应的名称并显示,避免非Entry组件获焦时出错。

现在点击获焦的Entry后,再点击“Who Has Focus”按钮,就能看到你需要的两个名称信息了。

内容的提问来源于stack exchange,提问作者Pragmatic_Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:57:38