Мне нужно было показать ввод для некоторых вещей в игре, в которую я играю на Linux, но в Linux, похоже, нет хороших программ отображения ввода. Я решил, что было бы достаточно иметь печать Python в паре окон xterm (одно для клавиатуры и одно для мыши) с использованием pynput. Я делаю это, используя две разные программы на Python, потому что единственный способ, которым, как я обнаружил, одна программа на Python работает с двумя терминалами, — это постоянно писать в файл и использовать tail -f, а я не хотел этого делать.
Поскольку обе программы оказались такими маленькими и простыми, я попытался написать ее так, чтобы слушатели клавиш / мыши выполняли свои функции как можно быстрее. Но я мог упустить некоторые вещи, которые можно было бы сделать. Мне интересно, знает ли кто-нибудь другие способы оптимизации времени отклика. Я знаю, что это не будет иметь ничего общего с заметной разницей, я просто спрашиваю из любопытства.
* Отредактировано, потому что я придумал, как сделать это быстрее
mouse_listener.py
from pynput import mouse
def main():
print_count = 0
def on_click(x,
y,
button,
pressed,
local_print=print,
dashes="--- ",
no_dashes=" ",
pressed_str=" mouse pressed",
released_str=" mouse released"
):
nonlocal print_count
if print_count >= 10:
if pressed:
local_print(dashes + button.name + pressed_str)
print_count = 0
else:
local_print(dashes + button.name + released_str)
print_count = 0
else:
if pressed:
local_print(no_dashes + button.name + pressed_str)
print_count = print_count + 1
else:
local_print(no_dashes + button.name + released_str)
print_count = print_count + 1
def on_scroll(x,
y,
dx,
dy,
local_print=print,
dashes="--- ",
no_dashes=" ",
up_str="scroll up",
down_str="scroll down"
):
nonlocal print_count
if print_count >= 10:
if dy == 1:
local_print(dashes + up_str)
print_count = 0
else:
local_print(dashes + down_str)
print_count = 0
else:
if dy == 1:
local_print(no_dashes + up_str)
print_count = print_count + 1
else:
local_print(no_dashes + down_str)
print_count = print_count + 1
try:
listener = mouse.Listener(on_click=on_click, on_scroll=on_scroll)
listener.start()
listener.join()
except KeyboardInterrupt:
listener.stop()
main()
key_listener.py
from pynput import keyboard
def main():
print_count = 0
held = set()
def on_press(key,
local_print=print,
local_hasattr=hasattr,
held_local=held,
hold=held.add,
str_lower=str.lower,
dashes="--- ",
no_dashes=" ",
end_text=" pressed",
str_for_hasattr="name"
):
nonlocal print_count
if key not in held_local:
if local_hasattr(key, str_for_hasattr):
if print_count >= 10:
local_print(dashes + key.name + end_text)
print_count = 0
else:
local_print(no_dashes + key.name + end_text)
print_count = print_count + 1
else:
if print_count >= 10:
local_print(dashes + str_lower(key.char) + end_text)
print_count = 0
else:
local_print(no_dashes + str_lower(key.char) + end_text)
print_count = print_count + 1
hold(key)
def on_release(key,
local_print=print,
local_hasattr=hasattr,
unhold=held.remove,
str_lower=str.lower,
dashes="--- ",
no_dashes=" ",
end_text=" released",
str_for_hasattr="name"
):
nonlocal print_count
if local_hasattr(key, str_for_hasattr):
if print_count >= 10:
local_print(dashes + key.name + end_text)
print_count = 0
else:
local_print(no_dashes + key.name + end_text)
print_count = print_count + 1
else:
if print_count >= 10:
local_print(dashes + str_lower(key.char) + end_text)
print_count = 0
else:
local_print(no_dashes + str_lower(key.char) + end_text)
print_count = print_count + 1
try: # I don't trust this part
unhold(key)
except KeyError:
pass
try: # TypeError is possible because numpad 5's char attribute is None
listener = keyboard.Listener(on_press=on_press, on_release=on_release)
listener.start()
listener.join()
except (KeyboardInterrupt, TypeError):
listener.stop()
main()
xterm_opener.sh
xterm -xrm 'XTerm.vt100.allowTitleOps: false' -T "keyboard" -geometry 28x16 -e python3 '/home/USERNAME/input_listener/key_listener.py' &
xterm -xrm 'XTerm.vt100.allowTitleOps: false' -T "mouse" -geometry 28x16 -e python3 '/home/USERNAME/input_listener/mouse_listener.py'
