class MainWindow(QMainWindow): logger = logging.getLogger('Main_Window') def __init__(self, parent=None): super(QMainWindow, self).__init__() self.controller = MainController( self) # объект для обработки действий пользователя self.model = MainModel(self) # объект для взаимодействия с сервером self._show_connection_error_flag = False self._show_create_team_error_flag = False self._block_tbl = False self._tbl_blink = False # подключаем визуальное представление self.ui = GUI_Main_Window() self.ui.setupUi(self) self.ui.custom_setup(self) self.load_style() self.hide_reboot_btn() self.ui.exit_btn.clicked.connect(self.controller.click_exit_btn) self.ui.create_team_btn.clicked.connect( self.controller.click_create_team_btn) self.ui.teamslist_btn.clicked.connect( self.controller.click_teamslist_btn) self.ui.rebootButton.clicked.connect(self.controller.click_reboot_btn) # обновления ТЧ по таймеру self.update_tbl_timer = QtCore.QTimer() self.update_tbl_timer.timeout.connect(self._fill_table_by_timer) self.update_tbl_timer.start(1000) # обновления часов по таймеру self.update_clock_timer = QtCore.QTimer() self.update_clock_timer.timeout.connect(self._fill_clock_by_timer) self.update_clock_timer.start(1000) # every 1000 milliseconds if not FULLSCREEN: self.showNormal() else: self.showFullScreen() if not TEST_MODE: self.setCursor(Qt.BlankCursor) center_on_screen(self) self.fill_header() # keyboard.add_hotkey('Ctrl + Alt + 1', self.show_exit_btn) def _show_create_team_error(self): self._show_create_team_error_flag = True self._show_error_message( 'Необходимо сформировать хотя бы одну бригаду!', color='#FF0000', font=24) self._block_tbl = True def _hide_create_team_error(self): if self._show_create_team_error_flag: self._block_tbl = False self._hide_error_message() self._show_create_team_error_flag = False def _show_connection_error(self): self._show_connection_error_flag = True self._show_error_message('Ошибка связи с сервером!', color='#FF0000', font=24) self.ui.tbl1.setRowCount(1) self.ui.tbl1.update() self._block_tbl = True self.ui.create_team_btn.setEnabled(False) self.ui.create_team_btn.setStyleSheet( 'background-color: #87939A;') # grey btn self.ui.teamslist_btn.setEnabled(False) self.ui.teamslist_btn.setStyleSheet( 'background-color: #87939A;') # grey btn def _hide_connection_error(self): if self._show_connection_error_flag: self.ui.create_team_btn.setEnabled(True) self.ui.teamslist_btn.setEnabled(True) self.load_style() self._block_tbl = False self._hide_error_message() self._show_connection_error_flag = False def _show_error_message(self, message, color='#FF0000', font=24): self.ui.error_label.setStyleSheet( f'color: {color}; font: bold {font}pt "Consolas";') self.ui.error_label.setText(message) self.ui.error_widget.setVisible(True) def _hide_error_message(self): self.ui.error_label.setText("") self.ui.error_widget.setVisible(False) def show_reboot_btn(self): self.ui.rebootButton.setVisible(True) def hide_reboot_btn(self): self.ui.rebootButton.setVisible(False) def _update_statusbar(self): ok_color = '#006117' ok_text = 'Ok' error_color = '#FF0000' error_text = 'ERROR' error = False if find_printer_by_name(PRINTER_NAME): self.ui.val_printer.setStyleSheet(f'color: {ok_color}') self.ui.val_printer.setText(ok_text) else: self.ui.val_printer.setStyleSheet(f'color: {error_color}') self.ui.val_printer.setText(error_text) error = True if self.model.db.online: self.ui.val_server.setStyleSheet(f'color: {ok_color}') self.ui.val_server.setText(ok_text) else: self.ui.val_server.setStyleSheet(f'color: {error_color}') self.ui.val_server.setText(error_text) error = True if find_hwid(BAR_SCANNER_PID): self.ui.val_qr.setStyleSheet(f'color: {ok_color}') self.ui.val_qr.setText(ok_text) else: self.ui.val_qr.setStyleSheet(f'color: {error_color}') self.ui.val_qr.setText(error_text) error = True if find_hwid(RFID_SCANNER_PID): self.ui.val_rfid.setStyleSheet(f'color: {ok_color}') self.ui.val_rfid.setText(ok_text) else: self.ui.val_rfid.setStyleSheet(f'color: {error_color}') self.ui.val_rfid.setText(error_text) error = True if error: self.show_reboot_btn() else: self.hide_reboot_btn() def load_style(self): file = QFile(STYLE_PATH) if not file.open(QFile.ReadOnly | QFile.Text): self.logger.critical(f'Style {STYLE_PATH} not found.') self.close() qss_file = QTextStream(file) _txt = qss_file.readAll() self.setStyleSheet(_txt) self.ui.teamslist_btn.setStyleSheet(_txt) self.ui.create_team_btn.setStyleSheet(_txt) file.close() def closeEvent(self, event): print("User has clicked the red x on the main window") event.accept() def show_dialog(self): dlg = QDialog(self) dlg.setWindowTitle("HELLO!") dlg.exec_() def fill_header(self): self.ui.tbl1.setItem(0, 0, QTableWidgetItem('№')) self.ui.tbl1.setItem(0, 1, QTableWidgetItem('От')) self.ui.tbl1.setItem(0, 2, QTableWidgetItem('Поступило')) self.ui.tbl1.setItem(0, 3, QTableWidgetItem('Тип')) self.ui.tbl1.setItem(0, 4, QTableWidgetItem('Бригада')) self.ui.tbl1.setItem(0, 5, QTableWidgetItem('Руководитель')) self.ui.tbl1.setItem(0, 6, QTableWidgetItem('Исполнить к')) self.ui.tbl1.setItem(0, 7, QTableWidgetItem('Начато')) self.ui.tbl1.setItem(0, 8, QTableWidgetItem('Окончено')) self.ui.tbl1.setItem(0, 9, QTableWidgetItem('Статус')) self.ui.tbl1.setItem(0, 10, QTableWidgetItem('Направление')) self.ui.tbl1.setItem(0, 11, QTableWidgetItem('Номер авто')) self.ui.tbl1.setItem(0, 12, QTableWidgetItem('')) self.ui.set_table_header_style() def _get_tbl_item(self, val, color=None): _item = QTableWidgetItem(str(val)) if color is not None: _item.setBackground(color) return _item def fill_table(self): self.ui.tbl1.setRowCount(1) self.ui.tbl1.setRowCount(len(self.model.db.documents) + 1) _str = 1 for doc in self.model.db.documents: _blnk = self._tbl_blink _color = None if doc.status == "На исполнение": if self._tbl_blink: _color = QtGui.QColor(255, 0, 0, 127) # light red elif doc.status == "В работе": self._tbl_blink = False _color = QtGui.QColor(255, 251, 125) # light yellow elif doc.status == "Выполнено": self._tbl_blink = False _color = QtGui.QColor(0, 255, 0, 127) # light green self.ui.tbl1.setItem(_str, 0, self._get_tbl_item(doc.get_num_str(), _color)) self.ui.tbl1.setItem( _str, 1, self._get_tbl_item(doc.get_date_str(), _color)) self.ui.tbl1.setItem( _str, 2, self._get_tbl_item(doc.get_date_sending_str(), _color)) self.ui.tbl1.setItem(_str, 3, self._get_tbl_item(doc.type, _color)) if doc.team_number > 0: self.ui.tbl1.setItem( _str, 4, self._get_tbl_item(doc.team_number, _color)) else: self.ui.tbl1.setItem(_str, 4, self._get_tbl_item("", _color)) self.ui.tbl1.setItem(_str, 5, self._get_tbl_item(doc.team_leader, _color)) self.ui.tbl1.setItem( _str, 6, self._get_tbl_item(doc.get_execute_to_str(), _color)) self.ui.tbl1.setItem( _str, 7, self._get_tbl_item(doc.get_start_time_str(), _color)) self.ui.tbl1.setItem( _str, 8, self._get_tbl_item(doc.get_end_time_str(), _color)) self.ui.tbl1.setItem(_str, 9, self._get_tbl_item(doc.status, _color)) self.ui.tbl1.setItem(_str, 10, self._get_tbl_item(doc.destination, _color)) self.ui.tbl1.setItem(_str, 11, self._get_tbl_item(doc.autos_number, _color)) btn = QPushButton(parent=self.ui.tbl1) btn.setText('Открыть') btn.clicked.connect(self._click_get_doc_btn) btn.doc = doc if self._block_tbl: btn.setStyleSheet('background-color: #87939A;') # grey btn self.ui.tbl1.setCellWidget(_str, 12, btn) self.ui.tbl1.setRowHeight(_str, 80) for _col in range(0, self.ui.tbl1.columnCount() - 1): self.ui.tbl1.item( _str, _col).setTextAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignCenter) _str += 1 self._tbl_blink = _blnk self._tbl_blink = not self._tbl_blink def _fill_clock_by_timer(self): def format_digit(digit): _digit = str(digit) if len(_digit) == 1: return '0' + _digit return _digit self.ui.time_lcd_hour.display(format_digit(datetime.now().hour)) self.ui.time_lcd_minute.display(format_digit(datetime.now().minute)) self.ui.time_lcd_second.display(format_digit(datetime.now().second)) def _fill_table_by_timer(self): if self.model.db.online: self._hide_connection_error() self.fill_table() else: self._show_connection_error() self.ui.tbl1.setEnabled(not self._block_tbl) if len(self.model.db.teams) > 0: self._hide_create_team_error() else: self._show_create_team_error() self._update_statusbar() def _click_get_doc_btn(self): self.controller.open_document_window(self.sender().doc.link) def _open_doc(self, link): doc = self.model.db.get_doc(link) if doc is not None: self.controller.open_document_window(doc.link)