微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

只绑定 tk/tkinter 上的重要键

如何解决只绑定 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 举报,一经查实,本站将立刻删除。