如何解决只绑定 tk/tkinter 上的重要键
你能告诉我是否有一种方便的方法可以只绑定 tk/tkinter 的“重要”键?
所以,情况是我在 tk.Entry 上绑定了(因为我需要在按下键时触发回调),如下所示:
myEntry.bind('<Key>',...)
现在,无论按下什么键都会触发绑定回调(即使它是 shift!)但是 我希望它只在“重要”键上触发...通过“重要”我的意思是每个涉及条目中文本更改的键,因此“重要”键肯定是字母、数字、符号和退格键或删除键,但不是箭头键、home、end、pgUp/Down 或选项卡、大写锁定、shift、ctrl 等...(我仍在考虑是否需要它在返回键时触发,但这不是问题,因为如果我也需要它,我可以添加一个特定的绑定它或以其他方式在稍后的回调中忽略它)
我不知道是否有与 <Key>
不同的东西我可以绑定以获得我需要的东西,是吗?
否则,如果没有,我知道我可以通过查看事件键码来了解按下了哪个键......这是要走的路吗?如果是的话,你能给我推荐一些合适的键码间隔吗?
谢谢
解决方法
在评论中,您说您正在对列表框进行实时过滤。为此,可以说最好在变量上设置跟踪而不是在条目小部件上设置绑定。 trace 只会在值发生变化时被调用,所以你不必区分是哪个键触发了变化。
这里有一个简单的例子来说明这个概念:
import tkinter as tk
widgets = [w.__name__ for w in tk.Widget.__subclasses__()]
root = tk.Tk()
entryvar = tk.StringVar()
entry = tk.Entry(root,textvariable=entryvar)
listbox = tk.Listbox(root)
entry.pack(side="top",fill="x")
listbox.pack(side="bottom",fill="both",expand=True)
listbox.insert("end",*sorted(widgets))
after_id = None
def filter_changed(*args):
global after_id
if after_id:
root.after_cancel(after_id)
# delay actual filtering slightly,in case the user is typing fast.
after_id = root.after(500,filter_listbox)
def filter_listbox(*args):
pattern = entryvar.get()
filtered_widgets = [w for w in widgets if w.startswith(pattern) ]
listbox.delete(0,"end")
listbox.insert("end",*filtered_widgets)
entryvar.trace("wu",filter_changed)
root.mainloop()
,
这是我的解决方案,它使用 event.char
并针对包含字符的字符串进行评估(如果需要,可以添加更多字符):
from tkinter import Tk,Entry
string = r"""0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"""
def key_press(event):
if event.char and event.char in string:
print(event.char)
root = Tk()
entry = Entry(root)
entry.pack()
entry.bind('<Key>',key_press)
root.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。