본문 바로가기
Python/자동화도구

pyqt6 간단한 활용법 정리(Pushbutton, textedit, textbrowser, label)

by 하나다음은둘 2023. 3. 29.

pyqt6 의 간단한 활용법을 설명드리겠습니다.(visual studio 2019 에서 사용하였습니다.)

 

pyqt6에서 지원하는 designer tools을 사용하였고 이제 시작합니다!

 

설치방법 - 아래 모듈을 설치합니다.
pyqt6 설치 : pip install pyqt6
qt desinger 설치 : pip install pyqt6-tools

 

1. pyqt6-tools designer  실행

1.1 아래와 같이 PowerShell에 "pyqt6-tools designer" 라고 입력 후 엔터

1.2 실행 후 화면은 아래와 같이 나옵니다.

1.3 Main Window 를 클릭 후 "생성" 버튼 클릭!

1.4 아래와 같은  MainWindow 가 나오게 됩니다. 아무 것도 없죠? 

1.5 아래와 같이 만들어 봅시다. (목표에 맞춰서 대충 만드셔도 됩니다. 설명해드리려고 label을 넣었어요)

목표 : 맨 위에 텍스트 입력 > 버튼 클릭 > 위에서 입력된 텍스트 아래에 출력

좌측 위젯 상자에서 drag&drop을 하여 우측에 넣을 수 있습니다. 

사용된 위젯은 4개 입니다. 

- Display Widgets > Label

- Display Widgets > Text Browser

- Input Widgets > Text Edit

- Buttons > Push Button

MainWindow, push button 등 크기는 마우스로 직접 수정도 가능하고 각 위젯을 클릭했을 때 우측에 QWidget 항목 중 geometry를 이용하면 원하는 위치 및 크기를 설정할 수 있습니다.(아래 스크린샷)

1.6 저장

파일>저장 or 다른 이름으로 저장 을 하여 본인의 workspace경로에 해당 파일을 저장합니다.

저는 pyqt6_excercise.ui 파일로 저장하였습니다. 

1.7 QT Designer에서 만든 .ui 파일에서 .py 파일로의 변환!

개발자 명령 프롬프트에 아래 명령어를 넣으면 됩니다. 1.6에서 생성한 .ui파일을 아래 경로에다가 넣어줘야 합니다!

 

생성 규칙 : pyuic6 -x .\<내가 생성한 ui파일이름.ui> -o <생성 할 py파일이름.py>

예제 : pyuic6 -x .\pyqt6_excercise.ui -o pyqt6_excercise.py

아래와 같이 입력하고 enter! 그러면 동일 폴더 내에 아래와 같이 .py파일이 생성된 것을 확인할 수 있습니다.

 

2. 생성된 pyqt6_excercise.py 파일 분석하기
아래는 자동생성된 pyqt6_excercise.py 파일 전체 코드입니다.

음.. 엄청 복잡해보이죠? 사실 복잡하지 않습니다. 그냥 우리가 QT Designer에서 만든 것들을 코딩해준 거에요! 아래 내용을 직접 코딩해서 쓸 수도 있습니다. 다만 좌표값, 각종 크기등을 직접 설정하는 것이 번거롭기 때문에 도와주는 것이죠.

코드를 설명드리면

라인12 : Ui_MainWindow라는 class를 정의하고

라인13 : setupUi 매써드(내가 만든 블럭들의 위치, 크기를 셋팅해준 곳 입니다.)

라인48 : retranslateUi 매써드(유저가 pyqt6에서 직접 적은 내용을 하나의 메써드에 몰아놨네요)

라인57 : main함수(main함수 내용은 아래 글을 읽으시면 됩니다.)

python main함수 만들기(if __name=="__main__": ) (tistory.com)

 

python main함수 만들기(if __name=="__main__": )

아래 출처의 내용을 아주 간략하게 제가 간략하게 이해하고자 적었습니다. 자세한 내용도 좋지만 요약해 놓으면 좋으니까요^^ 자세한 내용은 아래 출처에서 확인하시면 됩니다. 출처 : https://www.

