如何让 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 下使用尽可能少的变通方法使我的代码达到 运行?
我的想法:
- 运行 作为
root
- 不太好。我的程序将创建文件,如果文件权限错误和超出严格必要的权限,这可能会很尴尬。此外,当 运行 sudo,
它无法检测到 X 服务器。
- 将我的应用程序变成 X 客户端。如果没有大量开销,这可能吗?这对 Windows 的可移植性有何影响?快速将其转换为 pyQT 应用程序有意义吗?
有没有简单的解决方案?
这适用于 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_())
我有一个简单的示例程序,可以在 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 下使用尽可能少的变通方法使我的代码达到 运行?
我的想法:
- 运行 作为
root
- 不太好。我的程序将创建文件,如果文件权限错误和超出严格必要的权限,这可能会很尴尬。此外,当 运行sudo,
它无法检测到 X 服务器。 - 将我的应用程序变成 X 客户端。如果没有大量开销,这可能吗?这对 Windows 的可移植性有何影响?快速将其转换为 pyQT 应用程序有意义吗?
有没有简单的解决方案?
这适用于 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_())