Проблемы с потоками и горячими клавишами при использовании Pynput в Python (бесконечный цикл и скорость реагирования)Python

Программы на Python
Anonymous
Проблемы с потоками и горячими клавишами при использовании Pynput в Python (бесконечный цикл и скорость реагирования)

Сообщение Anonymous »

Я пытаюсь использовать библиотеку pynput для прослушивания горячих клавиш и запуска потока при нажатии клавиши F12. Поток выводит сообщение в бесконечном цикле на консоль. Нажатие ESC должно остановить приложение. Мой пример расширяет класс Thread и переопределяет метод run.
src/index.py
import pynput
from lib.listener import HotkeyListener

if __name__ == "__main__":
on_press = HotkeyListener()
listener = pynput.keyboard.Listener(on_press=on_press.on_press, suppress=True)
listener.run()

listener.py
from .Example import Example
import pynput

class HotkeyListener:
def __init__(self):
self.example = Example()

def on_press(self, key):
if key == pynput.keyboard.Key.f12:
print("Starting Thread...")
self.example.start()

if key == pynput.keyboard.Key.esc:
self.example.join()
print("Exiting application...")
return False # Stop listener

example.py
from threading import Thread
from .delay import rand_sleep

class Example(Thread):
def run(self):
while True:
print("Hello, I am an Example :) ?") # This message appears in the console
rand_sleep(1, 2)

Проблема:
При нажатии клавиши F12 поток запускается и входит в бесконечный цикл, выводя сообщения на консоль. Это приводит к тому, что приложение не реагирует на другие горячие клавиши, например ESC, чтобы остановить выполнение.
Вопросы:
  • Как я могу заставить свое приложение реагировать на другие горячие клавиши во время работы потока?
  • Как правильно управлять потоками в этом сценарии, чтобы избежать бесконечного цикла, который зависает на компьютере?
  • Как правильно управлять потоками в этом сценарии, чтобы избежать бесконечного цикла, который зависает на компьютере?
  • li>
    Есть ли более эффективный или правильный способ реализовать эту функцию прослушивания горячих клавиш с помощью потоков?
Любая помощь будет очень полезна признателен!
@EDIT
После ответа @jupiterbjy я пришел к следующему решению (теперь оно работает так, как ожидалось!), но когда я попробуйте создать его еще раз, нажав горячую клавишу. Поток больше не существует, и его можно запустить только один раз:
class Example(Thread):
def __init__(self, event: Event) -> None:
super().__init__()
self.event = event

def run(self):
counter: Number = 0
while not self.event.is_set():
print("Hello, I am an Example :)? ")
rand_sleep(1, 2)
counter += 1
if counter > 5:
self.event.set()
# RuntimeError: threads can only be started once

class HotkeyListener:
def __init__(self):
self.thread_event = threading.Event()
self.example = Example(self.thread_event)

def on_press(self, key):
if key == pynput.keyboard.Key.f12:
print("---------------------", self.example)
# ---------------------
self.example.start()

if key == pynput.keyboard.Key.esc:
self.thread_event.set()
self.example.join()
print("Exiting application...")
return False # Stop listener


Подробнее здесь: https://stackoverflow.com/questions/785 ... p-and-resp

Вернуться в «Python»