Окна с QRadioButton и QCheckBox

Имеется два приложения:

  1. Окно на основе QRadioButton - модуль radio.py.
  2. Окно на основе QCheckBox - модуль chech.py.

Трудности: не получается в первом окне с QRadioButton реализовать иконку через setIcon() и нижнею отсечку кнопок (как на примере: на изображении №2).
Предполагаю что проблема в class’е.

1. введите сюда описание изображения 2. введите сюда описание изображения

P.S. предложения по улучшению кода приветствуются.


radio.py


import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QVBoxLayout, QWidget, QPushButton, QButtonGroup, QRadioButton,)


class Widg(QWidget, object):
    def __init__(self):
        super(Widg, self).__init__()
        self.setWindowTitle('Внимание!')
        # self.setIcon(self.Information)
        label_tk = QtWidgets.QLabel()
        label_tk.setText('     Необходимо выбрать браузер \n      \n ')
        label_p = QtWidgets.QLabel()
        label_p.setText('  ')

        self._dictRB = {
            'Coogle Chrome (рекомендуется)': False,
            'PhantomJS Driver': False,
            'rad3': False,
        }

        self.group = QButtonGroup()
        self.rad1 = QRadioButton("Coogle Chrome (рекомендуется)")
        self.rad2 = QRadioButton("PhantomJS Driver")
        self.rad3 = QRadioButton("rad3")

        self.btn1 = QPushButton('Старт')
        self.btn1.clicked.connect(lambda: self.btn1_Clicked(self.rad1.isChecked()))
        self.btn2 = QPushButton('Отмена')
        self.btn2.clicked.connect(self.btn2_Clicked)

        layout = QVBoxLayout()
        layout.addWidget(label_tk)
        layout.addWidget(self.rad1)
        layout.addWidget(self.rad2)
        layout.addWidget(label_p)
        layout.addWidget(self.btn1)
        layout.addWidget(self.btn2)

        self.group.addButton(self.rad1)
        self.group.addButton(self.rad2)
        self.group.addButton(self.rad3)
        self.group.buttonClicked.connect(self.check_button)

        self.setLayout(layout)
        self.show()

    def check_button(self, radioButton):
        if self._dictRB[radioButton.text()]:
            self._dictRB[radioButton.text()] = False
            self._dictRB['rad3'] = True
            self.rad2.setChecked(True)
        else:
            for b in self._dictRB:
                self._dictRB[b] = False
            self._dictRB[radioButton.text()] = True
        print("Нажата кнопка -> `{} ` - {}".format(radioButton.text(), radioButton.isChecked()))
        return radioButton

    def btn1_Clicked(self, radioButton):
        for b in self._dictRB:
            if self._dictRB[b] is False:
                pass
            elif radioButton:
                print('выбран: Coogle Chrome')
                # import image_chrome
                break
            else:
                print(' выбран: PhantomJS Driver')
                # import image
                break
        self.close()

    def btn2_Clicked(self):
        print(' нажата кнопка: отмена')
        self.close()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = Widg()
    ui.show()
    sys.exit(app.exec_())

chech.py


import sys, os
from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
from PyQt5.QtWidgets import (QWidget, QCheckBox, QMessageBox, )
from PyQt5.QtCore import (pyqtSlot, )

