본문 바로가기
대동단결 Python

메뉴엑션에 한글이름메쏘드 연결하기 : lambda

by 즐거운 지니 2021. 11. 16.
반응형

파이썬에서 한글이름의 변수명 또는 클래스명등 거의 모든 이름에 한글을 사용해도 무방 한 듯 하다.

그런데 메뉴액션에 연결할 메쏘드명에서 한글을 사용하면 프로그램이 제대로 실행되지 않은 채 별 에러메세지 송출없이 끝난다. 

예를들어 아래의 코드를 실행하면 

import sys
from PyQt5.QtWidgets import *

class Mywin(QMainWindow):
    def __init__(self):
        super(Mywin, self).__init__()
        menubar = QMenuBar(self)
        menu = menubar.addMenu('메뉴')
        action = QAction('그 함수 실행', self)
        action.triggered.connect(self.한글메소드명)
        menu.addAction(action)

    def 한글메소드명(self, thePara):
        print('메소드')
        print(f'thePara = {thePara}')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = Mywin()
    mywin.show()
    sys.exit(app.exec_())

 

그냥 이렇게 끝난다.

C:\ProgramData\Anaconda3\python.exe windowMenuTest.py

Process finished with exit code -1073741819 (0xC0000005)

 

이 문제는 다음과 같이 해결할 수 있다. 

import sys
from PyQt5.QtWidgets import *

class Mywin(QMainWindow):
    def __init__(self):
        super(Mywin, self).__init__()
        menubar = QMenuBar(self)
        menu = menubar.addMenu('메뉴')
        action = QAction('그 함수 실행', self)
        action.triggered.connect(self.engNameMethod())
        menu.addAction(action)

    def engNameMethod(self):
        self.한글메소드명('입력하고 싶은 파라미터')
        
    def 한글메소드명(self, thePara):
        print('메소드')
        print(f'thePara = {thePara}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = Mywin()
    mywin.show()
    sys.exit(app.exec_())

 

C:\ProgramData\Anaconda3\python.exe windowMenuTest.py
메소드
thePara = 입력하고 싶은 파라미터

 

즉, 영문이름매쏘드를 새로 만들어 대행하면 된다. 그런데 이게 꽤 코드를 지저분하게 만든다. 단지 다른 함수를 호출하는 이유 하나만으로 매쏘드를 만든다면 매쏘드 수가 그만큼 늘어나고 구지 한글명 메쏘드를 만들 필요도 없다. 이렇게 함수 주소는 필요하나 함수명이 필요없는 경우 lambda 키워드를 이용하는것이 효율적이다.

import sys
from PyQt5.QtWidgets import *

class Mywin(QMainWindow):
    def __init__(self):
        super(Mywin, self).__init__()
        menubar = QMenuBar(self)
        menu = menubar.addMenu('메뉴')
        action = QAction('그 함수 실행', self)
        action.triggered.connect(lambda _:self.한글메소드명('입력하고 싶은 파라미터'))
        menu.addAction(action)

    def 한글메소드명(self, thePara):
        print('메소드')
        print(f'thePara = {thePara}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = Mywin()
    mywin.show()
    sys.exit(app.exec_())

출력결과는 동일하다.

그리고, lambda를 이용하면 호출함수에 인수를 넣을 수 있으니, 일거양득.

반응형

'대동단결 Python' 카테고리의 다른 글

pyinstaller 사이즈 최적화  (0) 2022.04.16
pyautogui정리  (0) 2022.04.14
QThread 분산처리 : 작업처리후 자동소멸  (0) 2021.11.05
사용자 정의 시그널 만들기  (1) 2021.09.11
사용자 정의 시그널-슬롯  (0) 2021.05.14

댓글