Мне нужно знать, когда (конкретная) клавиша нажата и удерживается. Вариант использования после обнаружения довольно прост. Когда клавиша будет отпущена, отправьте сигнал об остановке обратного вызова (который я уже знаю).
Желаемое поведение
Вот примерная схема как выглядит алгоритм:
Код: Выделить всё
def the_callback():
if key_held == the_hotkey:
someObj.start() # this class Obj works totally well so no issues here on
elif key_released == the_hotkey:
someObj.stop()
else:
# we don't care. continue looking for Keyboard events
# here any kinda listener or just a loop which passes events to the callback
Что я пробовал
Я использовал pynput и его pynput.keyboard.Listener для обнаружения ключа -нажимает и вызывает обратные вызовы соответственно, но я не смог заставить эту работу определять, когда клавиша удерживается нажатой.
текущее решение выглядит примерно так:
Код: Выделить всё
# not real code. just rough scheme
def on_pressed(key):
if key == my_hotkey:
if running_already: # this part works well already
obj.stop()
else:
obj.start()
else:
# we don't care
with pynput.keyboard.Listener(on_press=on_pressed) as listener:
listener.join() # blocking call until SystemExit, `return False` from callback or `listener.stop()`
Возможно, сохраняя последнее известное нажатие клавиши и проверяя, была ли отпущенная клавиша той же, что и горячая клавиша, которая была нажата ранее, но я не уверен, как бы мне это сделать. это и может ли это вообще работать?
Затем я решил попробовать клавиатуру (другие библиотеки).
Я написал приведенный ниже код для того же самого, который может обнаружить клавиши удерживаются нажатыми. Этот код ниже почти дает то, что я хочу:
Код: Выделить всё
import keyboard as kb, time
while 1:
while kb.is_pressed('q'):
print('Key is held')
time.sleep(0.5) # sleep added just to stop it from spamming the stdout
else:
print('No it\'s Not')
time.sleep(0.5)
Последний вопрос
Как мне определить, что клавиша удерживается нажатой. Я бы предпочел добиться этого с помощью pynput, поскольку остальная часть базы кода использует его, но 'keyboard тоже подойдет.
Опять же, у меня такое ощущение, что использование on_press=a_callback и on_release=another_callback этого можно достичь, но я не совсем в этом уверен. Наконец, предпочтительно, чтобы решение было кроссплатформенным (я согласен использовать три разные функции в зависимости от значения Platform.system()).
Как бы вы поступили о достижении этого?
EDIT-1
ЗДЕСЬ я написал как попытку (и MCVE) по предложению Исака. Это работает почти идеально с всего 1 недостатком. И дело в том, что он не слушает нажатия клавиш с самого запуска программы.
По какой-то неизвестной причине требуется некоторое время, прежде чем он действительно начнет обнаруживать любое нажатие клавиши. Хорошо, что как только он впервые обнаруживает нажатие клавиши, он работает безупречно.
Что мне там не хватает?
Подробнее здесь: https://stackoverflow.com/questions/671 ... own-python