티스토리 뷰

PyQt5로 GUI 기반의 앱을 개발할 때 UI를 만드는 방법은 두 가지가 있다.

  1. 하드코딩: UI의 디자인을 직접 코딩하여 만든다.
  2. 디자인툴, 여기서는 QtDesigner를 이용하여 WIWG화면으로 UI 파일을 만든다.

성향 차이가 있겠지만 왠지 방법 1에서 오타쿠 냄새가 심하게 난다. 그래서 더 구미가 끌리지만 아주 단순한 디자인의 앱을 개발하는 것이 아니라면 방법 2가 더 편한 방법이겠다. UI 디자인이 복잡하면 복잡할수록 방법 2의 경제성이 지약적으로 높아질 것이다. 방법 2로 결정하면 UI파일과 파이썬 코드를 연결하는 방법을 선택해야 한다. 다시 아래와 같은 두 개의 선지와 만나게 된다.

  1. ui 파일(xml)을 파이썬 코드로 변환하여 사용한다.
  2. ui 파일(xml)을 그대로 불러와서 쓴다.

방법 1와 같이 UI 파일을 Python 코드로 변환하려면 터미널을 이용해야하는 불편이 발생한다. 또 UI를 수정했을 때 코드를 수정하기 어렵고 최악의 경우에는 코드 전체를 다시 작성해야 하는 난관에 빠질 수 있다. 반면에 방법 2는 이런 문제점을 피할 수 있다.

방법 1

PyQt5는 UI 파일(xml)을 파이썬 코드로 자동으로 변환하는 pyuic.py을 제공합니다. 이 pyuic.py 파일은 XML 파일을 입력받은 후 이를 파이썬 코드로 변환합니다. 변환은 다음의 절차에 따라 진행한다.

  1. ui 파일이 설치된 폴더로 이동한다.
  2. python -m PyQt5.uic.pyuic -x [ui파일명.ui] -o [변환파일명.py]를 입력한다.

방법 2

UI와 UI의 이벤트 처리를 분리하여 코딩하는 방식입니다. 방법 1에 비하여 복잡한 듯하지만 개발이나 보수에 있어 보다 안전한 방법일 것이다.

코드 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
from PyQt5.QtWidgets import *
#    ui 파일을 불러오기 위한 패키지 
from PyQt5 import uic
 
#    form_class에 ui 파일을 로드한다.
form_class = uic.loadUiType("main_window.ui")[0]
 
 
#    윈도우 클래스를 정의할 때 인자로 ui 파일인 form_class를 전달한다.
class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
      
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()
cs

윈도우 클래스를 정의할 때 ui 파일을 인자로 전달하는 방법이다. 

코드 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
 
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
 
class Form(QWidget):
 
    def __init__(self):
        QWidget.__init__(self)
        self.ui = uic.loadUi("ui.ui", self)
        self.ui.show()
 
 
    def init_widget(self):
        self.setWindowTitle("Signal Slot")
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    exit(app.exec_())
cs

윈도우 클래스의 초기화 때 ui 파일을 로드하는 방법이다.

 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함
02-13 05:06