c. 파이썬

[파이썬 / 매크로 만들기](7) Thread 실행 중 강제 종료 버튼 이벤트

로봇쟁이 2024. 8. 23. 12:34

쓰레드가 실행 중에 종료 버튼을 누르면 정상 종료가 안되는 상황이 발생하는데 이를 방지하기 위해서 

강제 종료 버튼에 대한 이벤트를 만들어야 한다.

def closeEvent(self, QCloseEvent):

이제 종료 버튼을 누르면 closeEvent 함수가 동작한다.

그럼 기존 코드에 closeEvent 함수를 넣어서 macro 함수를 종료시켜주면 된다.

import sys
from PyQt5.QtWidgets import *
import pyautogui
import threading

class MacroApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUi()       
        self.state = 0
        
    def initUi(self):
        self.setGeometry(700, 450, 220, 100)
        self.setWindowTitle('Macro')
        self.btn = QPushButton(self)
        self.btn.setText("START")       # setText("START &f") shortcut - '&f' = 'Alt+f'
        self.btn.setEnabled(True)       # Enable, Disable 
        self.btn.resize(220,100)
        self.btn.clicked.connect(self.btnClicked)
        # pyautogui.press(['left', 'left', 'left'])       # 왼쪽 방향키를 세번 입력
        # pyautogui.press('left', presses=3)              # 왼쪽 방향키를 세번 입력
        # pyautogui.press('left', presses=3, interval=3)  # 왼쪽 방향키를 3초에 한번씩 세번 입력
        
    def btnClicked(self):
        if self.state == 0:
            self.btn.setText("STOP")
            self.state = 1
        else:
            self.btn.setText("START")
            self.state = 0
        self.macroThread()            
                
    def macroThread(self):
        self.macro = threading.Timer(1, self.macroThread)
        
        if self.state == 0: 
            self.macro.cancel()
        else:
            pyautogui.press('1', presses=1)
            self.macro.start()
                   
    def closeEvent(self, QCloseEvent):
        if self.state == 1:
            self.macro.cancel()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = MacroApp()
    ex.show()
    app.exec_()
반응형