QButtonGroup

QButtonGroup 은 버튼을

그룹으로 묶는 위젯입니다.

 

버튼들은 다 각자 작동하도록

되어 있습니다. 이것을 묶기 위해서는

QButtonGroup 을 사용하는데요.

 

하나를 선택한 다는 점에서

RadioButton 하고 비슷합니다.

 

아래 예제 코드에서는

버튼 인스턴스를 QButtonGroup 에

추가하는 것을 볼 수 있습니다.

 

각 버튼에 시그널을 설정하는게 아니라

그룹 하나에만 설정하면 되기 때문에

코드도 줄어듭니다.

 

그룹안에 있는 버튼을 클릭하면

아이디가 슬롯에 전달이 됩니다.

 

메소드에서는 아이디로 그룹안에 있는

버튼을 찾아서 각 버튼의 기능을

구현할 수 있습니다.

 

for 문과 if 문을 사용해서

아이디를 찾는 로직을 주의해서 봅니다.

 

버튼그룹에서 인덱스로 뭔가를 꺼내는데

필요한 알고리즘입니다.

 

 

from PyQt5.QtWidgets import (
    QWidget, QApplication, QGridLayout,
    QPushButton, QLabel, QButtonGroup
)
from PyQt5.QtCore import Qt

import sys

class MyApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("My App")

        layout = QGridLayout()
        self.setLayout(layout)

        self.label = QLabel()
        self.label.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.label, 1, 1)

        self.btnGroup = QButtonGroup()
        self.btnGroup.setExclusive(False)
        self.btnGroup.buttonClicked[int].connect(self.btnClicked)

        btn = QPushButton("Btn - 1")
        self.btnGroup.addButton(btn, 1)
        layout.addWidget(btn, 0, 0)

        btn = QPushButton("Btn - 2")
        self.btnGroup.addButton(btn, 2)
        layout.addWidget(btn, 0, 1)

        btn = QPushButton("Btn - 3")
        self.btnGroup.addButton(btn, 3)
        layout.addWidget(btn, 0, 2)

    def btnClicked(self, id):
        for button in self.btnGroup.buttons():
            if button is self.btnGroup.button(id):
                self.label.setText(button.text() + " Clicked")
                print(button.text() + " Clicked!")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    screen = MyApp()
    screen.resize(320, 200)
    screen.show()

    sys.exit(app.exec_())

QButtonGroup PyQt5
QButtonGroup PyQt5

 

QGroupBox

그룹박스는 그룹안에 한개의 박스를

넣을 수 있는 컨테이너 입니다.

 

박스안에는 위젯을 넣을 수 있습니다.

 

그룹박스 > 박스 > 위젯

 

의 포함관계입니다.

 

실행화면을 보면 테두리(Border)가 있어서

좀 깔끔하게 정리된 느낌입니다.

 

코드를 밑으로 주욱 쓰다보면

헷갈리기 쉬운데 주석으로

정리하는 것도 하나의 방법입니다.

 

또 약간 수고가 들긴 하지만

클래스를 사용해서 객체 지향 방식으로

작성할 수도 있습니다.(규모가 커질 때)

 

GUI 프레임워크는 단순 반복이 많아서

코드를 이해하는 것은 그렇게 어렵지 않을 겁니다.

 

그리고 GUI는 로직보다는 레이아웃이나

UI 디자인적 요소를 고려해야 하는데

미리 종이에 그림을 그려보는 것도 도움이 될 것 입니다.

 

from PyQt5.QtWidgets import (
    QWidget, QApplication, QGridLayout,
    QLabel, QGroupBox, QVBoxLayout, QHBoxLayout,
    QRadioButton
)
from PyQt5.QtCore import Qt

import sys

class MyApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("My App")

        layout = QGridLayout()
        self.setLayout(layout)

        # self.label = QLabel("Temp")
        # self.label.setAlignment(Qt.AlignCenter)
        # layout.addWidget(self.label)

        groupBox = QGroupBox("GroupBox Tut - 1")
        groupBox.setCheckable(True)
        layout.addWidget(groupBox)

        vBox = QVBoxLayout()
        groupBox.setLayout(vBox)

        radioBtn = QRadioButton("1 - Python")
        radioBtn.setChecked(True)
        vBox.addWidget(radioBtn)

        radioBtn = QRadioButton("2 - Java")
        vBox.addWidget(radioBtn)

        radioBtn = QRadioButton("3 - C++")
        vBox.addWidget(radioBtn)

        groupBoxBottom = QGroupBox("GroupBox Tut - 2")
        groupBoxBottom.setCheckable(True)
        layout.addWidget(groupBoxBottom)

        hBox = QHBoxLayout()
        groupBoxBottom.setLayout(hBox)

        labelInside = QLabel("Label inside - 1")
        hBox.addWidget(labelInside)

        labelInside = QLabel("Label inside - 2")
        hBox.addWidget(labelInside)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    screen = MyApp()
    screen.resize(320, 200)
    screen.show()

    sys.exit(app.exec_())

QGroupBox PyQt5
QGroupBox PyQt5

파이썬 tkinter GUI 계산기 만들기 | 파이썬 윈도우 프로그래밍

 

파이썬 tkinter GUI 계산기 만들기 | 파이썬 윈도우 프로그래밍

파이썬 tkinter GUI 계산기 파이썬으로 계산기를 만드는 방법은 수십가지가 넘을 것이다. 사실 파이썬 자체가 계산기이다. 컴퓨터의 Computing 의 원뜻은 계산하다는 뜻이다. 무슨 프로그램을 만들어

digiconfactory.tistory.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band