我只想使用tkinter绑定ASCII密钥. 我知道如何有 Select 地绑定它(每个键),甚至通过将它绑定到所有键盘键(使用<Key><KeyPress>),但问题是,我不知道如何 for each ASCII键做同样的事情.

以下是我到目前为止try 过的:

  1. 使用<Key><KeyPress>绑定来捕获所有键盘键(不支持鼠标键):
import tkinter as tk

def key_press(event):
    label.config(text = f'char Pressed: {event.char!r}')
    label2.config(text=f'keysym Pressed: {event.keysym!r}')

root = tk.Tk()
label = tk.Label(root, text='Press a key')
label2 = tk.Label(root, text='Press a key')
label.pack()
label2.pack()
root.bind('<Key>', key_press)
root.mainloop()
  1. 使用每键绑定(需要首先知道名称/密钥符号,如tkinter documentation中所示):
import tkinter as tk

def key_press(event):
    label.config(text = f'char Pressed: {event.char!r}')
    label2.config(text=f'keysym Pressed: {event.keysym!r}')

root = tk.Tk()
label = tk.Label(root, text='Press a key')
label2 = tk.Label(root, text='Press a key')
label.pack()
label2.pack()
# here we only use the K and BackSpace key as example
root.bind('<BackSpace>', key_press)
root.bind('<K>', key_press)
root.mainloop()

如何仅使用tkinter将一个函数绑定到所有ASCII密钥?(如果可能,不使用第三方模块)

推荐答案

在我看来,仅绑定ascii chars的最简单有效的解决方案是使用event.char. event.char相当于%A 如果没有解析printable个字符,则将是空字符串. 要访问单个字符,您可以使用repr 因为它是implemented in tkinter

我没有使用event.keycode,因为Multi_key似乎不可靠. 也包括del键,但找不到更好的方法来使用keysym为它,请随时寻找更好的方法

示例代码:

import tkinter as tk

def isascii(event):
    if event.char != '':
        char = list(event.char)[0] #'^' or '`' is only parsed as doubles in Windows
        if ord(char) <= 127: #avoid non-ascii like '²' or '³' or '´'
            print(
                repr(char), #printable character
                ord(char) #corresponding ascii value
                )
    elif event.keysym == 'Delete':
        print('backspace / delete', 127)

root = tk.Tk()
root.bind('<Key>', isascii)
root.mainloop()

压缩版本:

import tkinter as tk

def isascii(event):
    if event.char != '' and ord((char := list(event.char)[0])) <= 127:
        print(
            repr(char), #printable character
            ord(char) #corresponding ascii value
            )
    elif event.keysym == 'Delete': print('delete', 127)

root = tk.Tk()
root.bind('<Key>', isascii)
root.mainloop()

Python相关问答推荐

Polars:用氨纶的其他部分替换氨纶的部分

如何在python polars中停止otherate(),当使用when()表达式时?

ODE集成中如何终止solve_ivp的无限运行

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

用砂箱开发Web统计分析

需要帮助重新调整python fill_between与数据点

Pandas:填充行并删除重复项,但保留不同的值

为什么我的sundaram筛这么低效

如何过滤组s最大和最小行使用`transform`'

语法错误:文档. evaluate:表达式不是合法表达式

使用嵌套对象字段的Qdrant过滤

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

有没有办法在不先将文件写入内存的情况下做到这一点?

python的文件. truncate()意外地没有截断'

PySpark:如何最有效地读取不同列位置的多个CSV文件

我怎么才能用拉夫分拣呢?

设置索引值每隔17行左右更改的索引

搜索结果未显示.我的URL选项卡显示:http://127.0.0.1:8000/search?";,而不是这个:";http://127.0.0.1:8000/search?q=name";

是否在DataFrame中将所有列设置为大写?