Как сделать, чтобы при нажатии на кнопку в графическом интерфейсе программа открывала следующую программу и закрывалась
Как можно подружить PyQt5 и os.
Мне надо сделать так, чтобы при нажатии на кнопку в графическом интерфейсе программа открывала следующую программу и закрывалась.
Как это сделать, я не понимаю.
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QLabel
from PyQt5.QtCore import QCoreApplication
import os
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl1 = QLabel('Привет! Ты попал на блиц-опрос по темам!', self)
lbl1.move(15, 10)
lbl2 = QLabel('Выбери тему:', self)
lbl2.move(15, 30)
lbl3 = QLabel('1 - История', self)
lbl3.move(15, 50)
lbl4 = QLabel('2 - Космос', self)
lbl4.move(15, 70)
lbl5 = QLabel('3 - Математика', self)
lbl5.move(15, 90)
lbl6 = QLabel('4 - Литература', self)
lbl6.move(15, 110)
lbl7 = QLabel('5 - География', self)
lbl7.move(15, 130)
btn1 = QPushButton('1', self)
btn1.resize(btn1.sizeHint())
btn1.move(10, 270)
btn2 = QPushButton('2', self)
btn2.resize(btn2.sizeHint())
btn2.move(88, 270)
btn3 = QPushButton('3', self)
btn3.resize(btn3.sizeHint())
btn3.move(165, 270)
btn4 = QPushButton('4', self)
btn4.resize(btn4.sizeHint())
btn4.move(242, 270)
btn5 = QPushButton('5', self)
btn5.resize(btn5.sizeHint())
btn5.move(320, 270)
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('Тест')
self.show()
btn1.clicked.connect(QCoreApplication.instance().quit)
btn2.clicked.connect(QCoreApplication.instance().quit)
btn3.clicked.connect(QCoreApplication.instance().quit)
btn4.clicked.connect(QCoreApplication.instance().quit)
btn5.clicked.connect(QCoreApplication.instance().quit)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
PyQt5 и os никогда не ссорились.
Из опубликованного вами кода, я понял, что вам надо создать блиц-опрос.
Один из возможных вариантов - использовать класс QWizard.
QWizard - это особый тип диалогового окна ввода, состоящего из последовательности страниц. Задача wizard's - шаг за шагом провести пользователя через процесс.
import sys
#import os
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Wizard(QWizard):
finished = pyqtSignal(list)
def __init__(self, titles, datas, parent=None):
super(Wizard, self).__init__(parent)
self.parent = parent
self.setStyleSheet(('font:50 12pt "MS Shell Dlg 2";'))
self.groups = []
for title, options in zip(titles, datas):
page, group = Wizard.create_page(title, options)
self.addPage(page)
self.groups.append(group)
self.button(QWizard.FinishButton).clicked.connect(self.on_finished)
self._results = []
@property
def results(self):
self.get_options()
return self._results
def get_options(self):
self._results = []
for group in self.groups:
button = group.checkedButton()
if button is not None:
self._results.append(button.text())
else:
self._results.append(None)
@pyqtSlot()
def on_finished(self):
self.parent.show()
self.finished.emit(self.results)
self.hide()
@staticmethod
def create_page(title, options):
page = QWizardPage()
group = QButtonGroup(page)
page.setTitle(f'<h3>{title}</h3>')
page.setSubTitle("Пожалуйста, выберите один из этих ответов.")
layout = QVBoxLayout(page)
for option in options:
radiobutton = QRadioButton(text=option)
group.addButton(radiobutton)
layout.addWidget(radiobutton)
return page, group
class Example(QWidget):
def __init__(self):
super().__init__()
self.topics = [
"История ",
"Космос ",
"Математика",
"Литература",
"География "
]
self.lbl1 = QLabel('Привет! Вы попали на блиц-опрос по темам!',
alignment = Qt.AlignCenter)
self.lbl1.setStyleSheet("font: 17pt \"Ubuntu\";")
self.selectedTopic = None
self.layout = QGridLayout(self)
self.layout.addWidget(self.lbl1, 1, 1)
self.buttonGroup = QButtonGroup()
for i, topic in enumerate(self.topics):
rb = QRadioButton(topic)
rb.setStyleSheet("font: 15pt \"Consolas\";")
self.buttonGroup.addButton(rb, i)
self.layout.addWidget(rb, i+2, 1, alignment = Qt.AlignCenter)
self.buttonGroup.idClicked.connect(self.handleButtons)
self.lbl2 = QLabel('Пожалуйста, выберите тему и нажмите кнопку `Начать опрос`',
alignment = Qt.AlignCenter)
self.lbl2.setStyleSheet("font-size: 12pt;")
self.layout.addWidget(self.lbl2, i+3, 1)
self.btnStart = QPushButton('Начать опрос')
self.btnStart.setStyleSheet("font-size: 12pt;")
self.btnStart.clicked.connect(self.start_survey)
self.layout.addWidget(self.btnStart, i+4, 1, alignment = Qt.AlignCenter)
def handleButtons(self, index):
color = f'#{random.randint(0, 0xFFFFFF):06x}'
for i in range(len(self.topics)):
if i == index:
self.buttonGroup.button(index).setStyleSheet(f'''
background: {color};
font: 15pt \"Consolas\";
''')
else:
self.buttonGroup.button(i).setStyleSheet(f'''
background: #f0f0f0;
font: 15pt \"Consolas\";
''')
self.selectedTopic = self.topics[index]
def start_survey(self):
if not self.selectedTopic:
msg = QMessageBox.information(
self,
'Внимание',
'Вы не выбрали тему опроса.'
)
return
if self.selectedTopic == "История ":
print(f'''
{self.selectedTopic} - вам надо сформировать опросник
для этой темы. Смотрите как это сделано в разделе "Математика"
''')
return
elif self.selectedTopic == "Космос ":
print(f'''
{self.selectedTopic} - вам надо сформировать опросник
для этой темы. Смотрите как это сделано в разделе "Математика"
''')
return
elif self.selectedTopic == "Математика":
title = [
"Цифры, используемые в современной математике?",
"Как называется сотая часть числа?",
"Какой раздел математики греки называли «искусством чисел»?",
"Что найдём, если расстояние разделим на скорость?",
]
data = [
["Арабские", "Римские", "Обычные", "Русские"],
["Сотня", "Процент", "Доля"],
["Начала анализа", "Геометрия", "Арифметика", "Алгебра"],
["Работу", "Длину", "Скорость", "Время"],
]
self.result = ["Арабские", "Процент", "Арифметика", "Время"]
elif self.selectedTopic == "Литература":
print(f'''
{self.selectedTopic} - вам надо сформировать опросник
для этой темы. Смотрите как это сделано в разделе "Математика"
''')
return
elif self.selectedTopic == "География ":
print(f'''
{self.selectedTopic} - вам надо сформировать опросник
для этой темы. Смотрите как это сделано в разделе "Математика"
''')
return
self.wizard = Wizard(title, data, self)
self.wizard.finished.connect(self.wizard_finished)
self.wizard.show()
self.hide()
def wizard_finished(self, results):
text = ''
for i, result in enumerate(results):
if result is None:
text = f'{text}Вы не ответили на {i+1}-й вопрос;\n'
if text:
text = f'{text}\n Попробуйте пройти опрос еще раз.'
msg = QMessageBox.information(
self,
'Внимание',
text
)
return
text = ''
for i, result in enumerate(results):
if result != self.result[i]:
text = f'{text}Вы неправильно ответили на {i+1}-й вопрос. Ответ - {self.result[i]}\n'
if text:
text = f'{text}\n Попробуйте пройти опрос еще раз.'
msg = QMessageBox.information(
self,
'Внимание',
text
)
else:
msg = QMessageBox.information(
self,
'Super!',
'Вы правильно ответили на все вопросы!'
)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())



