Python: запускать и останавливать заправку с помощью нажатия на клавиатуре - PullRequest
1 голос
/ 20 июня 2020

Я работаю над Python 3.8 и пытаюсь включить или выключить поток с помощью сочетания клавиш.

Это мой класс Thread:

import keyboard
from threading import Thread
import time

class PrintHi(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.active = False

    def run(self):
        while True:
            if self.active:
                print("Hi,", time.time())
                time.sleep(1)

Кажется, все работает по назначению. Я могу запустить поток, а затем изменить 'thread.active' на True или False, в зависимости от того, хочу ли я его включить или отключить.

Проблема в том, когда я пытаюсь используйте его с модулем "клавиатура", он не работает должным образом:

class KeyboardHook(object):
    def __init__(self):
        self.thread = PrintHi()
        self.thread.start()
        self.set_keyboard_hotkeys()

    def toggle_print(self):
        print("Toggle Print")
        self.thread.active = not self.thread.active

    def set_keyboard_hotkeys(self):
        print("Setting hotkeys hooks")
        keyboard.add_hotkey('ctrl+c', self.toggle_print)
        keyboard.wait()


if __name__ == '__main__':
    hook = KeyboardHook()

Вот шаги:

  • Сначала я создаю поток, сохраняю его в 'self.thread 'и запустите его.
  • Затем я установил хуки горячих клавиш клавиатуры
  • Когда я нажимаю' ctrl + c ', должна выполняться функция' toggle_print () '
  • Это должно установите для свойства active потока значение True, таким образом, разрешив печать.

Поток сам по себе работает нормально, и крючок клавиатуры сам по себе также работает нормально, но когда я объединяю оба, они не работают.

Кто-нибудь имеет представление, что я делаю не так? Есть ли способ включения и выключения потоков с помощью сочетаний клавиш? В моем приложении у меня будет несколько потоков, которые мне придется включать и выключать независимо.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Некоторые изменения в KeyboardHook запускают его:

  1. Вам не нужно использовать keyboard.wait ()
  2. Запускать поток после настройки горячих клавиш
  3. Лучше заменить горячую клавишу с ctrl- c на что-то другое
class KeyboardHook(object):
    def __init__(self):
        self.thread = PrintHi()
        self.set_keyboard_hotkeys()
        self.thread.start()

    def toggle_print(self):
        print("Toggle Print")
        self.thread.active = not self.thread.active

    def set_keyboard_hotkeys(self):
        print("Setting hotkeys hooks")
        keyboard.add_hotkey('ctrl+p', self.toggle_print)
        #keyboard.wait()
0 голосов
/ 20 июня 2020

Я бы посоветовал немного реорганизовать ваш код, а именно использовать Event в потоке печати вместо переменной bool, чтобы сигнализировать о действии печати, и добавить logi c, что позволит вам остановить поток принтера при выходе из программы:

import time
from threading import Thread, Event

import keyboard


class PrintThread(Thread):
    
    def __init__(self): 
        super().__init__() 
        self.stop = False 
        self.print = Event()

    def run(self): 
        while not self.stop: 
            if self.print.wait(1): 
                print('Hi,', time.time())
    
    def join(self, timeout=None): 
        self.stop = True 
        super().join(timeout)

Кроме того, я бы предложил переместить код блокировки из инициализатора KeyboadHook в отдельный метод start:

class KeyboardHook: 

    def __init__(self):
        self.printer = PrintThread()
        self.set_keyboard_hotkeys()

    def toggle_print(self): 
        print('Toggle the printer thread...')

        if self.printer.print.is_set():
            self.printer.print.clear()
        else:
            self.printer.print.set()

    def set_keyboard_hotkeys(self):
        print('Setting keyboard hotkeys...')
        keyboard.add_hotkey('ctrl+p', self.toggle_print)

    def start(self): 
        self.printer.start()

        try:
            keyboard.wait()
        except KeyboardInterrupt:
            pass
        finally:
            self.printer.join()

Запустите его так:

hook = KeyboardHook()
hook.start()

Этот код у меня работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...