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
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