본문으로 바로가기

파이썬(Python) PyQt5 QProgressBar 구현하기

category 파이썬/PyQt5 2021. 11. 1. 14:16
반응형

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_())

반응형