如何在ttk.Entry中使用bindtags并解决内容选中失效问题
核心差异:bindtags的类标签不同
tk.Entry和ttk.Entry的默认bindtags结构类似,但类绑定标签完全不同:
- tk.Entry的默认bindtags是
('Entry', '.tk_entry', '.', 'all'),所有原生Entry的默认交互(鼠标点击获焦、文本选中)都绑定在Entry标签上。 - ttk.Entry的默认bindtags是
('TEntry', '.ttk_entry', '.', 'all'),ttk Entry的默认交互逻辑全部挂在TEntry标签上。
你代码里把ttk_entry的bindtags改成了('Entry', '.ttk_entry', '.', 'all'),替换了原本的TEntry标签,导致ttk自带的鼠标、选中相关绑定找不到触发入口,自然失效。
修复方案
方案一:保留ttk默认bindtags,调整顺序优先触发自定义事件
如果只是想让自定义的<KeyPress>事件先于默认逻辑执行,不需要替换整个bindtags,只需调整标签顺序,把组件自身标签移到类标签前面:
import tkinter as tk from tkinter import ttk root = tk.Tk() status = ttk.Label(root) status.grid(row=2, column=0) def OnKeyPress(event): value = event.widget.get() string="value of %s is '%s'" % (event.widget._name, value) status.configure(text=string) tk_entry = tk.Entry(root, name="tk_entry") tk_entry.bindtags(('Entry', '.tk_entry', '.', 'all')) tk_entry.grid(row=0, column=0, padx=3, pady=3) tk_entry.bind("<KeyPress>", OnKeyPress) # 修复ttk_entry的bindtags ttk_entry = ttk.Entry(root, name="ttk_entry") # 获取默认bindtags并调整顺序 original_tags = ttk_entry.bindtags() new_tags = (original_tags[1], original_tags[0]) + original_tags[2:] ttk_entry.bindtags(new_tags) ttk_entry.grid(row=1, column=0, padx=3, pady=3) ttk_entry.bind("<KeyPress>", OnKeyPress) root.mainloop()
方案二:手动设置bindtags时保留TEntry标签
如果一定要手动指定bindtags,必须包含TEntry标签(而非tk的Entry),确保默认交互绑定能生效:
import tkinter as tk from tkinter import ttk root = tk.Tk() status = ttk.Label(root) status.grid(row=2, column=0) def OnKeyPress(event): value = event.widget.get() string="value of %s is '%s'" % (event.widget._name, value) status.configure(text=string) tk_entry = tk.Entry(root, name="tk_entry") tk_entry.bindtags(('Entry', '.tk_entry', '.', 'all')) tk_entry.grid(row=0, column=0, padx=3, pady=3) tk_entry.bind("<KeyPress>", OnKeyPress) # 修复ttk_entry的bindtags ttk_entry = ttk.Entry(root, name="ttk_entry") # 用TEntry替代Entry,保留ttk默认绑定 ttk_entry.bindtags(('TEntry', '.ttk_entry', '.', 'all')) ttk_entry.grid(row=1, column=0, padx=3, pady=3) ttk_entry.bind("<KeyPress>", OnKeyPress) root.mainloop()
两种方案都能让ttk_entry恢复鼠标点击获焦、文本选中的功能,同时保留自定义的按键事件逻辑。
内容的提问来源于stack exchange,提问作者sambler
相关产品推荐
相关产品推荐

