Python键盘库在Windows返回大小写,但在Linux只返回小写

0 投票
1 回答
29 浏览
提问于 2025-04-14 17:02

我使用了一个叫做 keyboard 的Python库来获取键盘输入,结果发现了一些奇怪的问题。在Windows上测试时,按下Shift键可以得到大写字母或小写字母,结果是根据我是否按住Shift键而变化的。但是在Debian Linux上测试时,不管我是否按住Shift键,结果似乎总是小写字母。实际上,这个问题还影响到标点符号、特殊字符和括号。比如按下Shift加5,结果还是显示为5。这是不可避免的吗,还是我漏掉了什么?

我希望这个库在Linux上也能像在Windows上一样提供大写字母和特殊字符,不然我就得自己做一个查找表来转换了。

import keyboard

while True:
    event = keyboard.read_event()
    if event.event_type == keyboard.KEY_DOWN:
        print(dir(event))
        print('key pressed', event.name)

1 个回答

1

好的,我还是不太明白你想要做什么(是把键变成大写还是小写),所以这里给你两个例子。

总是小写:

from pynput.keyboard import Listener

def on_press(key):
    try:
        print(key.char)
    except:
        print(key)

with Listener(on_press=on_press) as listener:
    listener.join()

还有总是大写:

import keyboard

hotkeys = []
nums = {1: '!', 2: '@', 3: '#', 4: '$', 5: '%', 6: '^', 7: '&', 8: '*', 9: '(', 10: ')'}
letters = 'abcdefghijklmnopqrstuvwxyz'

for letter in letters:
    hotkeys.append(letter)

for num in range(10):
    hotkeys.append(str(num))

while True:
    for hotkey in hotkeys:
        if keyboard.is_pressed(f'shift+{hotkey}'):
            try:
                hotkey = int(hotkey)
                print(nums[hotkey])
            except:
                hotkey = hotkey.upper()
                print(hotkey)

            while True:
                if not keyboard.is_pressed(f'shift+{hotkey}'):
                    break

        elif keyboard.is_pressed(hotkey):
            print(hotkey)
            while True:
                if not keyboard.is_pressed(hotkey):
                    break

小写的代码是通过使用 pynput 实现的,这个库无论如何都能给出小写字母,很多人认为它比 keyboard 更好。

大写的代码稍微复杂一点。我列了一些可能的快捷键,比如 'shift+5' 是 '%',然后我进入一个无限循环,等待按键被按下。首先,我们检查用户是否也按下了 shift 键,如果没有按 shift,那我们就直接打印小写版本的快捷键。这个代码显然没有覆盖所有字符(比如 '|'),但涵盖了大多数常用的字符。你可以根据自己的需要添加更多。

另外要注意,我加了一个循环,这样键盘输入不会重复显示(只按了一次键却检测到多次),所以你必须在下一次循环开始之前释放按键。

撰写回答