one-next-two.tistory.com

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Form implementation generated from reading ui file '.\pyqt6_excercise.ui'
#
# Created by: PyQt6 UI code generator 6.4.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again.  Do not edit this file unless you know what you are doing.
 
 
from PyQt6 import QtCore, QtGui, QtWidgets
 
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(591325)
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(401207524))
        self.pushButton.setObjectName("pushButton")
        self.textEdit = QtWidgets.QTextEdit(parent=self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(404024151))
        self.textEdit.setObjectName("textEdit")
        self.textBrowser = QtWidgets.QTextBrowser(parent=self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(4019024151))
        self.textBrowser.setObjectName("textBrowser")
        self.label = QtWidgets.QLabel(parent=self.centralwidget)
        self.label.setGeometry(QtCore.QRect(402045116))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(4017046116))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(4010030116))
        self.label_3.setObjectName("label_3")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0059122))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow""MainWindow"))
        self.pushButton.setText(_translate("MainWindow""PushButton"))
        self.label.setText(_translate("MainWindow""TextLabel - 아래 텍스트를 입력하세요. 아래는 Input Widgets의 Text Edit 입니다."))
        self.label_2.setText(_translate("MainWindow""TextLabel - 위의 텍스트가 아래 입력됩니다. Display Widgets의 Text Browser 입니다."))
        self.label_3.setText(_translate("MainWindow""TextLabel - 텍스트를 입력하고 아래 버튼을 누르세요"))
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())
 
cs

사실 위의 코드를 하나씩 설명을 할 수 있습니다만 잘 보면 다 비슷하다는 것을 알 수 있습니다. 그 중에 하나만 설명드려도 나머지는 이해가 되실거에요.

 

아래 pushButton코드설명을 드리면

라인1 : QtWidgets이라는 모듈 안에 QPushButton class의 instance를  Ui_MainWindow class내 인스턴스 변수에 넣습니다.

라인2 : 그러면 self.pushButton instance 클래스내 setGeometry 메써드를 호출 할 것인데 argument에는 QtCore모듈의 QRect class의 parameter를 확인해보니 aleft, atop, awidth, aheight 인 것으로보니

aleft는 왼쪽으로부터 40, atop은 위로부터 120, awidth는 너비 75, aheight는 높이 24 라고 볼 수 있겠네요! 

get rect를 통해 해당 데이터를 tuple로도 가져올 수 있음
tuple 결과값

라인 3 : 해당 버튼의 이름을 변경!

1
2
3
    self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(401207524))
    self.pushButton.setObjectName("pushButton")
cs

QRect class

자 이제 나머지도 다 비슷하게 생겼으니 설명은 이만하고 실제 구현을 해볼까요?

1
2
3
4
5
6
7
8
9
10
def click_button(self):
    self.pushButton.clicked.connect(self.get_texteditdata)   
    self.pushButton.clicked.connect(self.set_textbrowser)
 
def get_texteditdata(self):
    self.text_value = self.textEdit.toPlainText()
 
def set_textbrowser(self):
    self.textBrowser.setPlainText(self.text_value)
cs

위의 3가지 매써드만 있으면 구현이 가능합니다!! 간단하죠?

위의 메써드는 class Ui_MainWindow(object) class내 함수입니다.

click button 매써드에서 버튼이 클릭 되었을 때 함수를 실행하는 식으로 진행을 합니다. 

1) def click_button(self):

self.pushButton.clicked.connect(self.get_texteditdata)  는 버튼이 클릭되었을때 연결해라 parameter안에 있는 self.get_texteditdata함수를 호출해라

self.pushButton.clicked.connect(self.set_textbrowser)  는 버튼이 클릭되었을때 연결해라 parameter안에 있는 self.set_textbrowser함수를 호출해라

2) def get_texteditdata(self):

self.text_value = self.textEdit.toPlainText() 는 TextEdit에 쓰여있는 글자를 가져와서 self.text_value 인스턴스변수에 값을 넣습니다.

3)  def set_textbrowser(self):

self.textBrowser.setPlainText(self.text_value) 는 textBrowser에 text를 Plaintext형식의 글을 넣을 것인데 2)에서 self.text_value 인스턴스변수에 저장된 문자열 값을 넣습니다.

toPlainText() TextEdit에 쓰여있는 글자를 가져옵니다.
.setPlainText(String) TextEdit에 PlainText 형식의 글을 새로 입력합니다. Parameter에는 TextEdit에 표시할 글자가 들어갑니다.
.setText(String) TextEdit에 RichText 형식의 글을 입력합니다. Parameter에는 TextEdit에 표시할 글자가 들어갑니다.
.append(String) TextEdit에 글자를 추가합니다. 추가된 글자는 다음줄에 표시되며, Parameter에는 추가할 글자가 들어갑니다.
.clear() TextEdit에 쓰여있는 글자를 지웁니다.

마지막으로 main함수에 ui.click_button() 클래스 함수를 불러오면 됩니다. 그리고 실행!

아래와 같이 실행이 됩니다!!

textlabel에 "Hello, World!!" 란 텍스트 값을 넣고 PushButton을 누르면 아래와 같이 잘 출력 되는 것을 볼 수 있습니다.

 

마지막으로 Pyqt6를 이용하여 아주 간단한 프로그램을 만들어 보았습니다. 

다들 즐코딩 하세요!

댓글