본문 바로가기
파이썬 (Python)/파이썬 GUI + PyQt5

파이썬 Python의 GUI 구현 PyQt5 Keyboard Click 이벤트 구현하기

by ★√★ 2021. 3. 1.

 안녕하세요, 이번에는 Keyboard에서 Key를 Click하면 발생하는 이벤트에 대해서 정리해서 설명을 드릴려고 합니다. 키보드 키를 누르면 이벤트가 발생하는 방식입니다.

 

 

PyQt5-Keyboard-Click-썸네일
PyQt5-Keyboard-Click

 

 

 이제까지 Mouse Click 이벤트 구현하기를 주로 정리하였는데, 키보드 키 이벤트와 함께 사용하시면 더 유용하게 사용하실 거 같습니다. 하나 하나 차근 차근 설명해 드리도록 하겠습니다. 

 


1. keyPressEvent (selfe):

 

: keyboard에서 key를 눌렀을 때 발생하는 event를 Handling 하는 함수라고 이해하시면 됩니다. 비슷하지만, 반대적인 행동으로 인한 발생하는 함수로는 keyReleaseEvent() 가 있습니다. 이 함수에 어떤 key를 눌렀을 때 어떤 event가 발생하는지를 선언할 예정입니다. 참고 자료는 아래 Link를 통해서 참조하시면 됩니다. 

 

