Форум сайта python.su
Подскажите, есть в QtWidgets.QInputDialog метод, что бы вызвать диалоговое окно с радио кнопками как по аналогии с выпадающим списком в примере?
from PyQt5 import QtCore, QtGui, QtWidgets import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(517, 227) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.toolButton = QtWidgets.QToolButton(self.centralwidget) self.toolButton.setGeometry(QtCore.QRect(80, 30, 25, 19)) self.toolButton.setObjectName("toolButton") self.toolButton_2 = QtWidgets.QToolButton(self.centralwidget) self.toolButton_2.setGeometry(QtCore.QRect(80, 100, 25, 19)) self.toolButton_2.setObjectName("toolButton_2") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(160, 40, 47, 13)) self.label.setStyleSheet("background-color: rgb(170, 255, 127);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(150, 100, 47, 13)) self.label_2.setStyleSheet("background-color: rgb(255, 255, 127);") self.label_2.setObjectName("label_2") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.toolButton.setText(_translate("MainWindow", "...")) self.toolButton_2.setText(_translate("MainWindow", "...")) self.label.setText(_translate("MainWindow", "TextLabel")) self.label_2.setText(_translate("MainWindow", "TextLabel")) class Proba(QtWidgets.QMainWindow): def __init__(self): super(Proba, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.toolButton.clicked.connect(self.setItem) def setItem(self): items = {"Spring", "Summer", "Fall", "Winter"} item, ok = QtWidgets.QInputDialog.getItem(self, "QInputDialog.getItem()", "Season:", items, 0, False) if ok and item: self.ui.label.setText(str(item)) app = QtWidgets.QApplication([]) application = Proba() application.show() sys.exit(app.exec())
Офлайн
QInputDialog поддерживает только простой текстовый ввод через QLineEdit и выбор из списка через QComboBox.
То что вы хотите, вполне несложно реализовать самому, отнаслодовавшись от класса QDialog.
Офлайн
DOOMerСпасибо! Подскажите, пожалуйста, как из второго окна (класс Proba_2 функция ok_butt) передать значение (в моем случае переменная ss) в первое окно (класс Proba, label_2) по нажатию кнопки Ок во втором окне с его закрытием?
QInputDialog поддерживает только простой текстовый ввод через QLineEdit и выбор из списка через QComboBox. То что вы хотите, вполне несложно реализовать самому, отнаслодовавшись от класса QDialog.
from PyQt5 import QtCore, QtGui, QtWidgets import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(517, 227) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.toolButton = QtWidgets.QToolButton(self.centralwidget) self.toolButton.setGeometry(QtCore.QRect(80, 30, 25, 19)) self.toolButton.setObjectName("toolButton") self.toolButton_2 = QtWidgets.QToolButton(self.centralwidget) self.toolButton_2.setGeometry(QtCore.QRect(80, 100, 25, 19)) self.toolButton_2.setObjectName("toolButton_2") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(160, 40, 120, 13)) self.label.setStyleSheet("background-color: rgb(170, 255, 127);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(150, 100, 120, 13)) self.label_2.setStyleSheet("background-color: rgb(255, 255, 127);") self.label_2.setObjectName("label_2") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.toolButton.setText(_translate("MainWindow", "...")) self.toolButton_2.setText(_translate("MainWindow", "...")) self.label.setText(_translate("MainWindow", "Выпадающий список")) self.label_2.setText(_translate("MainWindow", "Радио кнопки")) class Ui_MainWindow_2(object): def setupUi_2(self, MainWindow_2): MainWindow_2.setObjectName("MainWindow_2") MainWindow_2.resize(400, 250) self.centralwidget_1 = QtWidgets.QWidget(MainWindow_2) self.centralwidget_1.setObjectName("centralwidget") self.radioButton = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton.setGeometry(QtCore.QRect(90, 80, 82, 17)) self.radioButton.setObjectName("radioButton") self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_2.setGeometry(QtCore.QRect(90, 110, 82, 17)) self.radioButton_2.setObjectName("radioButton_2") self.radioButton_3 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_3.setGeometry(QtCore.QRect(90, 150, 82, 17)) self.radioButton_3.setObjectName("radioButton_3") self.radioButton_4 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_4.setGeometry(QtCore.QRect(90, 190, 82, 17)) self.radioButton_4.setObjectName("radioButton_4") self.pushButton = QtWidgets.QPushButton(self.centralwidget_1) self.pushButton.setGeometry(QtCore.QRect(150, 120, 75, 23)) self.pushButton.setObjectName("ок") self.label = QtWidgets.QLabel(self.centralwidget_1) self.label.setGeometry(QtCore.QRect(150, 70, 61, 16)) self.label.setStyleSheet("background-color: rgb(170, 255, 127);") MainWindow_2.setCentralWidget(self.centralwidget_1) self.statusbar = QtWidgets.QStatusBar(MainWindow_2) self.statusbar.setObjectName("statusbar") MainWindow_2.setStatusBar(self.statusbar) self.retranslateUi(MainWindow_2) QtCore.QMetaObject.connectSlotsByName(MainWindow_2) def retranslateUi(self, MainWindow_2): _translate = QtCore.QCoreApplication.translate MainWindow_2.setWindowTitle(_translate("MainWindow_2", "MainWindow")) self.radioButton.setText(_translate("MainWindow_2", "1")) self.radioButton_2.setText(_translate("MainWindow_2", "2")) self.radioButton_3.setText(_translate("MainWindow_2", "3")) self.radioButton_4.setText(_translate("MainWindow_2", "4")) self.pushButton.setText(_translate("MainWindow_2", "ok")) class Proba(QtWidgets.QMainWindow): def __init__(self): super(Proba, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.toolButton.clicked.connect(self.setItem) self.ui.toolButton_2.clicked.connect(self.setItem_2) def setItem(self): items = {"Spring", "Summer", "Fall", "Winter"} item, ok = QtWidgets.QInputDialog.getItem(self, "QInputDialog.getItem()", "Season:", items, 0, False) if ok and item: self.ui.label.setText(str(item)) def setItem_2(self): self.application_2 = Proba_2() self.application_2.show() class Proba_2(QtWidgets.QMainWindow): def __init__(self): super(Proba_2, self).__init__() self.ui_2 = Ui_MainWindow_2() self.ui_2.setupUi_2(self) self.ui_2.radioButton.toggled.connect(self.updateLabel) self.ui_2.radioButton_2.toggled.connect(self.updateLabel) self.ui_2.radioButton_3.toggled.connect(self.updateLabel) self.ui_2.radioButton_4.toggled.connect(self.updateLabel) self.ui_2.pushButton.clicked.connect(self.ok_butt) def updateLabel(self): global ss rbtn = self.sender() if rbtn.isChecked(): if rbtn.text() == '1': self.ui_2.label.setText('Один') ss = 'Один' elif rbtn.text() == '2': self.ui_2.label.setText('Два') ss = 'Два' elif rbtn.text() == '3': self.ui_2.label.setText('Три') ss = 'Три' elif rbtn.text() == '4': self.ui_2.label.setText('Четыре') ss = 'Четыре' return ss def ok_butt(self): print(ss) app = QtWidgets.QApplication([]) application = Proba() application.show() sys.exit(app.exec())
Офлайн
вот так вроде должно бы работать, но нет
def ok_butt(self): self.aa = Proba() self.aa.ui.label_2.setText(ss) self.close() print(ss)
Офлайн
PacifistДа как же оно будет работать? Вы создали объект класса Proba, установили ему какие-то свойства, но ведь это не тот объект, который вы создали ранее application = Proba(). Вам надо при создании объекта Proba_2 передать ему в конструктор объект application, сохранить его в свойстве и уже дальше работать с этим свойством.
вот так вроде должно бы работать
Офлайн
Pacifist1. Диалог с радио-кнопками у вас наследуется от QMainWindow - в принципе так можно, но лучше его наследовать от класса QDialog, который предназначен именно для создания разного рода диалогов. Делать все окна “главными”, не лучшая практика. Соответственно вот так будет выглядеть ваш класс UI для диалога:
Подскажите, пожалуйста, как из второго окна (класс Proba_2 функция ok_butt) передать значение (в моем случае переменная ss) в первое окно (класс Proba, label_2) по нажатию кнопки Ок во втором окне с его закрытием?
class Ui_Dialog_2(object): def setupUi_2(self, Dialog2): Dialog2.setObjectName("MainWindow_2") Dialog2.resize(400, 250) self.centralwidget_1 = QtWidgets.QWidget(Dialog2) self.centralwidget_1.setObjectName("centralwidget") self.radioButton = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton.setGeometry(QtCore.QRect(90, 80, 82, 17)) self.radioButton.setObjectName("radioButton") self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_2.setGeometry(QtCore.QRect(90, 110, 82, 17)) self.radioButton_2.setObjectName("radioButton_2") self.radioButton_3 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_3.setGeometry(QtCore.QRect(90, 150, 82, 17)) self.radioButton_3.setObjectName("radioButton_3") self.radioButton_4 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_4.setGeometry(QtCore.QRect(90, 190, 82, 17)) self.radioButton_4.setObjectName("radioButton_4") self.pushButton = QtWidgets.QPushButton(self.centralwidget_1) self.pushButton.setGeometry(QtCore.QRect(150, 120, 75, 23)) self.pushButton.setObjectName("ок") self.label = QtWidgets.QLabel(self.centralwidget_1) self.label.setGeometry(QtCore.QRect(150, 70, 61, 16)) self.label.setStyleSheet("background-color: rgb(170, 255, 127);") # MainWindow_2.setCentralWidget(self.centralwidget_1) self.statusbar = QtWidgets.QStatusBar(Dialog2) self.statusbar.setObjectName("statusbar") # Dialog2.setStatusBar(self.statusbar) self.retranslateUi(Dialog2) QtCore.QMetaObject.connectSlotsByName(Dialog2) def retranslateUi(self, MainWindow_2): _translate = QtCore.QCoreApplication.translate MainWindow_2.setWindowTitle(_translate("MainWindow_2", "MainWindow")) self.radioButton.setText(_translate("MainWindow_2", "1")) self.radioButton_2.setText(_translate("MainWindow_2", "2")) self.radioButton_3.setText(_translate("MainWindow_2", "3")) self.radioButton_4.setText(_translate("MainWindow_2", "4")) self.pushButton.setText(_translate("MainWindow_2", "ok"))
self.ss = None
class Proba(QtWidgets.QMainWindow): def __init__(self): super(Proba, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.toolButton.clicked.connect(self.setItem) self.ui.toolButton_2.clicked.connect(self.setItem_2) def setItem(self): items = {"Spring", "Summer", "Fall", "Winter"} item, ok = QtWidgets.QInputDialog.getItem(self, "QInputDialog.getItem()", "Season:", items, 0, False) if ok and item: self.ui.label.setText(str(item)) def setItem_2(self): self.application_2 = Proba_2() # self.application_2.show() result = self.application_2.exec() if result == QtWidgets.QDialog.Accepted and self.application_2.ss is not None: print(self.application_2.ss) self.ui.label_2.setText(self.application_2.ss) # class Proba_2(QtWidgets.QMainWindow): class Proba_2(QtWidgets.QDialog): def __init__(self): super(Proba_2, self).__init__() self.ui_2 = Ui_Dialog_2() self.ui_2.setupUi_2(self) self.ui_2.radioButton.toggled.connect(self.updateLabel) self.ui_2.radioButton_2.toggled.connect(self.updateLabel) self.ui_2.radioButton_3.toggled.connect(self.updateLabel) self.ui_2.radioButton_4.toggled.connect(self.updateLabel) # self.ui_2.pushButton.clicked.connect(self.ok_butt) self.ui_2.pushButton.clicked.connect(self.accept) self.ss = None def updateLabel(self): # global ss rbtn = self.sender() if rbtn.isChecked(): if rbtn.text() == '1': self.ui_2.label.setText('Один') self.ss = 'Один' elif rbtn.text() == '2': self.ui_2.label.setText('Два') self.ss = 'Два' elif rbtn.text() == '3': self.ui_2.label.setText('Три') self.ss = 'Три' elif rbtn.text() == '4': self.ui_2.label.setText('Четыре') self.ss = 'Четыре' # def ok_butt(self) -> (str, bool): # print(self.ss)
Отредактировано DOOMer (Ноя. 20, 2020 16:34:45)
Офлайн
Подскажите, пожалуйста, на что влияет указание класса Proba и self в функции super? В каких-то примерах, класс указывается, в каких-то нет
super(Proba_2, self).__init__()
Офлайн
это для совместимости со вторым питоном
синтаксис без self работает только в третьем, во втором self должен присутствовать
Отредактировано FishHook (Ноя. 25, 2020 14:52:24)
Офлайн
Есть еще вопрос: вывел выпадающий список из QtWidgets.QInputDialog в отдельное окно диалога (мне сложно в QInputDialog настроить стиль). При открытии диалогового окна с выпадающим списком в comboBox сразу стоит значение (Spring), но оно не передается по нажатию Ок (нужно выбрать что-то иное, потом Spring). Можно сделать, что бы сразу можно было выбрать первое (дефолтное) значение, не раскрывая список?
from PyQt5 import QtCore, QtGui, QtWidgets import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(517, 227) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.toolButton = QtWidgets.QToolButton(self.centralwidget) self.toolButton.setGeometry(QtCore.QRect(80, 30, 25, 19)) self.toolButton.setObjectName("toolButton") self.toolButton_2 = QtWidgets.QToolButton(self.centralwidget) self.toolButton_2.setGeometry(QtCore.QRect(80, 100, 25, 19)) self.toolButton_2.setObjectName("toolButton_2") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(160, 40, 120, 13)) self.label.setStyleSheet("background-color: rgb(170, 255, 127);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(150, 100, 120, 13)) self.label_2.setStyleSheet("background-color: rgb(255, 255, 127);") self.label_2.setObjectName("label_2") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.toolButton.setText(_translate("MainWindow", "...")) self.toolButton_2.setText(_translate("MainWindow", "...")) self.label.setText(_translate("MainWindow", "Выпадающий список")) self.label_2.setText(_translate("MainWindow", "Радио кнопки")) class Ui_Dialog_1(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(400, 300) self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.comboBox = QtWidgets.QComboBox(Dialog) self.comboBox.setGeometry(QtCore.QRect(60, 70, 221, 22)) self.comboBox.setObjectName("comboBox") self.retranslateUi(Dialog) self.buttonBox.accepted.connect(Dialog.accept) self.buttonBox.rejected.connect(Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) class Ui_Dialog_2(object): def setupUi_2(self, Dialog2): Dialog2.setObjectName("MainWindow_2") Dialog2.resize(400, 250) self.centralwidget_1 = QtWidgets.QWidget(Dialog2) self.centralwidget_1.setObjectName("centralwidget") self.radioButton = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton.setGeometry(QtCore.QRect(90, 80, 82, 17)) self.radioButton.setObjectName("radioButton") self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_2.setGeometry(QtCore.QRect(90, 110, 82, 17)) self.radioButton_2.setObjectName("radioButton_2") self.radioButton_3 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_3.setGeometry(QtCore.QRect(90, 150, 82, 17)) self.radioButton_3.setObjectName("radioButton_3") self.radioButton_4 = QtWidgets.QRadioButton(self.centralwidget_1) self.radioButton_4.setGeometry(QtCore.QRect(90, 190, 82, 17)) self.radioButton_4.setObjectName("radioButton_4") self.pushButton = QtWidgets.QPushButton(self.centralwidget_1) self.pushButton.setGeometry(QtCore.QRect(150, 120, 75, 23)) self.pushButton.setObjectName("ок") self.label = QtWidgets.QLabel(self.centralwidget_1) self.label.setGeometry(QtCore.QRect(150, 70, 61, 16)) self.label.setStyleSheet("background-color: rgb(170, 255, 127);") # MainWindow_2.setCentralWidget(self.centralwidget_1) self.statusbar = QtWidgets.QStatusBar(Dialog2) self.statusbar.setObjectName("statusbar") # Dialog2.setStatusBar(self.statusbar) self.retranslateUi(Dialog2) QtCore.QMetaObject.connectSlotsByName(Dialog2) def retranslateUi(self, Ui_Dialog_2): _translate = QtCore.QCoreApplication.translate Ui_Dialog_2.setWindowTitle(_translate("MainWindow_2", "MainWindow")) self.radioButton.setText(_translate("MainWindow_2", "1")) self.radioButton_2.setText(_translate("MainWindow_2", "2")) self.radioButton_3.setText(_translate("MainWindow_2", "3")) self.radioButton_4.setText(_translate("MainWindow_2", "4")) self.pushButton.setText(_translate("MainWindow_2", "ok")) class Proba(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.toolButton.clicked.connect(self.setItem) self.ui.toolButton_2.clicked.connect(self.setItem_2) def setItem(self): self.application_1 = Proba_1() result = self.application_1.exec() if result == QtWidgets.QDialog.Accepted: self.ui.label.setText(str(self.application_1.zdan)) def setItem_2(self): self.application_2 = Proba_2() result = self.application_2.exec() if result == QtWidgets.QDialog.Accepted and self.application_2.ss is not None: print(self.application_2.ss) self.ui.label_2.setText(self.application_2.ss) class Proba_1(QtWidgets.QDialog): def __init__(self): super().__init__() self.ui_2 = Ui_Dialog_1() self.ui_2.setupUi(self) self.ui_2.comboBox.addItems(["Spring", "Summer", "Fall", "Winter"]) self.ui_2.comboBox.currentIndexChanged[str].connect(self.vyb_zdan) self.ui_2.buttonBox.clicked.connect(self.accept) self.zdan = None def vyb_zdan(self, item): self.zdan = item class Proba_2(QtWidgets.QDialog): def __init__(self): super(Proba_2, self).__init__() self.ui_2 = Ui_Dialog_2() self.ui_2.setupUi_2(self) self.ui_2.radioButton.toggled.connect(self.updateLabel) self.ui_2.radioButton_2.toggled.connect(self.updateLabel) self.ui_2.radioButton_3.toggled.connect(self.updateLabel) self.ui_2.radioButton_4.toggled.connect(self.updateLabel) # self.ui_2.pushButton.clicked.connect(self.ok_butt) self.ui_2.pushButton.clicked.connect(self.accept) self.ss = None def updateLabel(self): # global ss # ss = 'Значение не введено' rbtn = self.sender() if rbtn.isChecked(): if rbtn.text() == '1': self.ui_2.label.setText('Один') self.ss = 'Один' elif rbtn.text() == '2': self.ui_2.label.setText('Два') self.ss = 'Два' elif rbtn.text() == '3': self.ui_2.label.setText('Три') self.ss = 'Три' elif rbtn.text() == '4': self.ui_2.label.setText('Четыре') self.ss = 'Четыре' app = QtWidgets.QApplication([]) application = Proba() application.show() sys.exit(app.exec())
Офлайн
В методе __init__ у диалога
self.zdan = None
self.zdan
Отредактировано DOOMer (Ноя. 26, 2020 01:03:13)
Офлайн