如何让 Pynput 代码在 Wayland(以及 Windows)下工作?

How to get pynput code to work under Wayland (and Windows, too)?

我有一个简单的示例程序,可以在 Windows 和 PyCharm 中运行(在 Linux 上,在 Wayland 显示器上):

from pynput import keyboard
from queue import Queue

kbd_q = Queue(maxsize=1)

def on_activate_s(): 
    kbd_q.put("Hotkey s")


listener = keyboard.GlobalHotKeys({
    's': on_activate_s,
})
listener.start()

while True:
    key = kbd_q.get()
    if key:
        print(key)

在Wayland (Linux) 下的终端中运行ning 时不接收任何键盘事件。 Here 是 Linux 下 pynput 的限制。我想用热键(一次按下几个键)来控制我的程序,这就是为什么我想使用 pynput 甚至 pypi 键盘。但如果我没理解错的话,Wayland 是故意阻止直接访问键盘的。

如何在 Linux 和 Windows 下使用尽可能少的变通方法使我的代码达到 运行?

我的想法:

有没有简单的解决方案?

这适用于 Linux 和 Windows,来自 PyCharm 和终端。我确信 PyQt 中有很多未使用的功能,比如这个。写这样的代码让我很痛苦,因为我更喜欢它们精简和简单。欢迎为此提出建议。

import queue
import sys
from pynput import keyboard
from queue import Queue
import datetime

from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
w = QWidget()
w.resize(300,300)
w.setWindowTitle("Keyboard Events")
w.show()

kbd_q = Queue(maxsize=1)

def on_activate_1a(): kbd_q.put("Hotkey 1a")
def on_activate_2s(): kbd_q.put("Hotkey 2s")
def on_activate_s(): kbd_q.put("Hotkey s")


listener = keyboard.GlobalHotKeys({
    '1+a': on_activate_1a,
    '2+s': on_activate_2s,
    's': on_activate_s,
})
listener.start()
listener.wait()

ten_sec = datetime.datetime.now() + datetime.timedelta(seconds=10)
while datetime.datetime.now() < ten_sec:
    print(".")
    try:
        key = kbd_q.get(True, timeout=0.1)
        if key:
            print(key)
    except queue.Empty:
        pass


listener.stop()
print("10 sec passed")
sys.exit(app.exec_())