class MessageBox(QtWidgets.QMessageBox, QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Внимание!")
        self.setIcon(self.Critical)
        self.addButton(QtWidgets.QPushButton('Удалить'), QtWidgets.QMessageBox.YesRole)
        self.addButton(QtWidgets.QPushButton('Отмена'), QtWidgets.QMessageBox.NoRole)
        self.addCheckBox(self)

        currentClick = self.exec_()
        if currentClick == 0:
            print(' нажата кнопка = Удалить')
            print()

            if self.check1.isChecked() == False and \
               self.check2.isChecked() == False and \
               self.check3.isChecked() == False:
               self.not_del()
            else:
                if self.check1.isChecked() == True:
                    print(' значение CheckBox (1. ) =', self.check1.isChecked())
                    self.del_Doc()

                if self.check2.isChecked() == True:
                    print(' значение CheckBox (2. ) =', self.check2.isChecked())
                    self.del_Otv()

                if self.check3.isChecked() == True:
                    print(' значение CheckBox (3. ) =', self.check3.isChecked())
                    self.del_Im()
            self.message()
        if currentClick == 1:
            print(' нажата кнопка = Отмена')

    def addCheckBox(self, parentItem):
        self.l = QtWidgets.QVBoxLayout()
        lb1 = QtWidgets.QLabel("Файлы удалятся безвозвратно. \n              Вы уверены?", self)
        lb1.setGeometry(60, 15, 300, 40)
        lb2 = QtWidgets.QLabel('Следующие данные будут удалены:', self)
        lb2.setGeometry(20, 60, 350, 20)

        self._toggle = True
        self.check1 = QCheckBox('1.', self)
        self.check1.setGeometry(20, 85, 200, 20)
        self.check1.setChecked(self._toggle)

        self.check2 = QCheckBox('2.', self)
        self.check2.setGeometry(20, 105, 200, 20)
        self.check2.setChecked(self._toggle)

        self.check3 = QCheckBox('3.', self)
        self.check3.setGeometry(20, 125, 200, 20)
        self.check3.setChecked(self._toggle)

        self.check = QCheckBox('Выбрать все папки', self)
        self.check.setGeometry(20, 155, 200, 20)
        self.check.setChecked(self._toggle)

        self.check1.clicked.connect(self.chec_toggle)
        self.check2.clicked.connect(self.chec_toggle)
        self.check3.clicked.connect(self.chec_toggle)
        self.check.clicked.connect(self.chec_toggle)
        self.setLayout(self.l)

    @pyqtSlot()
    def chec_toggle(self):
        if self.sender() == self.check:
            if self._toggle == True:
                self.check1.setChecked(self._toggle)
                self.check2.setChecked(self._toggle)
                self.check3.setChecked(self._toggle)
            else:
                self.check1.setChecked(not self._toggle)
                self.check2.setChecked(not self._toggle)
                self.check3.setChecked(not self._toggle)
                self.check.setChecked(not self._toggle)

        elif self.sender() in (self.check1, self.check2, self.check3):
            self.check.setChecked(not self._toggle)

    def del_Doc(self): pass
    def del_Otv(self): pass
    def del_Im(self): pass

    def not_del(self):
        msgBox = QMessageBox(self)
        msgBox.setIcon(QMessageBox.Information)
        msgBox.setWindowTitle('Внимание!')
        msgBox.setText("   Ни одна папка не выбрана!   ")
        msgBox.exec_()

    def message(self):
        msgBox0 = QMessageBox(self)
        msgBox0.setIcon(QMessageBox.Information)
        msgBox0.setText('Операция очистки завершена.  ')
        msgBox0.exec_()

    def event(self, e):
        result = QtWidgets.QMessageBox.event(self, e)
        self.setMinimumWidth(0)
        self.setMaximumWidth(16777215)
        self.setMinimumHeight(0)
        self.setMaximumHeight(16777215)
        self.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding,
            QtWidgets.QSizePolicy.Expanding
        )
        self.resize(250, 230)
        return result

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = MessageBox()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

QLabel используется для отображения текста или изображения. Функциональность взаимодействия с пользователем не предусмотрена. Внешний вид метки можно настроить различными способами, и ее можно использовать для указания мнемонической клавиши фокуса для другого виджета.

введите сюда описание изображения


radio.py

import sys
# ??? from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QVBoxLayout, QWidget, QPushButton, 
    QButtonGroup, QRadioButton, QLabel, QApplication, QMessageBox,
    QHBoxLayout)
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt

# ??? ----------------> vvvvvv
# ? class Widg(QWidget, object):
class Widg(QWidget):
    def __init__(self):
        super(Widg, self).__init__()
        self.setWindowTitle('Внимание!')
        
        label_tk = QLabel()
# !!! +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        label_tk.setText('''
          <p> 
            <img src="smiley.gif" alt="icon face" 
             width="42" height="42" 
             style="vertical-align:top"> 
            Необходимо выбрать браузер.
          </p>
         ''')
# !!! +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        
        self.label_p = QLabel()
        
# ?         label_p.setText('  ')
# ?        self._dictRB = {
# ?            'Coogle Chrome (рекомендуется)': False,
# ?            'PhantomJS Driver': False,
# ?            'rad3': False,
# ?        }

        self.check_button = None                                        # !!! +++

        self.group = QButtonGroup()
        self.rad1 = QRadioButton("Coogle Chrome (рекомендуется)")
        self.rad2 = QRadioButton("PhantomJS Driver")
        self.rad3 = QRadioButton("rad3")                                  # ?

        self.btn1 = QPushButton('Старт')
# ?        self.btn1.clicked.connect(lambda: self.btn1_Clicked(self.rad1.isChecked()))
        self.btn1.clicked.connect(self.btn1_clicked)                     # !!! +++
        
        self.btn2 = QPushButton('Отмена')
        self.btn2.clicked.connect(self.btn2_clicked)

        layout = QVBoxLayout()
        layout.addWidget(label_tk, alignment=Qt.AlignCenter)
        layout.addWidget(self.rad1)
        layout.addWidget(self.rad2)
        layout.addWidget(self.label_p)
        
        layoutH = QHBoxLayout()
        layoutH.addWidget(self.btn1)
        layoutH.addWidget(self.btn2)
        layout.addLayout(layoutH)

        self.group.addButton(self.rad1)
        self.group.addButton(self.rad2)
        self.group.addButton(self.rad3)
        self.group.buttonClicked.connect(self.group_check_button)

        self.setLayout(layout)
# ?        self.show()

# !!! +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def group_check_button(self, rb):
        self.check_button = rb

    def btn1_clicked(self):                            # ?  , radioButton):
        if not self.check_button:
            msg = QMessageBox.information(
                self, 
                'Внимание', 
                'Вы не сделали выбор?')
            return
        print(f'Выбран: {self.check_button.text()}')
        self.label_p.setText(f'Выбран: {self.check_button.text()}')
# !!! +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def btn2_clicked(self):
        print('Нажата кнопка: отмена')
        self.close()
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Widg()
    w.resize(250, 250)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения


У вас есть проблемы с вашим вторым модулем chech.py, но это уже другой вопрос.

→ Ссылка