ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PyQt5] 4. Event
    Python/PyQt5 2021. 5. 19. 12:36
    반응형

    signal, slot

    GUI에서 버튼이 클릭이 된다던지 등의 사건을 event라고 합니다. 

    event가 발생하면 (버튼이 눌러지면)
    그에 따른 일(창을 띄운다, 결과를 출력한다 등)을 해야겠죠?

    그것을 처리하는 함수를 event handler라고 합니다. 

    Qt에서는 event를 signal, event handler를 slot이라고 합니다. 

     

    이벤트 루프

    PyQt에서는 exec_()로 이벤트 루프를 실행한다고 했습니다.

    파이썬 2까지는 exec가 예약된 키워드였기 때문에
    exec에 밑줄이 추가되었습니다.
    파이썬 3부터는 exec가 예약된 키워드가 아닙니다.
    그래서 exec(), exec_() 모두 가능합니다.

     

    이벤트 루프란 다음과 유사합니다. 

    def mouse_clicked():
        print('마우스가 클릭되었습니다.')
    
    
    while True:
        a = input()
        if a == '마우스클릭':
            mouse_clicked()
    

    우리가 '마우스클릭'을 입력(이벤트, 시그널)하면
    루프(이벤트 루프)에 등록된
    if 문이 입력 내용을 확인 후 해당되는 
    함수(이벤트 핸들러, 슬롯)를 실행합니다. 

    이런 식으로 루프에 다른 이벤트를 등록할 수도 있겠죠?

    def mouse_clicked():
        print('마우스가 클릭되었습니다.')
    
    
    def backspace_pushed():
        print('백스페이스가 눌러졌습니다.')
    
    
    while True:
        a = input()
        if a == '마우스클릭':
            mouse_clicked()
        elif a == '백스페이스':
            backspace_pushed()
    

    위 과정을 이해한다면, 이 코드가 어떤 일을 하는지 이해할 수 있을 겁니다. 

    button1.clicked.connect(button_clicked)

     

    self

    지난 코드와 달리 button1 앞에 self가 추가되었습니다. 

    self는 클래스가 인스턴스(객체)화 되었을 때,
    객체 자기 자신을 의미합니다. 

    즉,
    인스턴스화 : 'my_window = MyWindow()' 실행 
    객체 : 'my_window'

    이 설명이 와닫지 않는다면..
    다음 방법으로 이해해 보십시오.. 

    클래스는 붕어빵틀,
    객체는 붕어빵,
    인스턴스화는 붕어빵틀로 붕어빵을 만드는 것.

    이 비유는 다 기억하시죠?

    인스턴스화는 여러 번 될 수 있고,
    인스턴스의 이름은 인스턴스화 될 때마다 달라집니다.

    self는
    이 클래스가 객체(인스턴스)화 될 때까지
    객체의 이름을 알 수 없으니
    클래스를 작성할 때 사용하는 
    객체의 임시 이름으로 생각해도 좋습니다.

    self를 붙여주면 인스턴스화 된 뒤,
    my_window.button1으로 이 친구를 찾을 수 있습니다. 

    즉, 이 속성(변수)가 선언된 함수 외의 다른 메서드(함수)에서
    이 친구를 불러야 할 일이 있다면 self를 붙여줘야 합니다. 

    당연히 다시 부를 필요가 없다면 굳이 self를 붙여줄 필요가 없습니다. 

    아래 코드에서 
    label은 뒤에 다른 함수(메서드)에서 찾으니까
    self.label 이어야 하는 반면에
    button1, button2는 다시 찾지 않기 때문에
    self가 꼭 필요한 건 아닙니다. 

    클래스, 인스턴스 등의 지식이 필요하시다면 다음 링크를 참고하시길...
    https://wikidocs.net/28    
    위 링크를 읽어보시고 다음 그림을 이해하시면 될 것 같네요.  

     

    버튼을 누르면 label에서 clicked를 출력하도록 코드를 작성해 보았습니다. 

    from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton
    
    
    class MyWindow(QMainWindow):
        def __init__(self):
            super(MyWindow, self).__init__()
            self.setWindowTitle('My App')
            self.setGeometry(100, 100, 300, 300)
    
            self.label = QLabel('label', self)
            self.label.move(10, 10)
    
            self.button1 = QPushButton('button1', self)
            self.button1.move(10, 50)
            self.button1.clicked.connect(self.button_clicked)
    
            button2 = QPushButton('button2', self)
            button2.move(10, 100)
    
        def button_clicked(self):
            self.label.setText('Clicked')
    
    
    app = QApplication([])
    my_window = MyWindow()
    my_window.show()
    app.exec_()
    

    https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_04.py

    self.button1에 
    self.button1.clicked.connect(self.button_clicked) 코드로
    self.button1이 클릭되면 self.button_clicked 함수(메서드)를 실행하라고 connect 해 주었습니다. 

    button2에 label1의 text를 지우는 기능을 추가하면 어떨까요?

    반응형
Designed by Tistory.