[참조 자료 출처 : doc.qt.io/qt-5/qwidget.html#mousePressEvent ]

PyQt5-Keyboard-Click-이벤트-관련-사진1
PyQt5-Keyboard-Click-이벤트-관련-사진1

 

 

2. keyPressEventKeyboard Click 이벤트 구현을 위한 코드 구성하기

 

: Keyboard Click 이벤트를 구현하기 위해서 1번의 함수를 이용하여 아래와 같이 코드를 구현해보도록 하겠습니다. 주목할 사항은, 일단 event를 발생시킬 key들을 선언을 하고, 그 선언한 키들을 하나의 List에 묶습니다. 그리고 그 묶은 리스트안에 해당하지 않은 key들에 대한 예외 처리 코드도 선언할 예정입니다. 그럼 아래 코드를 참조 부탁 드립니다. 각 코드 마다, 설명이 필요한 부분은 주석 처리를 하였습니다. 

 

# 필요한 라이브러리 / 패키지를 선언함
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget
from PyQt5.QtCore import Qt


class Keyboard_Key_evnt_Menu(QMainWindow) :
    def __init__(self) :
        super() .__init__()

        self.setWindowTitle ("Keyboard Event") # Window Menu Title 설정
        self.resize (300, 300)
        self.statusbar = self.statusBar()
        self.show()

    # keyPressEvent 라는 함수를 이용하여, 활용할 Key를 선언
    def keyPressEvent(self, e):
            def key_sub_event(keyboard_key):
                key_group =[
                Qt.Key_Space,
                Qt.Key_Exclam,
                Qt.Key_QuoteDbl,
                Qt.Key_NumberSign,
                Qt.Key_Dollar,
                Qt.Key_Percent,
                Qt.Key_Ampersand,
                Qt.Key_Apostrophe,
                Qt.Key_ParenLeft,
                Qt.Key_ParenRight,
                Qt.Key_Asterisk,
                Qt.Key_Plus,
                Qt.Key_Comma,
                Qt.Key_Minus,
                Qt.Key_Period,
                Qt.Key_Slash,
                Qt.Key_0,
                Qt.Key_1,
                Qt.Key_2,
                Qt.Key_3,
                Qt.Key_4,
                Qt.Key_5,
                Qt.Key_6,
                Qt.Key_7,
                Qt.Key_8,
                Qt.Key_9,
                Qt.Key_Colon,
                Qt.Key_Semicolon,
                Qt.Key_Less,
                Qt.Key_Equal,
                Qt.Key_Greater,
                Qt.Key_Question,
                Qt.Key_At,
                Qt.Key_A,
                Qt.Key_B,
                Qt.Key_C,
                Qt.Key_D,
                Qt.Key_E,
                Qt.Key_F,
                Qt.Key_G,
                Qt.Key_H,
                Qt.Key_I,
                Qt.Key_J,
                Qt.Key_K,
                Qt.Key_L,
                Qt.Key_M,
                Qt.Key_N,
                Qt.Key_O,
                Qt.Key_P,
                Qt.Key_Q,
                Qt.Key_R,
                Qt.Key_S,
                Qt.Key_T,
                Qt.Key_U,
                Qt.Key_V,
                Qt.Key_W,
                Qt.Key_X,
                Qt.Key_Y,
                Qt.Key_Z,
                Qt.Key_BracketLeft,
                Qt.Key_Backslash,
                Qt.Key_BracketRight,
                Qt.Key_AsciiCircum,
                Qt.Key_Underscore,
                Qt.Key_QuoteLeft,
                Qt.Key_BraceLeft,
                Qt.Key_Bar,
                Qt.Key_BraceRight,
                Qt.Key_AsciiTilde]

                if keyboard_key in key_group:
                   return True
                else:
                   return False

            control = False

            if e.modifiers () & Qt.ControlModifier :
               self.statusbar.showMessage( "Control")
               control = True       # Control Value를 True로 선언함으로써 추가적인 Key Event를 수행할 수 있게 함

            if e.modifiers () & Qt.ShiftModifier :
               self.statusbar.showMessage("Shift")

            if e.modifiers () & Qt.AltModifier :
               self.statusbar.showMessage("Alt")

            if e.key () == Qt.Key_Delete :
               self.statusbar.showMessage("Delete")

            elif e.key () == Qt.Key_Backspace :
               self.statusbar.showMessage("Backspace")

            elif e.key () in [Qt.Key_Return, Qt.Key_Enter] :
               self.statusbar.showMessage("Enter")

            elif e.key () == Qt.Key_Escape :
               self.statusbar.showMessage("Escape")

            elif e.key () == Qt.Key_Right :
               self.statusbar.showMessage("Right")

            elif e.key () == Qt.Key_Left :
               self.statusbar.showMessage("Left")

            elif e.key () == Qt.Key_Up :
               self.statusbar.showMessage("Up")

            elif e.key () == Qt.Key_Down :
               self.statusbar.showMessage( "Down")

        # Control Key가 아니고, 위에 선언한 Key 중에 해당되지 않은 Key를 클릭했을 시에, 발생하는 Event를 선언
        # 예외 처리라고 간주해도 됨
            if not control and key_sub_event(e.key ()) :
               self.statusbar.showMessage(e.text ())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Keyboard_Key_evnt_Menu()
    sys.exit(app.exec_())

 

 

- 위 코드를 구현을 하면 Pop-up 메뉴의 status 창에 어떤 키를 클릭했는지를 보여 줍니다. 그럼 실제적으로 제가 아래 순서대로 클릭을 해보도록 하겠습니다. 아래 gif 파일을 보시면, 정상적으로 작동하는 걸 확인 하실 수 있습니다. 

 

 [Ctrl] - [Alt] - [Shift] - [A] - [a] 

 

PyQt5-Keyboard-Click-이벤트-관련-사진2
PyQt5-Keyboard-Click-이벤트-관련-사진2

 

 

 이상입니다. 지금까지 Keyboard에서 Key를 Click하면 발생하는 이벤트에 대해서 포스팅을 작성하였습니다.  위의 gif 파일 처럼 구현이 된다면, 잘 코드를 정리하신 것입니다. 제가 선언한 key or event 말고도, 자신만의 event도 만들어보면서 연습하시는 걸 추천 드립니다. 오늘도 공부하느라고 수고하셨구요. 같이 공부하고 같이 성장하시죠! 감사합니다.

 

 제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

 

[참조 자료 출처 : penguinitis.g1.xrea.com/computer/programming/Python/PyQt5/PyQt5-memo/PyQt5-memo.html ]


[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글