def run(self, filename): layout_ = QVBoxLayout() label = QLabel("Обработка файла: {}".format(filename)) layout_.addWidget(label) progress_bar = QProgressBar() progress_bar.setRange(0, 100) message = QLabel() layout_.addWidget(message, alignment=Qt.AlignCenter) layout_.addWidget(progress_bar) self.layout().addLayout(layout_) def progress_bar_update(text='', value=0): progress_bar.setValue(value) message.setText(text) QApplication.instance().processEvents() try: sources = find_missing_src(filename, progress_bar_update, **self.config()) result_widget = ResultWidget(sources, filename, **self.config()) if self.auto_save.isChecked(): result_widget.save(auto=True) self.new_result.emit(result_widget, filename, self.view_type_checkbox.isChecked()) except NoSourcesException as e: QMessageBox().critical( self, "Ошибка", "Раздел с источниками не обнаружен" + str(e)) except Exception as exception: QMessageBox().critical( self, "Ошибка", "Во время чтения файла произошла ошибка" + str(exception)) traceback.print_exc(exception) finally: self.layout().removeItem(layout_) progress_bar.setParent(None) progress_bar.deleteLater() label.setParent(None) label.deleteLater() message.setParent(None) message.deleteLater() layout_.deleteLater() QApplication.instance().processEvents()
class BusyBar(QThread): # Looping progress bar # create the signal that the thread will emit changeValue = pyqtSignal(int) def __init__(self, text=""): QThread.__init__(self) self.text = text self.stop = False self.proBar = QProgressBar() self.proBar.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.SplashScreen) self.proBar.setRange(0, 100) self.proBar.setTextVisible(True) self.proBar.setFormat(self.text) self.proBar.setValue(0) self.proBar.setFixedSize(500, 50) self.proBar.setAlignment(Qt.AlignCenter) self.proBar.show() self.changeValue.connect(self.proBar.setValue, Qt.QueuedConnection) # Make the Busybar delete itself and the QProgressBar when done self.finished.connect(self.onFinished) def run(self): while not self.stop: # keep looping while self is visible # Loop sending mail for i in range(100): # emit the signal instead of calling setValue # also we can't read the progress bar value from the thread self.changeValue.emit(i) time.sleep(0.05) self.changeValue.emit(0) def onFinished(self): self.proBar.deleteLater() self.deleteLater() def Kill(self): self.stop = True
class Host(QWidget): def __init__(self, quiz): super().__init__() self.move(*COORDS) self.setWindowTitle('pyQuiz') self.name = quiz['name'] del quiz['name'] self.quiz = quiz self.curent_window = None self.API = None self.question_button = None self.timer = None self.raiting_table, self.raiting_box, self.raiting_button = None, None, None # question self.answers = [] self.question_box, self.question_label, self.question_pbar = None, None, None # true_answer self.true_answer_box, self.true_answer_button, self.true_answer_question = None, None, None self.true_answer_label, self.true_answer_answer = None, None # person_waiting self.person_waiting_pin = None self.person_waiting_box, self.person_waiting_title = None, None self.person_waiting_table, self.person_waiting_button = None, None self.person_waiting_box = None self.thread_signal(URL) def delete_raiting_widgets(self): if self.raiting_box is not None: sip.delete(self.raiting_box) self.raiting_box = None if self.raiting_table is not None: self.raiting_table.deleteLater() self.raiting_table = None if self.raiting_button is not None: self.raiting_button.deleteLater() self.raiting_button = None def delete_question_widgets(self): if self.timer is not None: self.timer.stop() self.timer = None if self.question_box is not None: sip.delete(self.question_box) self.question_box = None if self.question_label is not None: self.question_label.deleteLater() self.question_label = None if self.answers is not None: for i in range(len(self.answers)): if self.answers[i] is not None: self.answers[i].deleteLater() self.answers[i] = None self.answers = [] if self.question_button is not None: self.question_button.deleteLater() self.question_button = None if self.question_pbar is not None: self.question_pbar.deleteLater() self.question_pbar = None def delete_true_answer_widgets(self): if self.true_answer_box is not None: sip.delete(self.true_answer_box) self.true_answer_box = None if self.true_answer_question is not None: self.true_answer_question.deleteLater() self.true_answer_question = None if self.true_answer_label is not None: self.true_answer_label.deleteLater() self.true_answer_label = None if self.true_answer_answer is not None: self.true_answer_answer.deleteLater() self.true_answer_answer = None if self.true_answer_button is not None: self.true_answer_button.deleteLater() self.true_answer_button = None def delete_person_waiting_widgets(self): if self.person_waiting_table is not None: self.person_waiting_table.deleteLater() self.person_waiting_table = None if self.person_waiting_box is not None: sip.delete(self.person_waiting_box) self.person_waiting_box = None if self.person_waiting_button is not None: self.person_waiting_button.deleteLater() self.person_waiting_button = None if self.person_waiting_title is not None: self.person_waiting_title.deleteLater() self.person_waiting_title = None if self.person_waiting_pin is not None: self.person_waiting_pin.deleteLater() self.person_waiting_pin = None def delete_all_windgets(self): self.delete_person_waiting_widgets() # +++ self.delete_true_answer_widgets() # +++ self.delete_raiting_widgets() # +++ self.delete_question_widgets() # +++ def raiting_window(self, raiting: List[Tuple[int, str]]): self.delete_all_windgets() self.raiting_box = QVBoxLayout() self.raiting_box.setContentsMargins(0, 0, 0, 0) raiting.sort(reverse=True) self.raiting_table = QTableWidget() self.raiting_table.setRowCount(len(raiting)) self.raiting_table.setColumnCount(2) self.raiting_table.setHorizontalHeaderLabels(['имя', 'очки']) for i in range(len(raiting)): self.raiting_table.setItem(i, 1, QTableWidgetItem(str(raiting[i][0]))) self.raiting_table.setItem(i, 0, QTableWidgetItem(str(raiting[i][1]))) self.raiting_table.setColumnWidth(0, 177) self.raiting_table.setColumnWidth(1, 120) self.raiting_table.setEditTriggers(QTableWidget.NoEditTriggers) self.setStyleSheet(QUIZ_STYLE_SHEET) self.raiting_box.addWidget(self.raiting_table) self.raiting_button = QPushButton('next') self.raiting_button.clicked.connect(self.to_question) self.raiting_box.addWidget(self.raiting_button) self.setLayout(self.raiting_box) self.setFixedSize(300, 300) def question_window(self, question, answer_array, time=10): self.delete_all_windgets() self.time = time self.question_box = QVBoxLayout() self.question_label = QLabel() self.question_label.setText(question) self.question_label.setStyleSheet( 'QLabel{font-size:50px;font-weight:bold;background-color:#3C3F41;color:#BBBBBB;}' ) self.question_label.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.question_box.addWidget(self.question_label) self.answers = [0 for _ in range(len(answer_array))] for i in range(len(answer_array)): self.answers[i] = QLabel(str(answer_array[i])) self.answers[i].setStyleSheet( 'QLabel {font-size: 40px; font-weight: bold; background-color: ' + OPTIONS_BUTTONS_COLOR[i] + '; color: ' + OPTIONS_BUTTONS_STRING_COLOR[i] + ';}') self.question_box.addWidget(self.answers[i]) self.question_pbar = QProgressBar() self.question_pbar.setFixedHeight(50) self.question_pbar.setStyleSheet(""" QProgressBar{ border: 2px solid grey; border-radius: 5px; text-align: center; color: black; font-size:30px; } QProgressBar::chunk { background-color: pink; width: 10px; margin: 1px; } """) self.timer = QBasicTimer() self.step = 0 self.timer.start(100, self) self.question_box.addWidget(self.question_pbar) self.setLayout(self.question_box) self.setStyleSheet(QUIZ_STYLE_SHEET) self.setFixedSize(1000, 480) def timerEvent(self, e): if self.question_pbar is not None and self.question_pbar.value( ) == 100: self.question_pbar.deleteLater() self.question_pbar = None self.question_button = QPushButton('next') self.question_button.setFixedHeight(50) self.question_button.clicked.connect(self.to_true_false) self.question_box.addWidget(self.question_button) self.setFixedSize(1000, 480) # QShortcut(QKeySequence("Ctrl+n"), self, self.next) elif self.question_pbar is not None: self.step = self.step + 100 / self.time / 10 self.question_pbar.setValue(min(self.step, 100)) def true_answer_window(self, question, answer, index): self.delete_all_windgets() self.true_answer_box = QVBoxLayout() self.true_answer_question = QLabel() self.true_answer_question.setText(question) self.true_answer_question.setStyleSheet( 'QLabel{font-size:50px;font-weight:bold;background-color:#3C3F41;color:#BBBBBB;}' ) self.true_answer_question.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.true_answer_label = QLabel('Правильный ответ:') self.true_answer_label.setStyleSheet( 'QLabel{font-size:50px;font-weight:bold;background-color:#3C3F41;color:#BBBBBB;}' ) self.true_answer_label.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.true_answer_label.setFixedHeight(50) self.true_answer_answer = QLabel(str(answer)) self.true_answer_answer.setStyleSheet( 'QLabel {font-size: 40px; font-weight: bold; background-color: ' + OPTIONS_BUTTONS_COLOR[index] + '; color: ' + OPTIONS_BUTTONS_STRING_COLOR[index] + ';}') self.true_answer_box.addWidget(self.true_answer_question) self.true_answer_box.addWidget(self.true_answer_label) self.true_answer_box.addWidget(self.true_answer_answer) self.true_answer_button = QPushButton('next') self.true_answer_button.clicked.connect(self.to_raiting) self.true_answer_box.addWidget(self.true_answer_button) self.setLayout(self.true_answer_box) self.setStyleSheet(QUIZ_STYLE_SHEET) self.setFixedSize(1000, 480) def to_raiting(self): self.curent_window = self.raiting_window def to_question(self): self.curent_window = self.question_window def to_true_false(self): self.curent_window = self.true_answer_window def person_waiting_window(self, quiz_title, pin, peoples): self.delete_all_windgets() self.person_waiting_box = QVBoxLayout() self.person_waiting_table = QTableWidget() self.person_waiting_table.setRowCount(len(peoples)) self.person_waiting_table.setColumnCount(1) self.person_waiting_table.horizontalHeader().hide() self.person_waiting_table.verticalHeader().hide() for i in range(len(peoples)): self.person_waiting_table.setItem( i, 0, QTableWidgetItem(str(peoples[i]))) self.person_waiting_table.setColumnWidth(0, 300) self.person_waiting_table.setFixedHeight(150) self.person_waiting_title = QLabel() self.person_waiting_title.resize(300, 100) self.person_waiting_title.setText(quiz_title) self.person_waiting_title.setStyleSheet( 'QLabel{font-size:30px;font-weight:bold;background-color:#3C3F41;color:#BBBBBB;}' ) self.person_waiting_title.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.person_waiting_pin = QLabel() self.person_waiting_pin.setText(pin) self.person_waiting_pin.setStyleSheet( 'QLabel{font-size:30px;font-weight:bold;background-color:#3C3F41;color:#BBBBBB;}' ) self.person_waiting_pin.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.person_waiting_button = QPushButton('start game') self.person_waiting_button.clicked.connect(self.play) self.person_waiting_box.addWidget(self.person_waiting_title) self.person_waiting_box.addWidget(self.person_waiting_pin) self.person_waiting_box.addWidget(self.person_waiting_table) self.person_waiting_box.addWidget(self.person_waiting_button) self.person_waiting_table.setEditTriggers(QTableWidget.NoEditTriggers) self.setLayout(self.person_waiting_box) self.setStyleSheet(QUIZ_STYLE_SHEET) self.setFixedSize(300, 300) def play(self): if self.person_waiting_table.rowCount() < PLAYERS_NUM_MIN: showMsg('нет людей') return self.curent_window = self.question_window def thread_signal(self, url): self.thread = HostThread(url, self) self.thread.Signal.connect(self.change_window) self.thread.finished.connect(self.on_finished) self.thread.start() def change_window(self, value): func = value[0] arguments = value[1:] func(*arguments) def on_finished(self): self.thread.Signal.disconnect(self.change_window) self.thread.finished.disconnect(self.on_finished) self.exit() def exit(self): global COORDS COORDS = [self.x(), self.y()] self.quiz_selection_window = QuizSelectionWindow() self.quiz_selection_window.show() self.close()
class View(QDialog): def __init__(self, parent): super().__init__(parent) """Put the dialog window on top and block all windows.""" self.setWindowModality(Qt.ApplicationModal) self.progressBar = QProgressBar(self) self.progressBar.setAlignment(Qt.AlignCenter) self.progressBar.setValue(0) self.btnOpen = QPushButton(Strings.connect) self.btnClose = QPushButton(Strings.disconnect) self.btnClose.setDisabled(True) self.btnExit = QPushButton(Strings.exitLC) self.combo = QComboBox() self.textConnected = QLabel(Strings.portConnected) self.textConnected.setAlignment(Qt.AlignCenter) self.textConnected.setFont(QFont("Times", 8, QFont.Bold)) self.layout = QVBoxLayout(self) self.layout.addWidget(self.progressBar) self.resize(300, 200) self.centerWindowOnScreen() self.setWindowTitle(Strings.sprV2) def centerWindowOnScreen(self): windowGeometry = self.frameGeometry() desktopWidget = QDesktopWidget().availableGeometry().center() windowGeometry.moveCenter(desktopWidget) self.move(windowGeometry.topLeft()) def mainWindow(self, connected, byConnectButton): if byConnectButton == 0: self.layout.removeWidget(self.progressBar) self.progressBar.deleteLater() elif byConnectButton == 1: self.layout.removeWidget(self.btnOpen) self.btnOpen.deleteLater() self.layout.removeWidget(self.btnClose) self.btnClose.deleteLater() self.layout.removeWidget(self.btnExit) self.btnExit.deleteLater() self.layout.removeWidget(self.combo) self.combo.deleteLater() if connected: self.textConnected.setText(Strings.portConnected) self.textConnected.setStyleSheet('color: green') self.layout.addWidget(self.textConnected) else: self.textConnected.setText(Strings.messagePortNotFound) self.textConnected.setStyleSheet('color: red') self.layout.addWidget(self.textConnected) self.layout.addWidget(self.btnOpen) self.layout.addWidget(self.btnClose) self.layout.addWidget(self.btnExit) self.layout.addWidget(self.combo) def setPorts(self, ports): self.combo.addItem(Strings.portsUC) for port in ports: self.combo.addItem(port['port']) def setPortFound(self, numberOfIndex): self.btnClose.setDisabled(False) self.btnOpen.setDisabled(True) self.combo.setCurrentIndex(numberOfIndex) self.combo.setDisabled(True) def setMessageCritical(self, typeMessage, message): QMessageBox.critical(self, typeMessage, message) def setMessageExistsFile(self): loadFile = QMessageBox.question(self, Strings.question, Strings.messageLoadConfigurationFile, QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if loadFile == QMessageBox.Yes: fileName, _ = QFileDialog.getOpenFileName( self, Strings.openFile, 'C:/Users/' + getpass.getuser() + '/Documents/', '*.cfg') if fileName: return [True, fileName] else: return [False, None] else: return [False, Strings.no] def setMessageExit(self): exitApp = QMessageBox.question(self, Strings.question, Strings.messageExit, QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if exitApp == QMessageBox.Yes: return True else: return False
class ProgressBar(QWidget): finish = pyqtSignal() def __init__(self, flags, *args, **kwargs): super().__init__(flags, *args, **kwargs) layout = QVBoxLayout() self.label = QLabel() self.progress_bar = QProgressBar() layout.addWidget(self.label, alignment=Qt.AlignCenter) layout.addWidget(self.progress_bar) self.setLayout(layout) self.part = None self.base = 0 self.finish_label = QLabel(kwargs.get('finish_text', 'Завершено')) self.finish_button = QPushButton('Закрыть') self.finish = self.finish_button.clicked def set_part(self, size, length, text): if self.part is None: if length > 0: self.current_tick = 0 self.current_part_size = length self.current_tick_size = size / length self.text = text self.part = True else: self.base += size self.progress_bar.setValue(self.base) QApplication.processEvents() else: raise ValueError('part is not over') def increment(self): if self.part is not None: self.current_tick += 1 self.label.setText( f'{self.text}: {self.current_tick}/{self.current_part_size}') self.base += self.current_tick_size self.progress_bar.setValue(int(self.base)) if self.current_tick == self.current_part_size: self.part = None QApplication.processEvents() else: raise ValueError('part is not set') def last(self): return 100 - self.base def abord(self): self.part = None self.base = 0 self.progress_bar.setValue(0) self.label.setText('Отмена') def on_finish(self, msg): self.layout().removeWidget(self.label) self.finish_label.setText(msg) self.layout().removeWidget(self.progress_bar) self.layout().addWidget(self.finish_label) self.layout().addWidget(self.finish_button) self.progress_bar.deleteLater() self.label.deleteLater() QApplication.processEvents() self.finish.emit()