class Page(QWidget): call_exit = Signal( str ) # arg is function name (self.func.__name__) for each page in pages def __init__( self, func=None, func_args=[], func_kwargs={}, margin=30, vert_spacing=10, current_layout="TopBottomLayout", description="", single_pass: bool = False, *args, **kwargs ): super().__init__() # static definitions self.func = func self.args = func_args self.kwargs = func_kwargs self.widget_list = [] self.margin = margin self.vert_spacing = vert_spacing self.single_pass = single_pass self.stdout = sys.stdout self.stderr = sys.stderr self.Current_Layout = layouts.Layout_Dict["TopBottomLayout"] if current_layout in layouts.Layout_Dict: self.Current_Layout = layouts.Layout_Dict[current_layout](self) # Initiallize self.canvas = QWidget() self.canvas.setObjectName("canvas") # create a scroll bar self.widget_scroll = QScrollArea(self) self.widget_scroll.setObjectName("widget_scroll") # use a QFormLayout to place widgets self.canvas_layout = QFormLayout() self.canvas_layout.setObjectName("canvas_layout") # set canvas_layout self.canvas_layout.setMargin(self.margin) self.canvas_layout.setSpacing(self.vert_spacing) self.canvas_layout.setRowWrapPolicy(self.canvas_layout.WrapAllRows) # default description is func.__doc__ self.description = QLabel( self.getDescription(description) ) # doesn't need to scroll self.description.setParent(self) self.description.setWordWrap(True) self.description.setTextFormat(Qt.MarkdownText) self.description.setOpenExternalLinks(True) # create a Run button to excute the function self.run_button = QPushButton("&Run", self) self.run_button.clicked.connect(self.Run) self.run_button.adjustSize() # allow the user to run the func multiple times to test output # but only the last return is delivered (as a confirmed run) self.run_thread = RunThread(self.func, self.args, self.kwargs) self.run_thread.finished.connect(self.Done) def getDescription(self, pre_defined_desc: str = ""): """ returns the description of current page. """ if pre_defined_desc.strip(" \r\n") != "": return pre_defined_desc if self.func == None: log.error("No backend function found") return "" docstring = self.func.__doc__.strip(" \r\n\t") if docstring == "": log.warning("Bad docstring for function {0}".format(self.func.__name__)) return "function {0}".format(self.func.__name__) # suppose "------" is the splitor between function description and arguments description # in numpy-style docstring, "------" has "Parameter" before it. # match it with "[a-zA-Z_]*?[\n\r]*?". desc_part = re.match( r"([\S\s\n\r]+?)[a-z_]*?[\n\r\s]*?------", docstring, re.M | re.I ) if desc_part == None: log.info("whole description:\n{0}".format(docstring)) return docstring log.info("recognized description:\n{0}".format(desc_part.group(1))) return desc_part.group(1) ### slot functions def Run(self): """ Run the function(self.func) in another thread(self.run_thread). """ # load args for i in self.widget_list: self.kwargs.update({i.objectName(): i.getValue()}) # redirect standard output self.output_dialog = output_dialog.OutputDialog(self.func.__name__, parent=self) sys.stdout = self.output_dialog sys.stderr = self.output_dialog # avoid multiple clicks self.run_button.setText("Running...") self.run_button.setEnabled(False) self.run_thread.start() log.info('func "{0}" started'.format(self.func.__name__)) self.output_dialog.exec_() def Done(self): """ Done is called when the function is finished(i.e. self.run_thread.finished is omitted) Restore the run button. """ log.info('func "{0}" ended'.format(self.func.__name__)) self.output_dialog.setWindowTitle( "Output of {0} - returns {1}".format( self.func.__name__, self.run_thread.ret ) ) self.output_dialog.revive() self.run_button.setText("Run") self.run_button.setEnabled(True) if self.single_pass: self.call_exit.emit(self.func.__name__)
class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName("MainWindow") MainWindow.resize(1121, 770) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.scrollArea = QScrollArea(MainWindow) self.scrollArea.setObjectName("scrollArea") self.scrollArea.setGeometry(QRect(10, 10, 1101, 531)) self.scrollArea.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 1099, 529)) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.tableWidget = QTableWidget(self.scrollAreaWidgetContents) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setGeometry(QRect(0, 0, 1099, 529)) self.tableWidget.setAutoFillBackground(True) self.tableWidget.horizontalHeader().setCascadingSectionResizes(False) self.tableWidget.setColumnCount(24) self.column_label = ['begin', 'end', 'time interval', 'login', 'mac ab', 'ULSK1', 'BRAS ip', 'start count', 'alive count', 'stop count', 'incoming', 'outcoming', 'error_count', 'code 0', 'code 1011', 'code 1100', 'code -3', 'code -52', 'code -42', 'code -21', 'code -40', ' code -44', 'code -46', ' code -38'] self.tableWidget.setHorizontalHeaderLabels(self.column_label) self.PathFile = QLineEdit(self.centralwidget) self.PathFile.setGeometry(QRect(200, 10, 831, 90)) self.PathFile.setObjectName("PathFile") self.progressBar_2 = QProgressBar(MainWindow) self.progressBar_2.setObjectName("progressBar_2") self.progressBar_2.setGeometry(QRect(400, 590, 651, 23)) self.progressBar_2.setProperty("value", 0) self.progressBar = QProgressBar(MainWindow) self.progressBar.setObjectName("progressBar") self.progressBar.setGeometry(QRect(400, 650, 651, 23)) self.progressBar.setProperty("value", 0) self.comboBox = QComboBox(MainWindow) self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.setObjectName("comboBox") self.comboBox.setGeometry(QRect(20, 690, 161, 28)) self.comboBox.setEditable(False) self.comboBox.setDuplicatesEnabled(False) self.dateTimeEdit = QDateTimeEdit(MainWindow) self.dateTimeEdit.setObjectName("dateTimeEdit") self.dateTimeEdit.setGeometry(QRect(190, 690, 151, 28)) self.dateTimeEdit.setCurrentSection(QDateTimeEdit.DaySection) self.saveButt = QPushButton(self.centralwidget) self.saveButt.setGeometry(QRect(20, 610, 321, 28)) self.saveButt.setObjectName("saveButt") self.AnalizButt = QPushButton(self.centralwidget) self.AnalizButt.setGeometry(QRect(20, 570, 321, 28)) self.AnalizButt.setObjectName("AnalizButt") self.OpenButt = QPushButton(self.centralwidget) self.OpenButt.setGeometry(QRect(400, 710, 615, 40)) self.OpenButt.setObjectName("OpenButt") self.change_cbButt = QPushButton(self.centralwidget) self.change_cbButt.setObjectName("change_cbButt") self.change_cbButt.setGeometry(QRect(20, 730, 321, 28)) self.change_sizeButt = QPushButton(self.centralwidget) self.change_sizeButt.setObjectName(u"change_sizeButt") self.change_sizeButt.setGeometry(QRect(20, 650, 161, 28)) self.change_sizeLine = QLineEdit(self.centralwidget) self.change_sizeLine.setObjectName("change_sizeLine") self.change_sizeLine.setGeometry(QRect(190, 650, 151, 28)) self.OpenButt.raise_() self.AnalizButt.raise_() self.change_cbButt.raise_() self.progressBar.raise_() self.PathFile.raise_() self.tableWidget.raise_() self.saveButt.raise_() self.comboBox.raise_() self.dateTimeEdit.raise_() self.change_sizeButt.raise_() MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", "MainWindow", None)) #if QT_CONFIG(accessibility) self.tableWidget.setAccessibleName("") #endif // QT_CONFIG(accessibility) self.comboBox.setItemText(0, QCoreApplication.translate("MainWindow", "Парамметры выборки", None)) self.comboBox.setItemText(1, QCoreApplication.translate("MainWindow", "Выборка по логину", None)) self.comboBox.setItemText(2, QCoreApplication.translate("MainWindow", "Выборка по дате", None)) self.comboBox.setCurrentText(QCoreApplication.translate("MainWindow", "\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", None)) self.comboBox.setPlaceholderText("") self.dateTimeEdit.setDisplayFormat(QCoreApplication.translate("MainWindow", "dd.MM.yyyy H:mm:ss")) self.saveButt.setText(QCoreApplication.translate("MainWindow", "Сохранить данные", None)) self.OpenButt.setText(QCoreApplication.translate("MainWindow", "Выбрать папку", None)) self.change_cbButt.setText(QCoreApplication.translate("MainWindow", "Изменить парамметры", None)) self.AnalizButt.setText(QCoreApplication.translate("MainWindow", "Анализировать", None)) self.change_sizeLine.setPlaceholderText(QCoreApplication.translate("MainWindow", "1-1000", None)) self.change_sizeButt.setText(QCoreApplication.translate("MainWindow", u"Изменить выборку", None))
class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName("MainWindow") MainWindow.resize(1050, 700) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.scrollArea = QScrollArea(MainWindow) self.scrollArea.setObjectName("scrollArea") self.scrollArea.setGeometry(QRect(10, 10, 1030, 530)) self.scrollArea.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 1030, 530)) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.tableWidget = QTableWidget(self.scrollAreaWidgetContents) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setGeometry(QRect(0, 0, 1030, 530)) self.tableWidget.setAutoFillBackground(True) self.tableWidget.horizontalHeader().setCascadingSectionResizes(True) self.tableWidget.setColumnCount(7) self.column_label = ['№', 'name', 'fname', 'phone', 'uid', 'nik', 'wo'] self.tableWidget.setHorizontalHeaderLabels(self.column_label) self.PathFile = QLineEdit(self.centralwidget) self.PathFile.setGeometry(QRect(200, 10, 831, 90)) self.PathFile.setObjectName("PathFile") self.progressBar = QProgressBar(MainWindow) self.progressBar.setObjectName("progressBar") self.progressBar.setGeometry(QRect(400, 650, 640, 28)) self.progressBar.setProperty("value", 0) self.comboBox = QComboBox(MainWindow) self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.setObjectName("comboBox") self.comboBox.setGeometry(QRect(20, 610, 321, 28)) self.comboBox.setEditable(False) self.comboBox.setDuplicatesEnabled(False) self.comboBox_2 = QComboBox(self.centralwidget) self.comboBox_2.setGeometry(QRect(20, 570, 321, 28)) self.comboBox_2.setObjectName("comboBox2") self.comboBox_2.addItem("") self.saveButt = QPushButton(self.centralwidget) self.saveButt.setGeometry(QRect(560, 610, 160, 28)) self.saveButt.setObjectName("saveButt") self.AnalizButt = QPushButton(self.centralwidget) self.AnalizButt.setGeometry(QRect(400, 610, 160, 28)) self.AnalizButt.setObjectName("AnalizButt") self.UpdateButt = QPushButton(self.centralwidget) self.UpdateButt.setGeometry(QRect(720, 610, 160, 28)) self.UpdateButt.setObjectName("updateButt") self.DeleteButt = QPushButton(self.centralwidget) self.DeleteButt.setGeometry(QRect(880, 610, 160, 28)) self.DeleteButt.setObjectName("DeleteButt") self.OpenBox = QComboBox(MainWindow) self.OpenBox.addItem("") self.OpenBox.addItem("") self.OpenBox.addItem("") self.OpenBox.setObjectName("OpenBox") self.OpenBox.setGeometry(QRect(400, 570, 160, 30)) self.OpenBox.setEditable(False) self.OpenBox.setDuplicatesEnabled(False) self.change_cbButt = QPushButton(self.centralwidget) self.change_cbButt.setObjectName("change_cbButt") self.change_cbButt.setGeometry(QRect(20, 650, 321, 28)) self.OpenBox.raise_() self.UpdateButt.raise_() self.AnalizButt.raise_() self.DeleteButt.raise_() self.change_cbButt.raise_() self.progressBar.raise_() self.PathFile.raise_() self.tableWidget.raise_() self.saveButt.raise_() self.comboBox.raise_() self.comboBox_2.raise_() MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle( QCoreApplication.translate("MainWindow", "MainWindow", None)) #if QT_CONFIG(accessibility) self.tableWidget.setAccessibleName("") #endif // QT_CONFIG(accessibility) self.comboBox.setItemText( 0, QCoreApplication.translate("MainWindow", "Поиск по ...", None)) self.comboBox.setItemText( 1, QCoreApplication.translate("MainWindow", "Поиск по никнейму", None)) self.comboBox.setItemText( 2, QCoreApplication.translate("MainWindow", "Поиск по номеру телефона", None)) self.comboBox.setItemText( 3, QCoreApplication.translate("MainWindow", "Поиск по фамилии", None)) self.comboBox.setCurrentText( QCoreApplication.translate( "MainWindow", "\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", None)) self.comboBox.setPlaceholderText("") self.saveButt.setText( QCoreApplication.translate("MainWindow", "Сохранить данные", None)) self.OpenBox.setItemText( 0, QCoreApplication.translate("MainWindow", "Загрузить данные", None)) self.OpenBox.setItemText( 1, QCoreApplication.translate("MainWindow", "Выбрать папку", None)) self.OpenBox.setItemText( 2, QCoreApplication.translate("MainWindow", "Ввести данные", None)) self.change_cbButt.setText( QCoreApplication.translate("MainWindow", "Изменить парамметры", None)) self.DeleteButt.setText( QCoreApplication.translate("MainWindow", "Удалить данные", None)) self.UpdateButt.setText( QCoreApplication.translate("MainWindow", "Обновить данные", None)) self.AnalizButt.setText( QCoreApplication.translate("MainWindow", "Анализировать", None)) self.comboBox_2.setItemText( 0, QCoreApplication.translate("MainWindow", "1 - 100", None))