QProgressBar 는 사용자에게 작업 진행 정도를 시각적으로 알려주는 용도로 사용하는 뷰 위젯입니다. 위젯을 세팅할 때 최대와 최소를 설정하고 현재 진행된 값을 백분율로 계산해서 화면에 표시합니다. 주로 네트워크를 통해 파일을 다운받거나 시작과 끝이 있는 로직의 진행 사항을 표시할 때 사용합니다.
▼ 구현은 간단합니다. QProgressBar 를 만들고 생성자 함수로 self 를 넘깁니다. self 는 QMainWindow 를 가리킵니다. QProgressBar 는 생성자에서 QMainWindow 를 파라미터로 넘겼기 때문에 별도로 작업할 필요가 없습니다. 다음은 setGeometry() 함수로 QMainWindow 에서 QProgressBar 가 위치할 곳을 지정합니다.
# 프로그레시브바 생성해서 QMainWindow 추가
bar = QProgressBar(self)
# 메인 화면에서 프로그레시브바의 위치와 크기 조절
bar.setGeometry(10, 10, 200, 30)
▼ 다음에 사용할 함수인 setValue() 는 bar 에 색깔이 표시되는 영역의 크기를 말합니다. 화면에 표시되는 값은 전체 길이에서 % 로 계산해서 보여줍니다. setAlignment() 는 화면에 표시한 숫자 텍스트의 위치를 가리킵니다. 만약 Qt.AlignRight 값을 넘기면 바 오른쪽 끝에 표시합니다.
# 프로그레시브바 값을 세팅한다. 바의 크기를 나타낸다.
bar.setValue(70)
# 숫자값의 위치
bar.setAlignment(Qt.AlignCenter)
▼ ProgressBar 에 대한 제어 방법은 알아 봤습니다. 이제 타이머 객체(QTimer) 를 이용해서 1초 마다 ProgressBar 값을 증가시켜 화면에 진행 정도를 표시하는 기능을 구현할 것입니다. 화면에 가득차는 100% 가 되면 중지하도록 했습니다. 100% 판단은 ProgressBar 의 maximum() 으로 합니다. QTimer 는 stop() 함수로 중지합니다.
# Timer 세팅
self.timer.setInterval(1000)
self.timer.timeout.connect(self.timer_progress)
self.timer.start()
# progress 화면에 표시
def timer_progress(self):
count = self.bar.value()
count += 1
self.bar.setValue(count)
# ProgressBar의 값이 최대값 이상 Timer를 중지
if count >= self.bar.maximum():
# 버튼 활성화
self.start_btn.setEnabled(True)
self.timer.stop()
▼ 타이머 시작을 위해서 버튼의 clicked Signal 에 start_process() 함수를 연결했습니다. 버튼 클릭과 함께 start_process() 함수를 실행합니다. 함수에는 타이머 객체를 생성하고 설정값을 세팅하는 기능이 들어가 있습니다.
# 버튼 이벤트 연결
self.start_btn.clicked.connect(self.start_process)
▼ 전체 소스는 다음과 같습니다. 화면에 Start Button 을 클릭하면 1초에 한번씩 실행하는 타이머를 통해 ProgressBar 를 채우기 시작합니다.
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 위젯 추가
self.bar = QProgressBar(self) # progressbar
self.start_btn = QPushButton(self) # 시작 버튼 추가
self.timer = QTimer(self) # 타이머
# 윈도우 설정
self.setGeometry(500, 500, 400, 300) # x, y, w, h
self.init_ui()
# 화면 초기화
def init_ui(self):
# 메인 화면에서 프로그레시브바의 위치와 크기 조절
self.bar.setGeometry(10, 10, 200, 30)
# 프로그레시브바 값을 세팅한다. 바의 크기를 나타낸다.
self.bar.setValue(70)
# 숫자값의 위치
self.bar.setAlignment(Qt.AlignCenter)
# 기본 포맷을 다시 세팅한다.
self.bar.resetFormat()
# 버튼 위치 및 이름 넣기
self.start_btn.setGeometry(10, 50, 200, 30)
self.start_btn.setText('start button')
# 버튼 이벤트 연결
self.start_btn.clicked.connect(self.start_process)
# 타이머 시작
def start_process(self):
# 버튼 비활성화
self.start_btn.setEnabled(False)
# Timer 세팅
self.timer.setInterval(1000)
self.timer.timeout.connect(self.timer_progress)
self.timer.start()
# progress 화면에 표시
def timer_progress(self):
count = self.bar.value()
count += 1
self.bar.setValue(count)
# ProgressBar의 값이 최대값 이상 Timer를 중지
if count >= self.bar.maximum():
# 버튼 활성화
self.start_btn.setEnabled(True)
self.timer.stop()
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
'파이썬 > PyQt5' 카테고리의 다른 글
파이썬(Python) PyQt5 레이아웃 QGridLayout 구현하기 (0) | 2021.11.02 |
---|---|
파이썬(Python) PyQt5 QLineEdit 한 줄 입력 라인에디터 사용법 (0) | 2021.11.02 |
파이썬(Python) PyQt5 QDialog 위젯으로 새창 띄우기 (2) | 2021.11.01 |
파이썬(Python) PyQt5 QStatusBar 구현하기 (0) | 2021.11.01 |
파이썬(Python) PyQt5 QCheckBox 사용하기 (0) | 2021.11.01 |