Окна с QRadioButton и QCheckBox
Имеется два приложения:
- Окно на основе
QRadioButton- модуль radio.py. - Окно на основе
QCheckBox- модуль chech.py.
Трудности: не получается в первом окне с QRadioButton реализовать иконку через setIcon() и нижнею отсечку кнопок (как на примере: на изображении №2).
Предполагаю что проблема в class’е.
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, но это уже другой вопрос.



