仅绑定tk/tkinter上的有效密钥



你能告诉我是否有一种方便的方法只在"上绑定吗;显著的";带tk/tkinter的钥匙?

因此,情况是我在tk.Entry上有一个绑定(因为在按键时我需要一个回调来触发(,如下所示:

myEntry.bind('<Key>', ...)

现在,无论按下什么键,绑定回调都会被触发(即使是shift!(,但我希望它只在"上触发;显著的";按键。。。通过";显著的";我指的是条目中涉及文本更改的每个键,所以";显著的";键肯定是字母、数字、符号和退格键或删除键,但不是箭头键、home、end、pgUp/Down或tab、caps-lock、shift、ctrl等。(我仍在考虑是否需要它来触发回车键,但这不是问题,因为如果我也需要它,我可以在它上添加一个特定的绑定,或者稍后在回调中忽略它(

我不知道是否有与<Key>不同的东西可以绑定以获得我需要的东西,是吗?否则,如果没有,我知道我可以通过查看事件键代码来了解按下了哪个键。。。这是要走的路吗?如果是,你能给我推荐一些合适的密钥码间隔吗?

谢谢

在评论中,您说您正在对列表框进行实时过滤。为此,可以说,最好在变量上设置跟踪,而不是在入口小部件上设置绑定。只有当值更改时才会调用跟踪,因此不必区分是哪个键触发了更改。

这里有一个简单的例子来说明这个概念:

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()

最新更新