Написал на основе pydirectinput и pyqt5 простой антиафк, при нажатии кнопки запуск приложение вылетает, что делать?

использовал import pydirectinput as pyd
def add_functionts(self):
        self.btn_start.clicked.connect(self.start)
        self.btn_end.clicked.connect(self.end)
        self.gag= True
        self.start_thead=threading.Thread(target=self.start)
        self.start_thead.start()


    def start(self):
        print('start')
        while self.gag==True:
            pyd.press('w')




    def end(self):
        print('The end of the programm')
        self.gag =False
        return self.gag
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Приложение просто не отвечает после нажатия кнопки 'Запуск'(функция start)

Ну а что, логично. Читай как устроены оконные приложения, это же азы рабоыт с любым GUI.
Если кратко, у них в основе цикл, который принимает сообщения от ОС (нажата клавиша, сдвинута мышь, и т.д.) и обрабатывает их.
PyQT реализует этот цикл сам, ты имеешь дело только с обработчиками событий - но цикл от этого никуда не девается. Всё происходит в одном потоке, так что пока обработчик события работает - цикл стоит, следующие сообщения ждут очереди.
Так что когда ты делаешь while self.gag==True:, твой обработчик никогда не выйдет из цикла while, никогда не передаст управление оконному циклу, и щелчок по кнопке end никогда не будет обработан (кк и любое другое событие).

Что делать?
а) start запускает второй поток, end его останавливает. Кури документацию к модулю threading.
б) смотри, есть ли в PyQt способ запланировать вызов функции на следующей итерации оконного цикла/спустя некоторое время. В этом случае ты можешь раз за разом планировать вызов своей функции, которая реализует одну итерацию (гапример, шлёт одно нажатие кнопки). Поскольку её вызов будет выполняться средствами оконного цикла, а отрабатывать она будет быстро, это не помешает оконному циклу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы