如何获取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
相关产品推荐
相关产品推荐

