def setObject(self, mobj): element = moose.element(mobj) try: view = self.view_dict[element] except KeyError: view = ObjectEditView(element) self.view_dict[element] = view view.model().objectNameChanged.connect(self.emitObjectNameChanged) view.colorDialog.colorSelected.connect( lambda color: self.colorChanged.emit(element, color)) textEdit = QTextEdit() view.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) textEdit.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) base = QSplitter() base.setOrientation(QtCore.Qt.Vertical) layout = QVBoxLayout() layout.addWidget(view) #, 0, 0) lineedit = QLineEdit("Notes:") lineedit.setReadOnly(True) layout.addWidget(lineedit) if (isinstance(mobj, moose.PoolBase) or isinstance(mobj, moose.ReacBase) or isinstance(mobj, moose.EnzBase)): info = moose.Annotator(mobj.path + '/info') textEdit.setText(QtCore.QString(info.getField('notes'))) textEdit.textChanged.connect( lambda: info.setField('notes', str(textEdit.toPlainText()))) layout.addWidget(textEdit) #,1,0) base.setLayout(layout) self.setWidget(base) self.setWindowTitle('Edit: %s' % (element.path)) view.update()
def initWindow(self): QToolTip.setFont(QFont('SansSerif', 10)) # main layout self.frameWidget = QWidget() mainWidget = QSplitter(Qt.Horizontal) self.frameLayout = QVBoxLayout() self.settingWidget = QWidget() settingLayout = QVBoxLayout() self.settingWidget.setProperty("class", "settingWidget") mainLayout = QVBoxLayout() self.settingWidget.setLayout(settingLayout) mainLayout.addWidget(self.settingWidget) mainLayout.setStretch(0, 2) menuLayout = QHBoxLayout() self.progressHint = QLabel() self.progressHint.hide() self.progressbarRootWidget = QWidget() progressbarLayout = QVBoxLayout() self.progressbarRootWidget.setProperty("class", "progressbarWidget") self.progressbarRootWidget.setLayout(progressbarLayout) self.downloadWidget = QWidget() downloadLayout = QVBoxLayout() self.downloadWidget.setProperty("class", "downloadWidget") self.downloadWidget.setLayout(downloadLayout) mainWidget.setLayout(mainLayout) # menu # ----- # settings and others # ----- # progress bar # ----- # download button # ----- # status bar self.frameLayout.addLayout(menuLayout) self.frameLayout.addWidget(mainWidget) self.frameLayout.addWidget(self.progressHint) self.frameLayout.addWidget(self.progressbarRootWidget) self.frameLayout.addWidget(self.downloadWidget) self.frameWidget.setLayout(self.frameLayout) self.setCentralWidget(self.frameWidget) self.setFrameStrentch(1) # option layout self.langButton = QPushButton() self.skinButton = QPushButton() self.aboutButton = QPushButton() self.langButton.setProperty("class", "menuItemLang") self.skinButton.setProperty("class", "menuItem2") self.aboutButton.setProperty("class", "menuItem3") self.langButton.setObjectName("menuItem") self.skinButton.setObjectName("menuItem") self.aboutButton.setObjectName("menuItem") menuLayout.addWidget(self.langButton) menuLayout.addWidget(self.skinButton) menuLayout.addWidget(self.aboutButton) menuLayout.addStretch(0) # widgets file select self.fileSelectGroupBox = QGroupBox(tr("SelectFile")) # container settingLayout.addWidget(self.fileSelectGroupBox) self.fileSelectContainerLayout = QVBoxLayout() self.fileSelectGroupBox.setLayout(self.fileSelectContainerLayout) # file selection self.fileSelecWidget = QWidget() self.fileSelectLayout = QVBoxLayout() self.fileSelecWidget.setLayout(self.fileSelectLayout) self.fileSelectContainerLayout.addWidget(self.fileSelecWidget) # add file selection item self.addFileSelectionItem() # add fileselection functions mergeBinWidget = QWidget() mergeBinWidgetLayout = QHBoxLayout() mergeBinWidget.setLayout(mergeBinWidgetLayout) self.addFileButton = QPushButton(tr("Add File")) self.packFilesButton = QPushButton(tr("Pack to kfpkg")) self.mergeBinButton = QPushButton(tr("Merge to .bin")) mergeBinWidgetLayout.addWidget(self.addFileButton) mergeBinWidgetLayout.addWidget(self.packFilesButton) mergeBinWidgetLayout.addWidget(self.mergeBinButton) self.fileSelectContainerLayout.addWidget(mergeBinWidget) # widgets board select boardSettingsGroupBox = QGroupBox(tr("BoardSettings")) settingLayout.addWidget(boardSettingsGroupBox) boardSettingsLayout = QGridLayout() boardSettingsGroupBox.setLayout(boardSettingsLayout) self.boardLabel = QLabel(tr("Board")) self.boardCombobox = ComboBox() self.boardCombobox.addItem(parameters.SipeedMaixDock) self.boardCombobox.addItem(parameters.SipeedMaixBit) self.boardCombobox.addItem(parameters.SipeedMaixBitMic) self.boardCombobox.addItem(parameters.SipeedMaixduino) self.boardCombobox.addItem(parameters.SipeedMaixGo) self.boardCombobox.addItem(parameters.SipeedMaixGoD) self.boardCombobox.addItem(parameters.M5StickV) self.boardCombobox.addItem(parameters.KendryteKd233) self.boardCombobox.addItem(parameters.kendryteTrainer) self.boardCombobox.addItem(parameters.Auto) self.burnPositionLabel = QLabel(tr("BurnTo")) self.burnPositionCombobox = ComboBox() self.burnPositionCombobox.addItem(tr("Flash")) self.burnPositionCombobox.addItem(tr("SRAM")) boardSettingsLayout.addWidget(self.boardLabel, 0, 0) boardSettingsLayout.addWidget(self.boardCombobox, 0, 1) boardSettingsLayout.addWidget(self.burnPositionLabel, 1, 0) boardSettingsLayout.addWidget(self.burnPositionCombobox, 1, 1) # widgets serial settings serialSettingsGroupBox = QGroupBox(tr("SerialSettings")) serialSettingsLayout = QGridLayout() serialPortLabek = QLabel(tr("SerialPort")) serailBaudrateLabel = QLabel(tr("SerialBaudrate")) slowModeLabel = QLabel(tr("Speed mode")) self.serialPortCombobox = ComboBox() self.serailBaudrateCombobox = ComboBox() self.serailBaudrateCombobox.addItem("115200") self.serailBaudrateCombobox.addItem("921600") self.serailBaudrateCombobox.addItem("1500000") self.serailBaudrateCombobox.addItem("2000000") self.serailBaudrateCombobox.addItem("3500000") self.serailBaudrateCombobox.addItem("4000000") self.serailBaudrateCombobox.addItem("4500000") self.serailBaudrateCombobox.setCurrentIndex(1) self.serailBaudrateCombobox.setEditable(True) self.slowModeCombobox = ComboBox() self.slowModeCombobox.addItem(tr("Slow mode")) self.slowModeCombobox.addItem(tr("Fast mode")) slowModeLabel.setToolTip(tr("slow mode tips")) self.slowModeCombobox.setToolTip(tr("slow mode tips")) serialSettingsLayout.addWidget(serialPortLabek, 0, 0) serialSettingsLayout.addWidget(serailBaudrateLabel, 1, 0) serialSettingsLayout.addWidget(slowModeLabel, 2, 0) serialSettingsLayout.addWidget(self.serialPortCombobox, 0, 1) serialSettingsLayout.addWidget(self.serailBaudrateCombobox, 1, 1) serialSettingsLayout.addWidget(self.slowModeCombobox, 2, 1) serialSettingsGroupBox.setLayout(serialSettingsLayout) settingLayout.addWidget(serialSettingsGroupBox) # set stretch settingLayout.setStretch(0, 1) settingLayout.setStretch(1, 1) settingLayout.setStretch(2, 2) # widgets progress bar self.progressbar = QProgressBar(self.progressbarRootWidget) self.progressbar.setValue(0) self.progressbarRootWidget.hide() # widgets download area self.downloadButton = QPushButton(tr("Download")) downloadLayout.addWidget(self.downloadButton) # main window self.statusBarStauts = QLabel() self.statusBarStauts.setMinimumWidth(80) self.statusBarStauts.setText("<font color=%s>%s</font>" % ("#1aac2d", tr("DownloadHint"))) self.statusBar().addWidget(self.statusBarStauts) self.setWindowSize() self.MoveToCenter() self.setWindowTitle(parameters.appName + " V" + str(helpAbout.versionMajor) + "." + str(helpAbout.versionMinor)) icon = QIcon() print("icon path:" + self.DataPath + "/" + parameters.appIcon) icon.addPixmap(QPixmap(self.DataPath + "/" + parameters.appIcon), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) if sys.platform == "win32": ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID( parameters.appName) self.show() self.progressbar.setGeometry(10, 0, self.downloadWidget.width() - 25, 40) print("config file path:", parameters.configFilePath)
class MainWindow(QMainWindow): """ This class represents the main window of the kollektiv5gui. It contains a table, which displays an overview of all classes in the dataset, a menu at the top, and a read-only textbox below the table. """ # Signal used to append logging output, allows printing from another thread sig = pyqtSignal(str) def __init__(self): super().__init__() self.__initDataset() self.__initWindow() self.__initTopBar() self.__initMenuBar() self.__initTable() self.__initConsole() # Sizes of the splitterWidget (the vertical splitter) need to be set # after all elements have been added to it. This is slightly ugly, # but the best way to solve this (I think). self.splitterWidget.setSizes([512, 128]) self.show() logging.setLoggingFunction(lambda x: self.sig.emit(x)) self.sig.connect(self.log) def __initWindow(self): """ Initialize the main properties of the window. """ self.setWindowTitle('Kollektiv 5 GUI') self.resize(1280, 720) self.mainWidget = QWidget() self.layout = QVBoxLayout() self.layout.setDirection(QVBoxLayout.BottomToTop) self.mainWidget.setLayout(self.layout) self.setCentralWidget(self.mainWidget) self.splitterWidget = QSplitter() self.splitterWidget.setOrientation(Qt.Vertical) self.splitterWidgetLayout = QVBoxLayout(self.splitterWidget) self.splitterWidget.setLayout(self.splitterWidgetLayout) self.layout.addWidget(self.splitterWidget) def __initMenuBar(self): """ Initialize the menu bar for the window. """ self.menu = self.menuBar() actionQuit = QAction('Close', self) actionQuit.triggered.connect(self.close) actionViewHelp = QAction('View Documentation', self) actionViewHelp.triggered.connect(self.help) actionApiPrefs = QAction('API', self) actionApiPrefs.triggered.connect(self.openApiSettings) # top-level menus menuFile = self.menu.addMenu('File') menuPrefs = self.menu.addMenu('Preferences') menuHelp = self.menu.addMenu('Help') # "File" menu menuFile.addAction(actionQuit) # "Preferences" menu menuPrefs.addAction(actionApiPrefs) # "Help" menu menuHelp.addAction(actionViewHelp) def __initTopBar(self): """ Initialize the two buttons atop the dataset table """ self.topBar = QHBoxLayout() self.generateButtonAny = QPushButton('Generate Any') self.generateButtonAny.clicked.connect( self.openGeneratingWindowNoTarget) self.topBar.addWidget(self.generateButtonAny) self.generateButtonSelected = QPushButton('Generate Selected') self.generateButtonSelected.setEnabled(False) self.generateButtonSelected.clicked.connect(self.openGeneratingWindow) self.topBar.addWidget(self.generateButtonSelected) self.layout.addLayout(self.topBar) def __initTable(self): """ Create the dataset table and place it at the top of the vertical splitter. """ self.table = DatasetTableWidget(self, self.splitterWidget) self.splitterWidgetLayout.addWidget(self.table) def __initConsole(self): """ Create a read-only textbox at the bottom of the vertical splitter. It is used to print text-based information. """ self.console = QTextEdit(self.splitterWidget) self.console.setReadOnly(True) self.log('Started...') self.splitterWidgetLayout.addWidget(self.console) def __initDataset(self): """ Load the dataset from the default path """ self.__dataset = Dataset() self.__dataset.loadFromFile( os.path.join(getResourcePath(), 'dataset.json')) def getDataset(self): return self.__dataset def openGeneratingWindowNoTarget(self): """ Open the generating window without any target classes specified. """ self.generatingWindow = GeneratingWindow(self, []) def openGeneratingWindow(self): """ Open the generating window with a set of target classes specified. """ selectedClasses = self.table.getSelectedClasses() selectedClassesNames = [c.name for c in selectedClasses] unknownClasses = list(filter(lambda x: not x.known, selectedClasses)) if len(unknownClasses) > 0: # display a warning if classes may be unknown in the API msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText('At least one of the classes you are trying to ' 'generate may not be recognized by the API!') msg.setWindowTitle('Warning!') msg.setDetailedText('\n'.join([c.name for c in unknownClasses])) msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) retval = msg.exec_() if retval & QMessageBox.Ok == 0: return self.generatingWindow = GeneratingWindow(self, selectedClassesNames) def openApiSettings(self): """ Open the window to modify the API settings """ self.configureApiWindow = ConfigureApiWindow(self) def log(self, text): """ Print a text to the read-only textbox at the bottom of the window. """ date = time.strftime('%H:%M:%S') text = '%s: %s' % (date, text) print(text) self.console.setText('%s\n%s' % (self.console.toPlainText(), text)) self.console.verticalScrollBar().setValue( self.console.verticalScrollBar().maximum()) self.statusBar().showMessage(text) def help(self): """ Open the handbook in the system's PDF reader """ # webbrowser.open does not necessarily open the file in a webbrowser # it opens it in whatever program the user has set as their pdf reader webbrowser.open('file://%s' % os.path.join(getResourcePath(), 'handbook.pdf'))
def initWindow(self): QToolTip.setFont(QFont('SansSerif', 10)) # main layout frameWidget = QWidget() mainWidget = QSplitter(Qt.Horizontal) frameLayout = QVBoxLayout() self.settingWidget = QWidget() self.settingWidget.setProperty("class", "settingWidget") self.receiveSendWidget = QSplitter(Qt.Vertical) self.functionalWiget = QWidget() settingLayout = QVBoxLayout() sendReceiveLayout = QVBoxLayout() sendFunctionalLayout = QVBoxLayout() mainLayout = QHBoxLayout() self.settingWidget.setLayout(settingLayout) self.receiveSendWidget.setLayout(sendReceiveLayout) self.functionalWiget.setLayout(sendFunctionalLayout) mainLayout.addWidget(self.settingWidget) mainLayout.addWidget(self.receiveSendWidget) mainLayout.addWidget(self.functionalWiget) mainLayout.setStretch(0, 2) mainLayout.setStretch(1, 6) mainLayout.setStretch(2, 2) menuLayout = QHBoxLayout() mainWidget.setLayout(mainLayout) frameLayout.addLayout(menuLayout) frameLayout.addWidget(mainWidget) frameWidget.setLayout(frameLayout) self.setCentralWidget(frameWidget) # option layout self.settingsButton = QPushButton() self.skinButton = QPushButton("") self.aboutButton = QPushButton() self.functionalButton = QPushButton() self.settingsButton.setProperty("class", "menuItem1") self.skinButton.setProperty("class", "menuItem2") self.aboutButton.setProperty("class", "menuItem3") self.functionalButton.setProperty("class", "menuItem4") self.settingsButton.setObjectName("menuItem") self.skinButton.setObjectName("menuItem") self.aboutButton.setObjectName("menuItem") self.functionalButton.setObjectName("menuItem") menuLayout.addWidget(self.settingsButton) menuLayout.addWidget(self.skinButton) menuLayout.addWidget(self.aboutButton) menuLayout.addStretch(0) menuLayout.addWidget(self.functionalButton) # widgets receive and send area self.receiveArea = QTextEdit() self.sendArea = QTextEdit() self.clearReceiveButtion = QPushButton(parameters.strClearReceive) self.sendButtion = QPushButton(parameters.strSend) self.sendHistory = ComboBox() sendWidget = QWidget() sendAreaWidgetsLayout = QHBoxLayout() sendWidget.setLayout(sendAreaWidgetsLayout) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.clearReceiveButtion) buttonLayout.addStretch(1) buttonLayout.addWidget(self.sendButtion) sendAreaWidgetsLayout.addWidget(self.sendArea) sendAreaWidgetsLayout.addLayout(buttonLayout) sendReceiveLayout.addWidget(self.receiveArea) sendReceiveLayout.addWidget(sendWidget) sendReceiveLayout.addWidget(self.sendHistory) sendReceiveLayout.setStretch(0, 7) sendReceiveLayout.setStretch(1, 2) sendReceiveLayout.setStretch(2, 1) # widgets serial settings serialSettingsGroupBox = QGroupBox(parameters.strSerialSettings) serialSettingsLayout = QGridLayout() serialReceiveSettingsLayout = QGridLayout() serialSendSettingsLayout = QGridLayout() serialPortLabek = QLabel(parameters.strSerialPort) serailBaudrateLabel = QLabel(parameters.strSerialBaudrate) serailBytesLabel = QLabel(parameters.strSerialBytes) serailParityLabel = QLabel(parameters.strSerialParity) serailStopbitsLabel = QLabel(parameters.strSerialStopbits) self.serialPortCombobox = ComboBox() self.serailBaudrateCombobox = ComboBox() self.serailBaudrateCombobox.addItem("9600") self.serailBaudrateCombobox.addItem("19200") self.serailBaudrateCombobox.addItem("38400") self.serailBaudrateCombobox.addItem("57600") self.serailBaudrateCombobox.addItem("115200") self.serailBaudrateCombobox.setCurrentIndex(4) self.serailBaudrateCombobox.setEditable(True) self.serailBytesCombobox = ComboBox() self.serailBytesCombobox.addItem("5") self.serailBytesCombobox.addItem("6") self.serailBytesCombobox.addItem("7") self.serailBytesCombobox.addItem("8") self.serailBytesCombobox.setCurrentIndex(3) self.serailParityCombobox = ComboBox() self.serailParityCombobox.addItem("None") self.serailParityCombobox.addItem("Odd") self.serailParityCombobox.addItem("Even") self.serailParityCombobox.addItem("Mark") self.serailParityCombobox.addItem("Space") self.serailParityCombobox.setCurrentIndex(0) self.serailStopbitsCombobox = ComboBox() self.serailStopbitsCombobox.addItem("1") self.serailStopbitsCombobox.addItem("1.5") self.serailStopbitsCombobox.addItem("2") self.serailStopbitsCombobox.setCurrentIndex(0) self.serialOpenCloseButton = QPushButton(parameters.strOpen) serialSettingsLayout.addWidget(serialPortLabek, 0, 0) serialSettingsLayout.addWidget(serailBaudrateLabel, 1, 0) serialSettingsLayout.addWidget(serailBytesLabel, 2, 0) serialSettingsLayout.addWidget(serailParityLabel, 3, 0) serialSettingsLayout.addWidget(serailStopbitsLabel, 4, 0) serialSettingsLayout.addWidget(self.serialPortCombobox, 0, 1) serialSettingsLayout.addWidget(self.serailBaudrateCombobox, 1, 1) serialSettingsLayout.addWidget(self.serailBytesCombobox, 2, 1) serialSettingsLayout.addWidget(self.serailParityCombobox, 3, 1) serialSettingsLayout.addWidget(self.serailStopbitsCombobox, 4, 1) serialSettingsLayout.addWidget(self.serialOpenCloseButton, 5, 0, 1, 2) serialSettingsGroupBox.setLayout(serialSettingsLayout) settingLayout.addWidget(serialSettingsGroupBox) # serial receive settings serialReceiveSettingsGroupBox = QGroupBox( parameters.strSerialReceiveSettings) self.receiveSettingsAscii = QRadioButton(parameters.strAscii) self.receiveSettingsHex = QRadioButton(parameters.strHex) self.receiveSettingsAscii.setChecked(True) self.receiveSettingsAutoLinefeed = QCheckBox( parameters.strAutoLinefeed) self.receiveSettingsAutoLinefeedTime = QLineEdit( parameters.strAutoLinefeedTime) self.receiveSettingsAutoLinefeed.setMaximumWidth(75) self.receiveSettingsAutoLinefeedTime.setMaximumWidth(75) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAscii, 1, 0, 1, 1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsHex, 1, 1, 1, 1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAutoLinefeed, 2, 0, 1, 1) serialReceiveSettingsLayout.addWidget( self.receiveSettingsAutoLinefeedTime, 2, 1, 1, 1) serialReceiveSettingsGroupBox.setLayout(serialReceiveSettingsLayout) settingLayout.addWidget(serialReceiveSettingsGroupBox) # serial send settings serialSendSettingsGroupBox = QGroupBox( parameters.strSerialSendSettings) self.sendSettingsAscii = QRadioButton(parameters.strAscii) self.sendSettingsHex = QRadioButton(parameters.strHex) self.sendSettingsAscii.setChecked(True) self.sendSettingsScheduledCheckBox = QCheckBox(parameters.strScheduled) self.sendSettingsScheduled = QLineEdit(parameters.strScheduledTime) self.sendSettingsScheduledCheckBox.setMaximumWidth(75) self.sendSettingsScheduled.setMaximumWidth(75) self.sendSettingsCFLF = QCheckBox(parameters.strCRLF) self.sendSettingsCFLF.setChecked(False) serialSendSettingsLayout.addWidget(self.sendSettingsAscii, 1, 0, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsHex, 1, 1, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduledCheckBox, 2, 0, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduled, 2, 1, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsCFLF, 3, 0, 1, 2) serialSendSettingsGroupBox.setLayout(serialSendSettingsLayout) settingLayout.addWidget(serialSendSettingsGroupBox) settingLayout.setStretch(0, 5) settingLayout.setStretch(1, 2.5) settingLayout.setStretch(2, 2.5) # right functional layout self.addButton = QPushButton(parameters.strAdd) functionalGroupBox = QGroupBox(parameters.strFunctionalSend) functionalGridLayout = QGridLayout() functionalGridLayout.addWidget(self.addButton, 0, 1) functionalGroupBox.setLayout(functionalGridLayout) sendFunctionalLayout.addWidget(functionalGroupBox) # main window self.statusBarStauts = QLabel() self.statusBarStauts.setMinimumWidth(80) self.statusBarStauts.setText("<font color=%s>%s</font>" % ("#008200", parameters.strReady)) self.statusBarSendCount = QLabel(parameters.strSend + "(bytes): " + "0") self.statusBarReceiveCount = QLabel(parameters.strReceive + "(bytes): " + "0") self.statusBar().addWidget(self.statusBarStauts) self.statusBar().addWidget(self.statusBarSendCount, 2) self.statusBar().addWidget(self.statusBarReceiveCount, 3) # self.statusBar() self.resize(800, 500) self.MoveToCenter() self.setWindowTitle(parameters.appName + " V" + str(helpAbout.versionMajor) + "." + str(helpAbout.versionMinor)) icon = QIcon() print("icon path:" + self.DataPath + "/" + parameters.appIcon) icon.addPixmap(QPixmap(self.DataPath + "/" + parameters.appIcon), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) if sys.platform == "win32": ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID( "comtool") self.show() return
class MainWindow(QMainWindow): receiveUpdateSignal = pyqtSignal(str) errorSignal = pyqtSignal(str) isDetectSerialPort = False receiveCount = 0 sendCount = 0 isScheduledSending = False DataPath = "./" isHideSettings = False isHideFunctinal = False app = None def __init__(self, app): super().__init__() self.app = app pathDirList = sys.argv[0].replace("\\", "/").split("/") pathDirList.pop() self.DataPath = os.path.abspath("/".join(str(i) for i in pathDirList)) if not os.path.exists(self.DataPath + "/" + parameters.strDataDirName): pathDirList.pop() self.DataPath = os.path.abspath("/".join( str(i) for i in pathDirList)) self.DataPath = (self.DataPath + "/" + parameters.strDataDirName).replace("\\", "/") self.initWindow() self.initTool() self.initEvent() self.programStartGetSavedParameters() return def __del__(self): return def initTool(self): self.com = serial.Serial() return def initWindow(self): QToolTip.setFont(QFont('SansSerif', 10)) # main layout frameWidget = QWidget() mainWidget = QSplitter(Qt.Horizontal) frameLayout = QVBoxLayout() self.settingWidget = QWidget() self.settingWidget.setProperty("class", "settingWidget") self.receiveSendWidget = QSplitter(Qt.Vertical) self.functionalWiget = QWidget() settingLayout = QVBoxLayout() sendReceiveLayout = QVBoxLayout() sendFunctionalLayout = QVBoxLayout() mainLayout = QHBoxLayout() self.settingWidget.setLayout(settingLayout) self.receiveSendWidget.setLayout(sendReceiveLayout) self.functionalWiget.setLayout(sendFunctionalLayout) mainLayout.addWidget(self.settingWidget) mainLayout.addWidget(self.receiveSendWidget) mainLayout.addWidget(self.functionalWiget) mainLayout.setStretch(0, 2) mainLayout.setStretch(1, 6) mainLayout.setStretch(2, 2) menuLayout = QHBoxLayout() mainWidget.setLayout(mainLayout) frameLayout.addLayout(menuLayout) frameLayout.addWidget(mainWidget) frameWidget.setLayout(frameLayout) self.setCentralWidget(frameWidget) # option layout self.settingsButton = QPushButton() self.skinButton = QPushButton("") self.aboutButton = QPushButton() self.functionalButton = QPushButton() self.settingsButton.setProperty("class", "menuItem1") self.skinButton.setProperty("class", "menuItem2") self.aboutButton.setProperty("class", "menuItem3") self.functionalButton.setProperty("class", "menuItem4") self.settingsButton.setObjectName("menuItem") self.skinButton.setObjectName("menuItem") self.aboutButton.setObjectName("menuItem") self.functionalButton.setObjectName("menuItem") menuLayout.addWidget(self.settingsButton) menuLayout.addWidget(self.skinButton) menuLayout.addWidget(self.aboutButton) menuLayout.addStretch(0) menuLayout.addWidget(self.functionalButton) # widgets receive and send area self.receiveArea = QTextEdit() self.sendArea = QTextEdit() self.clearReceiveButtion = QPushButton(parameters.strClearReceive) self.sendButtion = QPushButton(parameters.strSend) self.sendHistory = ComboBox() sendWidget = QWidget() sendAreaWidgetsLayout = QHBoxLayout() sendWidget.setLayout(sendAreaWidgetsLayout) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.clearReceiveButtion) buttonLayout.addStretch(1) buttonLayout.addWidget(self.sendButtion) sendAreaWidgetsLayout.addWidget(self.sendArea) sendAreaWidgetsLayout.addLayout(buttonLayout) sendReceiveLayout.addWidget(self.receiveArea) sendReceiveLayout.addWidget(sendWidget) sendReceiveLayout.addWidget(self.sendHistory) sendReceiveLayout.setStretch(0, 7) sendReceiveLayout.setStretch(1, 2) sendReceiveLayout.setStretch(2, 1) # widgets serial settings serialSettingsGroupBox = QGroupBox(parameters.strSerialSettings) serialSettingsLayout = QGridLayout() serialReceiveSettingsLayout = QGridLayout() serialSendSettingsLayout = QGridLayout() serialPortLabek = QLabel(parameters.strSerialPort) serailBaudrateLabel = QLabel(parameters.strSerialBaudrate) serailBytesLabel = QLabel(parameters.strSerialBytes) serailParityLabel = QLabel(parameters.strSerialParity) serailStopbitsLabel = QLabel(parameters.strSerialStopbits) self.serialPortCombobox = ComboBox() self.serailBaudrateCombobox = ComboBox() self.serailBaudrateCombobox.addItem("9600") self.serailBaudrateCombobox.addItem("19200") self.serailBaudrateCombobox.addItem("38400") self.serailBaudrateCombobox.addItem("57600") self.serailBaudrateCombobox.addItem("115200") self.serailBaudrateCombobox.setCurrentIndex(4) self.serailBaudrateCombobox.setEditable(True) self.serailBytesCombobox = ComboBox() self.serailBytesCombobox.addItem("5") self.serailBytesCombobox.addItem("6") self.serailBytesCombobox.addItem("7") self.serailBytesCombobox.addItem("8") self.serailBytesCombobox.setCurrentIndex(3) self.serailParityCombobox = ComboBox() self.serailParityCombobox.addItem("None") self.serailParityCombobox.addItem("Odd") self.serailParityCombobox.addItem("Even") self.serailParityCombobox.addItem("Mark") self.serailParityCombobox.addItem("Space") self.serailParityCombobox.setCurrentIndex(0) self.serailStopbitsCombobox = ComboBox() self.serailStopbitsCombobox.addItem("1") self.serailStopbitsCombobox.addItem("1.5") self.serailStopbitsCombobox.addItem("2") self.serailStopbitsCombobox.setCurrentIndex(0) self.serialOpenCloseButton = QPushButton(parameters.strOpen) serialSettingsLayout.addWidget(serialPortLabek, 0, 0) serialSettingsLayout.addWidget(serailBaudrateLabel, 1, 0) serialSettingsLayout.addWidget(serailBytesLabel, 2, 0) serialSettingsLayout.addWidget(serailParityLabel, 3, 0) serialSettingsLayout.addWidget(serailStopbitsLabel, 4, 0) serialSettingsLayout.addWidget(self.serialPortCombobox, 0, 1) serialSettingsLayout.addWidget(self.serailBaudrateCombobox, 1, 1) serialSettingsLayout.addWidget(self.serailBytesCombobox, 2, 1) serialSettingsLayout.addWidget(self.serailParityCombobox, 3, 1) serialSettingsLayout.addWidget(self.serailStopbitsCombobox, 4, 1) serialSettingsLayout.addWidget(self.serialOpenCloseButton, 5, 0, 1, 2) serialSettingsGroupBox.setLayout(serialSettingsLayout) settingLayout.addWidget(serialSettingsGroupBox) # serial receive settings serialReceiveSettingsGroupBox = QGroupBox( parameters.strSerialReceiveSettings) self.receiveSettingsAscii = QRadioButton(parameters.strAscii) self.receiveSettingsHex = QRadioButton(parameters.strHex) self.receiveSettingsAscii.setChecked(True) self.receiveSettingsAutoLinefeed = QCheckBox( parameters.strAutoLinefeed) self.receiveSettingsAutoLinefeedTime = QLineEdit( parameters.strAutoLinefeedTime) self.receiveSettingsAutoLinefeed.setMaximumWidth(75) self.receiveSettingsAutoLinefeedTime.setMaximumWidth(75) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAscii, 1, 0, 1, 1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsHex, 1, 1, 1, 1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAutoLinefeed, 2, 0, 1, 1) serialReceiveSettingsLayout.addWidget( self.receiveSettingsAutoLinefeedTime, 2, 1, 1, 1) serialReceiveSettingsGroupBox.setLayout(serialReceiveSettingsLayout) settingLayout.addWidget(serialReceiveSettingsGroupBox) # serial send settings serialSendSettingsGroupBox = QGroupBox( parameters.strSerialSendSettings) self.sendSettingsAscii = QRadioButton(parameters.strAscii) self.sendSettingsHex = QRadioButton(parameters.strHex) self.sendSettingsAscii.setChecked(True) self.sendSettingsScheduledCheckBox = QCheckBox(parameters.strScheduled) self.sendSettingsScheduled = QLineEdit(parameters.strScheduledTime) self.sendSettingsScheduledCheckBox.setMaximumWidth(75) self.sendSettingsScheduled.setMaximumWidth(75) self.sendSettingsCFLF = QCheckBox(parameters.strCRLF) self.sendSettingsCFLF.setChecked(False) serialSendSettingsLayout.addWidget(self.sendSettingsAscii, 1, 0, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsHex, 1, 1, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduledCheckBox, 2, 0, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduled, 2, 1, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsCFLF, 3, 0, 1, 2) serialSendSettingsGroupBox.setLayout(serialSendSettingsLayout) settingLayout.addWidget(serialSendSettingsGroupBox) settingLayout.setStretch(0, 5) settingLayout.setStretch(1, 2.5) settingLayout.setStretch(2, 2.5) # right functional layout self.addButton = QPushButton(parameters.strAdd) functionalGroupBox = QGroupBox(parameters.strFunctionalSend) functionalGridLayout = QGridLayout() functionalGridLayout.addWidget(self.addButton, 0, 1) functionalGroupBox.setLayout(functionalGridLayout) sendFunctionalLayout.addWidget(functionalGroupBox) # main window self.statusBarStauts = QLabel() self.statusBarStauts.setMinimumWidth(80) self.statusBarStauts.setText("<font color=%s>%s</font>" % ("#008200", parameters.strReady)) self.statusBarSendCount = QLabel(parameters.strSend + "(bytes): " + "0") self.statusBarReceiveCount = QLabel(parameters.strReceive + "(bytes): " + "0") self.statusBar().addWidget(self.statusBarStauts) self.statusBar().addWidget(self.statusBarSendCount, 2) self.statusBar().addWidget(self.statusBarReceiveCount, 3) # self.statusBar() self.resize(800, 500) self.MoveToCenter() self.setWindowTitle(parameters.appName + " V" + str(helpAbout.versionMajor) + "." + str(helpAbout.versionMinor)) icon = QIcon() print("icon path:" + self.DataPath + "/" + parameters.appIcon) icon.addPixmap(QPixmap(self.DataPath + "/" + parameters.appIcon), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) if sys.platform == "win32": ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID( "comtool") self.show() return def initEvent(self): self.serialOpenCloseButton.clicked.connect(self.openCloseSerial) self.sendButtion.clicked.connect(self.sendData) self.receiveUpdateSignal.connect(self.updateReceivedDataDisplay) self.clearReceiveButtion.clicked.connect(self.clearReceiveBuffer) self.serialPortCombobox.clicked.connect(self.portComboboxClicked) self.sendSettingsHex.clicked.connect(self.onSendSettingsHexClicked) self.sendSettingsAscii.clicked.connect(self.onSendSettingsAsciiClicked) self.errorSignal.connect(self.errorHint) self.sendHistory.currentIndexChanged.connect( self.sendHistoryIndexChanged) self.settingsButton.clicked.connect(self.showHideSettings) self.skinButton.clicked.connect(self.skinChange) self.aboutButton.clicked.connect(self.showAbout) self.addButton.clicked.connect(self.functionAdd) self.functionalButton.clicked.connect(self.showHideFunctional) return def openCloseSerialProcess(self): try: if self.com.is_open: self.com.close() self.serialOpenCloseButton.setText(parameters.strOpen) self.statusBarStauts.setText("<font color=%s>%s</font>" % ("#f31414", parameters.strClosed)) self.receiveProgressStop = True self.serialPortCombobox.setDisabled(False) self.serailBaudrateCombobox.setDisabled(False) self.serailParityCombobox.setDisabled(False) self.serailStopbitsCombobox.setDisabled(False) self.serailBytesCombobox.setDisabled(False) self.programExitSaveParameters() else: try: self.com.baudrate = int( self.serailBaudrateCombobox.currentText()) self.com.port = self.serialPortCombobox.currentText( ).split(" ")[0] self.com.bytesize = int( self.serailBytesCombobox.currentText()) self.com.parity = self.serailParityCombobox.currentText( )[0] self.com.stopbits = float( self.serailStopbitsCombobox.currentText()) self.com.timeout = None print(self.com) self.serialOpenCloseButton.setDisabled(True) self.com.open() self.serialOpenCloseButton.setText(parameters.strClose) self.statusBarStauts.setText( "<font color=%s>%s</font>" % ("#008200", parameters.strReady)) self.serialPortCombobox.setDisabled(True) self.serailBaudrateCombobox.setDisabled(True) self.serailParityCombobox.setDisabled(True) self.serailStopbitsCombobox.setDisabled(True) self.serailBytesCombobox.setDisabled(True) self.serialOpenCloseButton.setDisabled(False) receiveProcess = threading.Thread(target=self.receiveData) receiveProcess.setDaemon(True) receiveProcess.start() except Exception as e: self.com.close() self.receiveProgressStop = True self.errorSignal.emit(parameters.strOpenFailed + "\n" + str(e)) self.serialOpenCloseButton.setDisabled(False) except Exception: pass return def openCloseSerial(self): t = threading.Thread(target=self.openCloseSerialProcess) t.setDaemon(True) t.start() return def portComboboxClicked(self): self.detectSerialPort() return def getSendData(self): data = self.sendArea.toPlainText() if self.sendSettingsCFLF.isChecked(): data = data.replace("\n", "\r\n") if self.sendSettingsHex.isChecked(): if self.sendSettingsCFLF.isChecked(): data = data.replace("\r\n", " ") else: data = data.replace("\n", " ") data = self.hexStringB2Hex(data) if data == -1: self.errorSignal.emit(parameters.strWriteFormatError) return -1 else: data = data.encode() return data def sendData(self): try: if self.com.is_open: data = self.getSendData() if data == -1: return print(self.sendArea.toPlainText()) print("send:", data) self.sendCount += len(data) self.com.write(data) data = self.sendArea.toPlainText() self.sendHistoryFindDelete(data) self.sendHistory.insertItem(0, data) self.sendHistory.setCurrentIndex(0) self.receiveUpdateSignal.emit("") # scheduled send if self.sendSettingsScheduledCheckBox.isChecked(): if not self.isScheduledSending: t = threading.Thread(target=self.scheduledSend) t.setDaemon(True) t.start() except Exception as e: self.errorSignal.emit(parameters.strWriteError) print(e) return def scheduledSend(self): self.isScheduledSending = True while self.sendSettingsScheduledCheckBox.isChecked(): self.sendData() try: time.sleep( int(self.sendSettingsScheduled.text().strip()) / 1000) except Exception: self.errorSignal.emit(parameters.strTimeFormatError) self.isScheduledSending = False return def receiveData(self): self.receiveProgressStop = False self.timeLastReceive = 0 while (not self.receiveProgressStop): try: length = self.com.in_waiting if length > 0: bytes = self.com.read(length) self.receiveCount += len(bytes) if self.receiveSettingsHex.isChecked(): strReceived = self.asciiB2HexString(bytes) self.receiveUpdateSignal.emit(strReceived) else: self.receiveUpdateSignal.emit( bytes.decode("utf-8", "ignore")) if self.receiveSettingsAutoLinefeed.isChecked(): if time.time() - self.timeLastReceive > int( self.receiveSettingsAutoLinefeedTime.text( )) / 1000: if self.sendSettingsCFLF.isChecked(): self.receiveUpdateSignal.emit("\r\n") else: self.receiveUpdateSignal.emit("\n") self.timeLastReceive = time.time() except Exception as e: print("receiveData error") if self.com.is_open and not self.serialPortCombobox.isEnabled( ): self.openCloseSerial() self.serialPortCombobox.clear() self.detectSerialPort() print(e) time.sleep(0.009) return def updateReceivedDataDisplay(self, str): if str != "": curScrollValue = self.receiveArea.verticalScrollBar().value() self.receiveArea.moveCursor(QTextCursor.End) endScrollValue = self.receiveArea.verticalScrollBar().value() self.receiveArea.insertPlainText(str) if curScrollValue < endScrollValue: self.receiveArea.verticalScrollBar().setValue(curScrollValue) else: self.receiveArea.moveCursor(QTextCursor.End) self.statusBarSendCount.setText("%s(bytes):%d" % (parameters.strSend, self.sendCount)) self.statusBarReceiveCount.setText( "%s(bytes):%d" % (parameters.strReceive, self.receiveCount)) return def onSendSettingsHexClicked(self): data = self.sendArea.toPlainText().replace("\n", "\r\n") data = self.asciiB2HexString(data.encode()) self.sendArea.clear() self.sendArea.insertPlainText(data) return def onSendSettingsAsciiClicked(self): try: data = self.sendArea.toPlainText().replace("\n", " ").strip() self.sendArea.clear() if data != "": data = self.hexStringB2Hex(data).decode('utf-8', 'ignore') self.sendArea.insertPlainText(data) except Exception as e: QMessageBox.information(self, parameters.strWriteFormatError, parameters.strWriteFormatError) return def sendHistoryIndexChanged(self): self.sendArea.clear() self.sendArea.insertPlainText(self.sendHistory.currentText()) return def clearReceiveBuffer(self): self.receiveArea.clear() self.receiveCount = 0 self.sendCount = 0 self.receiveUpdateSignal.emit(None) return def MoveToCenter(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) return def errorHint(self, str): QMessageBox.information(self, str, str) return def closeEvent(self, event): reply = QMessageBox.question(self, 'Sure To Quit?', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.com.close() self.receiveProgressStop = True self.programExitSaveParameters() event.accept() else: event.ignore() def findSerialPort(self): self.port_list = list(serial.tools.list_ports.comports()) return self.port_list def portChanged(self): self.serialPortCombobox.setCurrentIndex(0) self.serialPortCombobox.setToolTip(str(self.portList[0])) def detectSerialPort(self): if not self.isDetectSerialPort: self.isDetectSerialPort = True t = threading.Thread(target=self.detectSerialPortProcess) t.setDaemon(True) t.start() def detectSerialPortProcess(self): self.serialPortCombobox.clear() while (1): portList = self.findSerialPort() for i in portList: self.serialPortCombobox.addItem(str(i[0]) + " " + str(i[1])) if len(portList) > 0: self.serialPortCombobox.setCurrentIndex(0) self.serialPortCombobox.setToolTip(str(portList[0])) break time.sleep(1) self.isDetectSerialPort = False return def sendHistoryFindDelete(self, str): self.sendHistory.removeItem(self.sendHistory.findText(str)) return def test(self): print("test") return def asciiB2HexString(self, strB): strHex = binascii.b2a_hex(strB).upper() return re.sub(r"(?<=\w)(?=(?:\w\w)+$)", " ", strHex.decode()) + " " def hexStringB2Hex(self, hexString): dataList = hexString.split(" ") j = 0 for i in dataList: if len(i) > 2: return -1 elif len(i) == 1: dataList[j] = "0" + i j += 1 data = "".join(dataList) try: data = bytes.fromhex(data) except Exception: return -1 print(data) return data def programExitSaveParameters(self): paramObj = parameters.ParametersToSave() paramObj.baudRate = self.serailBaudrateCombobox.currentIndex() paramObj.dataBytes = self.serailBytesCombobox.currentIndex() paramObj.parity = self.serailParityCombobox.currentIndex() paramObj.stopBits = self.serailStopbitsCombobox.currentIndex() paramObj.skin = self.param.skin if self.receiveSettingsHex.isChecked(): paramObj.receiveAscii = False if not self.receiveSettingsAutoLinefeed.isChecked(): paramObj.receiveAutoLinefeed = False else: paramObj.receiveAutoLinefeed = True paramObj.receiveAutoLindefeedTime = self.receiveSettingsAutoLinefeedTime.text( ) if self.sendSettingsHex.isChecked(): paramObj.sendAscii = False if not self.sendSettingsScheduledCheckBox.isChecked(): paramObj.sendScheduled = False paramObj.sendScheduledTime = self.sendSettingsScheduled.text() if not self.sendSettingsCFLF.isChecked(): paramObj.useCRLF = False paramObj.sendHistoryList.clear() for i in range(0, self.sendHistory.count()): paramObj.sendHistoryList.append(self.sendHistory.itemText(i)) f = open("settings.config", "wb") f.truncate() pickle.dump(paramObj, f) pickle.dump(paramObj.sendHistoryList, f) f.close() return def programStartGetSavedParameters(self): paramObj = parameters.ParametersToSave() try: f = open("settings.config", "rb") paramObj = pickle.load(f) paramObj.sendHistoryList = pickle.load(f) f.close() except Exception as e: f = open("settings.config", "wb") f.close() self.serailBaudrateCombobox.setCurrentIndex(paramObj.baudRate) self.serailBytesCombobox.setCurrentIndex(paramObj.dataBytes) self.serailParityCombobox.setCurrentIndex(paramObj.parity) self.serailStopbitsCombobox.setCurrentIndex(paramObj.stopBits) if paramObj.receiveAscii == False: self.receiveSettingsHex.setChecked(True) if paramObj.receiveAutoLinefeed == False: self.receiveSettingsAutoLinefeed.setChecked(False) else: self.receiveSettingsAutoLinefeed.setChecked(True) self.receiveSettingsAutoLinefeedTime.setText( paramObj.receiveAutoLindefeedTime) if paramObj.sendAscii == False: self.sendSettingsHex.setChecked(True) if paramObj.sendScheduled == False: self.sendSettingsScheduledCheckBox.setChecked(False) else: self.sendSettingsScheduledCheckBox.setChecked(True) self.sendSettingsScheduled.setText(paramObj.sendScheduledTime) if paramObj.useCRLF == False: self.sendSettingsCFLF.setChecked(False) else: self.sendSettingsCFLF.setChecked(True) for i in range(0, len(paramObj.sendHistoryList)): str = paramObj.sendHistoryList[i] self.sendHistory.addItem(str) self.param = paramObj return def keyPressEvent(self, event): if event.key() == Qt.Key_Control: self.keyControlPressed = True elif event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter: if self.keyControlPressed: self.sendData() elif event.key() == Qt.Key_L: if self.keyControlPressed: self.sendArea.clear() elif event.key() == Qt.Key_K: if self.keyControlPressed: self.receiveArea.clear() return def keyReleaseEvent(self, event): if event.key() == Qt.Key_Control: self.keyControlPressed = False return def functionAdd(self): QMessageBox.information(self, "On the way", "On the way") return def showHideSettings(self): if self.isHideSettings: self.showSettings() self.isHideSettings = False else: self.hideSettings() self.isHideSettings = True return def showSettings(self): self.settingWidget.show() self.settingsButton.setStyleSheet( parameters.strStyleShowHideButtonLeft.replace( "$DataPath", self.DataPath)) return def hideSettings(self): self.settingWidget.hide() self.settingsButton.setStyleSheet( parameters.strStyleShowHideButtonRight.replace( "$DataPath", self.DataPath)) return def showHideFunctional(self): if self.isHideFunctinal: self.showFunctional() self.isHideFunctinal = False else: self.hideFunctional() self.isHideFunctinal = True return def showFunctional(self): self.functionalWiget.show() self.functionalButton.setStyleSheet( parameters.strStyleShowHideButtonRight.replace( "$DataPath", self.DataPath)) return def hideFunctional(self): self.functionalWiget.hide() self.functionalButton.setStyleSheet( parameters.strStyleShowHideButtonLeft.replace( "$DataPath", self.DataPath)) return def skinChange(self): if self.param.skin == 1: # light file = open(self.DataPath + '/assets/qss/style-dark.qss', "r") self.param.skin = 2 else: # elif self.param.skin == 2: # dark file = open(self.DataPath + '/assets/qss/style.qss', "r") self.param.skin = 1 self.app.setStyleSheet(file.read().replace("$DataPath", self.DataPath)) return def showAbout(self): QMessageBox.information( self, "About", "<h1 style='color:#f75a5a';margin=10px;>" + parameters.appName + '</h1><br><b style="color:#08c7a1;margin = 5px;">V' + str(helpAbout.versionMajor) + "." + str(helpAbout.versionMinor) + "." + str(helpAbout.versionDev) + "</b><br><br>" + helpAbout.date + "<br><br>" + helpAbout.strAbout()) return def action1(self): print("action1") return def autoUpdateDetect(self): auto = autoUpdate.AutoUpdate() if auto.detectNewVersion(): auto.OpenBrowser() def openDevManagement(self): os.system('start devmgmt.msc')
def initWindow(self): QToolTip.setFont(QFont('SansSerif', 10)) # main layout frameWidget = QWidget() mainWidget = QSplitter(Qt.Horizontal) frameLayout = QVBoxLayout() self.settingWidget = QWidget() self.settingWidget.setProperty("class","settingWidget") self.receiveSendWidget = QSplitter(Qt.Vertical) self.functionalWiget = QWidget() settingLayout = QVBoxLayout() sendReceiveLayout = QVBoxLayout() sendFunctionalLayout = QVBoxLayout() mainLayout = QHBoxLayout() self.settingWidget.setLayout(settingLayout) self.receiveSendWidget.setLayout(sendReceiveLayout) self.functionalWiget.setLayout(sendFunctionalLayout) mainLayout.addWidget(self.settingWidget) mainLayout.addWidget(self.receiveSendWidget) mainLayout.addWidget(self.functionalWiget) mainLayout.setStretch(0,2) mainLayout.setStretch(1, 6) mainLayout.setStretch(2, 2) menuLayout = QHBoxLayout() mainWidget.setLayout(mainLayout) frameLayout.addLayout(menuLayout) frameLayout.addWidget(mainWidget) frameWidget.setLayout(frameLayout) self.setCentralWidget(frameWidget) # option layout self.settingsButton = QPushButton() self.skinButton = QPushButton("") self.waveButton = QPushButton("") self.aboutButton = QPushButton() self.functionalButton = QPushButton() self.encodingCombobox = ComboBox() self.encodingCombobox.addItem("ASCII") self.encodingCombobox.addItem("UTF-8") self.encodingCombobox.addItem("UTF-16") self.encodingCombobox.addItem("GBK") self.encodingCombobox.addItem("GB2312") self.encodingCombobox.addItem("GB18030") self.settingsButton.setProperty("class", "menuItem1") self.skinButton.setProperty("class", "menuItem2") self.aboutButton.setProperty("class", "menuItem3") self.functionalButton.setProperty("class", "menuItem4") self.waveButton.setProperty("class", "menuItem5") self.settingsButton.setObjectName("menuItem") self.skinButton.setObjectName("menuItem") self.aboutButton.setObjectName("menuItem") self.functionalButton.setObjectName("menuItem") self.waveButton.setObjectName("menuItem") menuLayout.addWidget(self.settingsButton) menuLayout.addWidget(self.skinButton) menuLayout.addWidget(self.waveButton) menuLayout.addWidget(self.aboutButton) menuLayout.addStretch(0) menuLayout.addWidget(self.encodingCombobox) menuLayout.addWidget(self.functionalButton) # widgets receive and send area self.receiveArea = QTextEdit() self.sendArea = QTextEdit() self.clearReceiveButtion = QPushButton(parameters.strClearReceive) self.sendButtion = QPushButton(parameters.strSend) self.sendHistory = ComboBox() sendWidget = QWidget() sendAreaWidgetsLayout = QHBoxLayout() sendWidget.setLayout(sendAreaWidgetsLayout) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.clearReceiveButtion) buttonLayout.addStretch(1) buttonLayout.addWidget(self.sendButtion) sendAreaWidgetsLayout.addWidget(self.sendArea) sendAreaWidgetsLayout.addLayout(buttonLayout) sendReceiveLayout.addWidget(self.receiveArea) sendReceiveLayout.addWidget(sendWidget) sendReceiveLayout.addWidget(self.sendHistory) sendReceiveLayout.setStretch(0, 7) sendReceiveLayout.setStretch(1, 2) sendReceiveLayout.setStretch(2, 1) # widgets serial settings serialSettingsGroupBox = QGroupBox(parameters.strSerialSettings) serialSettingsLayout = QGridLayout() serialReceiveSettingsLayout = QGridLayout() serialSendSettingsLayout = QGridLayout() serialPortLabek = QLabel(parameters.strSerialPort) serailBaudrateLabel = QLabel(parameters.strSerialBaudrate) serailBytesLabel = QLabel(parameters.strSerialBytes) serailParityLabel = QLabel(parameters.strSerialParity) serailStopbitsLabel = QLabel(parameters.strSerialStopbits) self.serialPortCombobox = ComboBox() self.serailBaudrateCombobox = ComboBox() self.serailBaudrateCombobox.addItem("9600") self.serailBaudrateCombobox.addItem("19200") self.serailBaudrateCombobox.addItem("38400") self.serailBaudrateCombobox.addItem("57600") self.serailBaudrateCombobox.addItem("115200") self.serailBaudrateCombobox.setCurrentIndex(4) self.serailBaudrateCombobox.setEditable(True) self.serailBytesCombobox = ComboBox() self.serailBytesCombobox.addItem("5") self.serailBytesCombobox.addItem("6") self.serailBytesCombobox.addItem("7") self.serailBytesCombobox.addItem("8") self.serailBytesCombobox.setCurrentIndex(3) self.serailParityCombobox = ComboBox() self.serailParityCombobox.addItem("None") self.serailParityCombobox.addItem("Odd") self.serailParityCombobox.addItem("Even") self.serailParityCombobox.addItem("Mark") self.serailParityCombobox.addItem("Space") self.serailParityCombobox.setCurrentIndex(0) self.serailStopbitsCombobox = ComboBox() self.serailStopbitsCombobox.addItem("1") self.serailStopbitsCombobox.addItem("1.5") self.serailStopbitsCombobox.addItem("2") self.serailStopbitsCombobox.setCurrentIndex(0) self.checkBoxRts = QCheckBox("rts") self.checkBoxDtr = QCheckBox("dtr") self.serialOpenCloseButton = QPushButton(parameters.strOpen) serialSettingsLayout.addWidget(serialPortLabek,0,0) serialSettingsLayout.addWidget(serailBaudrateLabel, 1, 0) serialSettingsLayout.addWidget(serailBytesLabel, 2, 0) serialSettingsLayout.addWidget(serailParityLabel, 3, 0) serialSettingsLayout.addWidget(serailStopbitsLabel, 4, 0) serialSettingsLayout.addWidget(self.serialPortCombobox, 0, 1) serialSettingsLayout.addWidget(self.serailBaudrateCombobox, 1, 1) serialSettingsLayout.addWidget(self.serailBytesCombobox, 2, 1) serialSettingsLayout.addWidget(self.serailParityCombobox, 3, 1) serialSettingsLayout.addWidget(self.serailStopbitsCombobox, 4, 1) serialSettingsLayout.addWidget(self.checkBoxRts, 5, 0,1,1) serialSettingsLayout.addWidget(self.checkBoxDtr, 5, 1,1,1) serialSettingsLayout.addWidget(self.serialOpenCloseButton, 6, 0,1,2) serialSettingsGroupBox.setLayout(serialSettingsLayout) settingLayout.addWidget(serialSettingsGroupBox) # serial receive settings serialReceiveSettingsGroupBox = QGroupBox(parameters.strSerialReceiveSettings) self.receiveSettingsAscii = QRadioButton(parameters.strAscii) self.receiveSettingsHex = QRadioButton(parameters.strHex) self.receiveSettingsAscii.setChecked(True) self.receiveSettingsAutoLinefeed = QCheckBox(parameters.strAutoLinefeed) self.receiveSettingsAutoLinefeedTime = QLineEdit(parameters.strAutoLinefeedTime) self.receiveSettingsAutoLinefeed.setMaximumWidth(75) self.receiveSettingsAutoLinefeedTime.setMaximumWidth(75) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAscii,1,0,1,1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsHex,1,1,1,1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAutoLinefeed, 2, 0, 1, 1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAutoLinefeedTime, 2, 1, 1, 1) serialReceiveSettingsGroupBox.setLayout(serialReceiveSettingsLayout) settingLayout.addWidget(serialReceiveSettingsGroupBox) # serial send settings serialSendSettingsGroupBox = QGroupBox(parameters.strSerialSendSettings) self.sendSettingsAscii = QRadioButton(parameters.strAscii) self.sendSettingsHex = QRadioButton(parameters.strHex) self.sendSettingsAscii.setChecked(True) self.sendSettingsScheduledCheckBox = QCheckBox(parameters.strScheduled) self.sendSettingsScheduled = QLineEdit(parameters.strScheduledTime) self.sendSettingsScheduledCheckBox.setMaximumWidth(75) self.sendSettingsScheduled.setMaximumWidth(75) self.sendSettingsCFLF = QCheckBox(parameters.strCRLF) self.sendSettingsCFLF.setChecked(False) serialSendSettingsLayout.addWidget(self.sendSettingsAscii,1,0,1,1) serialSendSettingsLayout.addWidget(self.sendSettingsHex,1,1,1,1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduledCheckBox, 2, 0, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduled, 2, 1, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsCFLF, 3, 0, 1, 2) serialSendSettingsGroupBox.setLayout(serialSendSettingsLayout) settingLayout.addWidget(serialSendSettingsGroupBox) settingLayout.setStretch(0, 5) settingLayout.setStretch(1, 2.5) settingLayout.setStretch(2, 2.5) # right functional layout self.addButton = QPushButton(parameters.strAdd) functionalGroupBox = QGroupBox(parameters.strFunctionalSend) functionalGridLayout = QGridLayout() functionalGridLayout.addWidget(self.addButton,0,1) functionalGroupBox.setLayout(functionalGridLayout) sendFunctionalLayout.addWidget(functionalGroupBox) self.isHideFunctinal = True self.hideFunctional() # main window self.statusBarStauts = QLabel() self.statusBarStauts.setMinimumWidth(80) self.statusBarStauts.setText("<font color=%s>%s</font>" %("#008200", parameters.strReady)) self.statusBarSendCount = QLabel(parameters.strSend+"(bytes): "+"0") self.statusBarReceiveCount = QLabel(parameters.strReceive+"(bytes): "+"0") self.statusBar().addWidget(self.statusBarStauts) self.statusBar().addWidget(self.statusBarSendCount,2) self.statusBar().addWidget(self.statusBarReceiveCount,3) # self.statusBar() self.resize(800, 500) self.MoveToCenter() self.setWindowTitle(parameters.appName+" V"+str(helpAbout.versionMajor)+"."+str(helpAbout.versionMinor)) icon = QIcon() print("icon path:"+self.DataPath+"/"+parameters.appIcon) icon.addPixmap(QPixmap(self.DataPath+"/"+parameters.appIcon), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) if sys.platform == "win32": ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("comtool") self.show() return
class MainWindow(QMainWindow): receiveUpdateSignal = pyqtSignal(str) errorSignal = pyqtSignal(str) isDetectSerialPort = False receiveCount = 0 sendCount = 0 isScheduledSending = False DataPath = "./" isHideSettings = False isHideFunctinal = True app = None isWaveOpen = False def __init__(self,app): super().__init__() self.app = app pathDirList = sys.argv[0].replace("\\", "/").split("/") pathDirList.pop() self.DataPath = os.path.abspath("/".join(str(i) for i in pathDirList)) if not os.path.exists(self.DataPath + "/" + parameters.strDataDirName): pathDirList.pop() self.DataPath = os.path.abspath("/".join(str(i) for i in pathDirList)) self.DataPath = (self.DataPath + "/" + parameters.strDataDirName).replace("\\", "/") self.initWindow() self.initTool() self.initEvent() self.programStartGetSavedParameters() return def __del__(self): return def initTool(self): self.com = serial.Serial() return def initWindow(self): QToolTip.setFont(QFont('SansSerif', 10)) # main layout frameWidget = QWidget() mainWidget = QSplitter(Qt.Horizontal) frameLayout = QVBoxLayout() self.settingWidget = QWidget() self.settingWidget.setProperty("class","settingWidget") self.receiveSendWidget = QSplitter(Qt.Vertical) self.functionalWiget = QWidget() settingLayout = QVBoxLayout() sendReceiveLayout = QVBoxLayout() sendFunctionalLayout = QVBoxLayout() mainLayout = QHBoxLayout() self.settingWidget.setLayout(settingLayout) self.receiveSendWidget.setLayout(sendReceiveLayout) self.functionalWiget.setLayout(sendFunctionalLayout) mainLayout.addWidget(self.settingWidget) mainLayout.addWidget(self.receiveSendWidget) mainLayout.addWidget(self.functionalWiget) mainLayout.setStretch(0,2) mainLayout.setStretch(1, 6) mainLayout.setStretch(2, 2) menuLayout = QHBoxLayout() mainWidget.setLayout(mainLayout) frameLayout.addLayout(menuLayout) frameLayout.addWidget(mainWidget) frameWidget.setLayout(frameLayout) self.setCentralWidget(frameWidget) # option layout self.settingsButton = QPushButton() self.skinButton = QPushButton("") self.waveButton = QPushButton("") self.aboutButton = QPushButton() self.functionalButton = QPushButton() self.encodingCombobox = ComboBox() self.encodingCombobox.addItem("ASCII") self.encodingCombobox.addItem("UTF-8") self.encodingCombobox.addItem("UTF-16") self.encodingCombobox.addItem("GBK") self.encodingCombobox.addItem("GB2312") self.encodingCombobox.addItem("GB18030") self.settingsButton.setProperty("class", "menuItem1") self.skinButton.setProperty("class", "menuItem2") self.aboutButton.setProperty("class", "menuItem3") self.functionalButton.setProperty("class", "menuItem4") self.waveButton.setProperty("class", "menuItem5") self.settingsButton.setObjectName("menuItem") self.skinButton.setObjectName("menuItem") self.aboutButton.setObjectName("menuItem") self.functionalButton.setObjectName("menuItem") self.waveButton.setObjectName("menuItem") menuLayout.addWidget(self.settingsButton) menuLayout.addWidget(self.skinButton) menuLayout.addWidget(self.waveButton) menuLayout.addWidget(self.aboutButton) menuLayout.addStretch(0) menuLayout.addWidget(self.encodingCombobox) menuLayout.addWidget(self.functionalButton) # widgets receive and send area self.receiveArea = QTextEdit() self.sendArea = QTextEdit() self.clearReceiveButtion = QPushButton(parameters.strClearReceive) self.sendButtion = QPushButton(parameters.strSend) self.sendHistory = ComboBox() sendWidget = QWidget() sendAreaWidgetsLayout = QHBoxLayout() sendWidget.setLayout(sendAreaWidgetsLayout) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.clearReceiveButtion) buttonLayout.addStretch(1) buttonLayout.addWidget(self.sendButtion) sendAreaWidgetsLayout.addWidget(self.sendArea) sendAreaWidgetsLayout.addLayout(buttonLayout) sendReceiveLayout.addWidget(self.receiveArea) sendReceiveLayout.addWidget(sendWidget) sendReceiveLayout.addWidget(self.sendHistory) sendReceiveLayout.setStretch(0, 7) sendReceiveLayout.setStretch(1, 2) sendReceiveLayout.setStretch(2, 1) # widgets serial settings serialSettingsGroupBox = QGroupBox(parameters.strSerialSettings) serialSettingsLayout = QGridLayout() serialReceiveSettingsLayout = QGridLayout() serialSendSettingsLayout = QGridLayout() serialPortLabek = QLabel(parameters.strSerialPort) serailBaudrateLabel = QLabel(parameters.strSerialBaudrate) serailBytesLabel = QLabel(parameters.strSerialBytes) serailParityLabel = QLabel(parameters.strSerialParity) serailStopbitsLabel = QLabel(parameters.strSerialStopbits) self.serialPortCombobox = ComboBox() self.serailBaudrateCombobox = ComboBox() self.serailBaudrateCombobox.addItem("9600") self.serailBaudrateCombobox.addItem("19200") self.serailBaudrateCombobox.addItem("38400") self.serailBaudrateCombobox.addItem("57600") self.serailBaudrateCombobox.addItem("115200") self.serailBaudrateCombobox.setCurrentIndex(4) self.serailBaudrateCombobox.setEditable(True) self.serailBytesCombobox = ComboBox() self.serailBytesCombobox.addItem("5") self.serailBytesCombobox.addItem("6") self.serailBytesCombobox.addItem("7") self.serailBytesCombobox.addItem("8") self.serailBytesCombobox.setCurrentIndex(3) self.serailParityCombobox = ComboBox() self.serailParityCombobox.addItem("None") self.serailParityCombobox.addItem("Odd") self.serailParityCombobox.addItem("Even") self.serailParityCombobox.addItem("Mark") self.serailParityCombobox.addItem("Space") self.serailParityCombobox.setCurrentIndex(0) self.serailStopbitsCombobox = ComboBox() self.serailStopbitsCombobox.addItem("1") self.serailStopbitsCombobox.addItem("1.5") self.serailStopbitsCombobox.addItem("2") self.serailStopbitsCombobox.setCurrentIndex(0) self.checkBoxRts = QCheckBox("rts") self.checkBoxDtr = QCheckBox("dtr") self.serialOpenCloseButton = QPushButton(parameters.strOpen) serialSettingsLayout.addWidget(serialPortLabek,0,0) serialSettingsLayout.addWidget(serailBaudrateLabel, 1, 0) serialSettingsLayout.addWidget(serailBytesLabel, 2, 0) serialSettingsLayout.addWidget(serailParityLabel, 3, 0) serialSettingsLayout.addWidget(serailStopbitsLabel, 4, 0) serialSettingsLayout.addWidget(self.serialPortCombobox, 0, 1) serialSettingsLayout.addWidget(self.serailBaudrateCombobox, 1, 1) serialSettingsLayout.addWidget(self.serailBytesCombobox, 2, 1) serialSettingsLayout.addWidget(self.serailParityCombobox, 3, 1) serialSettingsLayout.addWidget(self.serailStopbitsCombobox, 4, 1) serialSettingsLayout.addWidget(self.checkBoxRts, 5, 0,1,1) serialSettingsLayout.addWidget(self.checkBoxDtr, 5, 1,1,1) serialSettingsLayout.addWidget(self.serialOpenCloseButton, 6, 0,1,2) serialSettingsGroupBox.setLayout(serialSettingsLayout) settingLayout.addWidget(serialSettingsGroupBox) # serial receive settings serialReceiveSettingsGroupBox = QGroupBox(parameters.strSerialReceiveSettings) self.receiveSettingsAscii = QRadioButton(parameters.strAscii) self.receiveSettingsHex = QRadioButton(parameters.strHex) self.receiveSettingsAscii.setChecked(True) self.receiveSettingsAutoLinefeed = QCheckBox(parameters.strAutoLinefeed) self.receiveSettingsAutoLinefeedTime = QLineEdit(parameters.strAutoLinefeedTime) self.receiveSettingsAutoLinefeed.setMaximumWidth(75) self.receiveSettingsAutoLinefeedTime.setMaximumWidth(75) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAscii,1,0,1,1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsHex,1,1,1,1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAutoLinefeed, 2, 0, 1, 1) serialReceiveSettingsLayout.addWidget(self.receiveSettingsAutoLinefeedTime, 2, 1, 1, 1) serialReceiveSettingsGroupBox.setLayout(serialReceiveSettingsLayout) settingLayout.addWidget(serialReceiveSettingsGroupBox) # serial send settings serialSendSettingsGroupBox = QGroupBox(parameters.strSerialSendSettings) self.sendSettingsAscii = QRadioButton(parameters.strAscii) self.sendSettingsHex = QRadioButton(parameters.strHex) self.sendSettingsAscii.setChecked(True) self.sendSettingsScheduledCheckBox = QCheckBox(parameters.strScheduled) self.sendSettingsScheduled = QLineEdit(parameters.strScheduledTime) self.sendSettingsScheduledCheckBox.setMaximumWidth(75) self.sendSettingsScheduled.setMaximumWidth(75) self.sendSettingsCFLF = QCheckBox(parameters.strCRLF) self.sendSettingsCFLF.setChecked(False) serialSendSettingsLayout.addWidget(self.sendSettingsAscii,1,0,1,1) serialSendSettingsLayout.addWidget(self.sendSettingsHex,1,1,1,1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduledCheckBox, 2, 0, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsScheduled, 2, 1, 1, 1) serialSendSettingsLayout.addWidget(self.sendSettingsCFLF, 3, 0, 1, 2) serialSendSettingsGroupBox.setLayout(serialSendSettingsLayout) settingLayout.addWidget(serialSendSettingsGroupBox) settingLayout.setStretch(0, 5) settingLayout.setStretch(1, 2.5) settingLayout.setStretch(2, 2.5) # right functional layout self.addButton = QPushButton(parameters.strAdd) functionalGroupBox = QGroupBox(parameters.strFunctionalSend) functionalGridLayout = QGridLayout() functionalGridLayout.addWidget(self.addButton,0,1) functionalGroupBox.setLayout(functionalGridLayout) sendFunctionalLayout.addWidget(functionalGroupBox) self.isHideFunctinal = True self.hideFunctional() # main window self.statusBarStauts = QLabel() self.statusBarStauts.setMinimumWidth(80) self.statusBarStauts.setText("<font color=%s>%s</font>" %("#008200", parameters.strReady)) self.statusBarSendCount = QLabel(parameters.strSend+"(bytes): "+"0") self.statusBarReceiveCount = QLabel(parameters.strReceive+"(bytes): "+"0") self.statusBar().addWidget(self.statusBarStauts) self.statusBar().addWidget(self.statusBarSendCount,2) self.statusBar().addWidget(self.statusBarReceiveCount,3) # self.statusBar() self.resize(800, 500) self.MoveToCenter() self.setWindowTitle(parameters.appName+" V"+str(helpAbout.versionMajor)+"."+str(helpAbout.versionMinor)) icon = QIcon() print("icon path:"+self.DataPath+"/"+parameters.appIcon) icon.addPixmap(QPixmap(self.DataPath+"/"+parameters.appIcon), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) if sys.platform == "win32": ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("comtool") self.show() return def initEvent(self): self.serialOpenCloseButton.clicked.connect(self.openCloseSerial) self.sendButtion.clicked.connect(self.sendData) self.receiveUpdateSignal.connect(self.updateReceivedDataDisplay) self.clearReceiveButtion.clicked.connect(self.clearReceiveBuffer) self.serialPortCombobox.clicked.connect(self.portComboboxClicked) self.sendSettingsHex.clicked.connect(self.onSendSettingsHexClicked) self.sendSettingsAscii.clicked.connect(self.onSendSettingsAsciiClicked) self.errorSignal.connect(self.errorHint) self.sendHistory.currentIndexChanged.connect(self.sendHistoryIndexChanged) self.settingsButton.clicked.connect(self.showHideSettings) self.skinButton.clicked.connect(self.skinChange) self.aboutButton.clicked.connect(self.showAbout) self.addButton.clicked.connect(self.functionAdd) self.functionalButton.clicked.connect(self.showHideFunctional) self.sendArea.currentCharFormatChanged.connect(self.sendAreaFontChanged) self.waveButton.clicked.connect(self.openWaveDisplay) self.checkBoxRts.clicked.connect(self.rtsChanged) self.checkBoxDtr.clicked.connect(self.dtrChanged) return def openCloseSerialProcess(self): try: if self.com.is_open: self.com.close() self.serialOpenCloseButton.setText(parameters.strOpen) self.statusBarStauts.setText("<font color=%s>%s</font>" % ("#f31414", parameters.strClosed)) self.receiveProgressStop = True self.serialPortCombobox.setDisabled(False) self.serailBaudrateCombobox.setDisabled(False) self.serailParityCombobox.setDisabled(False) self.serailStopbitsCombobox.setDisabled(False) self.serailBytesCombobox.setDisabled(False) self.programExitSaveParameters() else: try: self.com.baudrate = int(self.serailBaudrateCombobox.currentText()) self.com.port = self.serialPortCombobox.currentText().split(" ")[0] self.com.bytesize = int(self.serailBytesCombobox.currentText()) self.com.parity = self.serailParityCombobox.currentText()[0] self.com.stopbits = float(self.serailStopbitsCombobox.currentText()) self.com.timeout = None if self.checkBoxRts.isChecked(): self.com.rts = False else: self.com.rts = True if self.checkBoxDtr.isChecked(): self.com.dtr = False else: self.com.dtr = True print(self.com) self.serialOpenCloseButton.setDisabled(True) self.com.open() self.serialOpenCloseButton.setText(parameters.strClose) self.statusBarStauts.setText("<font color=%s>%s</font>" % ("#008200", parameters.strReady)) self.serialPortCombobox.setDisabled(True) self.serailBaudrateCombobox.setDisabled(True) self.serailParityCombobox.setDisabled(True) self.serailStopbitsCombobox.setDisabled(True) self.serailBytesCombobox.setDisabled(True) self.serialOpenCloseButton.setDisabled(False) receiveProcess = threading.Thread(target=self.receiveData) receiveProcess.setDaemon(True) receiveProcess.start() except Exception as e: self.com.close() self.receiveProgressStop = True self.errorSignal.emit( parameters.strOpenFailed +"\n"+ str(e)) self.serialOpenCloseButton.setDisabled(False) except Exception: pass return def openCloseSerial(self): t = threading.Thread(target=self.openCloseSerialProcess) t.setDaemon(True) t.start() return def rtsChanged(self): if self.checkBoxRts.isChecked(): self.com.setRTS(False) else: self.com.setRTS(True) def dtrChanged(self): if self.checkBoxDtr.isChecked(): self.com.setDTR(False) else: self.com.setDTR(True) def portComboboxClicked(self): self.detectSerialPort() return def getSendData(self): data = self.sendArea.toPlainText() if self.sendSettingsCFLF.isChecked(): data = data.replace("\n", "\r\n") if self.sendSettingsHex.isChecked(): if self.sendSettingsCFLF.isChecked(): data = data.replace("\r\n", " ") else: data = data.replace("\n", " ") data = self.hexStringB2Hex(data) if data == -1: self.errorSignal.emit( parameters.strWriteFormatError) return -1 else: data = data.encode(self.encodingCombobox.currentText(),"ignore") return data def sendData(self): try: if self.com.is_open: data = self.getSendData() if data == -1: return print(self.sendArea.toPlainText()) print("send:",data) self.sendCount += len(data) self.com.write(data) data = self.sendArea.toPlainText() self.sendHistoryFindDelete(data) self.sendHistory.insertItem(0,data) self.sendHistory.setCurrentIndex(0) self.receiveUpdateSignal.emit("") # scheduled send if self.sendSettingsScheduledCheckBox.isChecked(): if not self.isScheduledSending: t = threading.Thread(target=self.scheduledSend) t.setDaemon(True) t.start() except Exception as e: self.errorSignal.emit(parameters.strWriteError) print(e) return def scheduledSend(self): self.isScheduledSending = True while self.sendSettingsScheduledCheckBox.isChecked(): self.sendData() try: time.sleep(int(self.sendSettingsScheduled.text().strip())/1000) except Exception: self.errorSignal.emit(parameters.strTimeFormatError) self.isScheduledSending = False return def receiveData(self): self.receiveProgressStop = False self.timeLastReceive = 0 while(not self.receiveProgressStop): try: length = self.com.in_waiting if length>0: bytes = self.com.read(length) if self.isWaveOpen: self.wave.displayData(bytes) self.receiveCount += len(bytes) if self.receiveSettingsHex.isChecked(): strReceived = self.asciiB2HexString(bytes) self.receiveUpdateSignal.emit(strReceived) else: self.receiveUpdateSignal.emit(bytes.decode(self.encodingCombobox.currentText(),"ignore")) if self.receiveSettingsAutoLinefeed.isChecked(): if time.time() - self.timeLastReceive> int(self.receiveSettingsAutoLinefeedTime.text())/1000: if self.sendSettingsCFLF.isChecked(): self.receiveUpdateSignal.emit("\r\n") else: self.receiveUpdateSignal.emit("\n") self.timeLastReceive = time.time() except Exception as e: print("receiveData error") if self.com.is_open and not self.serialPortCombobox.isEnabled(): self.openCloseSerial() self.serialPortCombobox.clear() self.detectSerialPort() print(e) time.sleep(0.009) return def updateReceivedDataDisplay(self,str): if str != "": curScrollValue = self.receiveArea.verticalScrollBar().value() self.receiveArea.moveCursor(QTextCursor.End) endScrollValue = self.receiveArea.verticalScrollBar().value() self.receiveArea.insertPlainText(str) if curScrollValue < endScrollValue: self.receiveArea.verticalScrollBar().setValue(curScrollValue) else: self.receiveArea.moveCursor(QTextCursor.End) self.statusBarSendCount.setText("%s(bytes):%d" %(parameters.strSend ,self.sendCount)) self.statusBarReceiveCount.setText("%s(bytes):%d" %(parameters.strReceive ,self.receiveCount)) return def onSendSettingsHexClicked(self): data = self.sendArea.toPlainText().replace("\n","\r\n") data = self.asciiB2HexString(data.encode()) self.sendArea.clear() self.sendArea.insertPlainText(data) return def onSendSettingsAsciiClicked(self): try: data = self.sendArea.toPlainText().replace("\n"," ").strip() self.sendArea.clear() if data != "": data = self.hexStringB2Hex(data).decode(self.encodingCombobox.currentText(),'ignore') self.sendArea.insertPlainText(data) except Exception as e: # QMessageBox.information(self,parameters.strWriteFormatError,parameters.strWriteFormatError) print("format error"); return def sendHistoryIndexChanged(self): self.sendArea.clear() self.sendArea.insertPlainText(self.sendHistory.currentText()) return def clearReceiveBuffer(self): self.receiveArea.clear() self.receiveCount = 0; self.sendCount = 0; self.receiveUpdateSignal.emit(None) return def MoveToCenter(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) return def errorHint(self,str): QMessageBox.information(self, str, str) return def closeEvent(self, event): reply = QMessageBox.question(self, 'Sure To Quit?', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.com.close() self.receiveProgressStop = True self.programExitSaveParameters() event.accept() else: event.ignore() def findSerialPort(self): self.port_list = list(serial.tools.list_ports.comports()) return self.port_list def portChanged(self): self.serialPortCombobox.setCurrentIndex(0) self.serialPortCombobox.setToolTip(str(self.portList[0])) def detectSerialPort(self): if not self.isDetectSerialPort: self.isDetectSerialPort = True t = threading.Thread(target=self.detectSerialPortProcess) t.setDaemon(True) t.start() def detectSerialPortProcess(self): self.serialPortCombobox.clear() while(1): portList = self.findSerialPort(); for i in portList: self.serialPortCombobox.addItem(str(i[0])+" "+str(i[1])) if len(portList)>0: self.serialPortCombobox.setCurrentIndex(0) self.serialPortCombobox.setToolTip(str(portList[0])) break time.sleep(1) self.isDetectSerialPort = False return def sendHistoryFindDelete(self,str): self.sendHistory.removeItem(self.sendHistory.findText(str)) return def test(self): print("test") return def asciiB2HexString(self,strB): strHex = binascii.b2a_hex(strB).upper() return re.sub(r"(?<=\w)(?=(?:\w\w)+$)", " ", strHex.decode())+" " def hexStringB2Hex(self,hexString): dataList = hexString.split(" ") j = 0 for i in dataList: if len(i) > 2: return -1 elif len(i) == 1: dataList[j] = "0" + i j += 1 data = "".join(dataList) try: data = bytes.fromhex(data) except Exception: return -1 print(data) return data def programExitSaveParameters(self): paramObj = parameters.ParametersToSave() paramObj.baudRate = self.serailBaudrateCombobox.currentIndex() paramObj.dataBytes = self.serailBytesCombobox.currentIndex() paramObj.parity = self.serailParityCombobox.currentIndex() paramObj.stopBits = self.serailStopbitsCombobox.currentIndex() paramObj.skin = self.param.skin if self.receiveSettingsHex.isChecked(): paramObj.receiveAscii = False if not self.receiveSettingsAutoLinefeed.isChecked(): paramObj.receiveAutoLinefeed = False else: paramObj.receiveAutoLinefeed = True paramObj.receiveAutoLindefeedTime = self.receiveSettingsAutoLinefeedTime.text() if self.sendSettingsHex.isChecked(): paramObj.sendAscii = False if not self.sendSettingsScheduledCheckBox.isChecked(): paramObj.sendScheduled = False paramObj.sendScheduledTime = self.sendSettingsScheduled.text() if not self.sendSettingsCFLF.isChecked(): paramObj.useCRLF = False paramObj.sendHistoryList.clear() for i in range(0,self.sendHistory.count()): paramObj.sendHistoryList.append(self.sendHistory.itemText(i)) if self.checkBoxRts.isChecked(): paramObj.rts = 1 else: paramObj.rts = 0 if self.checkBoxDtr.isChecked(): paramObj.dtr = 1 else: paramObj.dtr = 0 paramObj.encodingIndex = self.encodingCombobox.currentIndex() f = open("settings.config","wb") f.truncate() pickle.dump(paramObj, f) pickle.dump(paramObj.sendHistoryList,f) f.close() return def programStartGetSavedParameters(self): paramObj = parameters.ParametersToSave() try: f = open("settings.config", "rb") paramObj = pickle.load( f) paramObj.sendHistoryList = pickle.load(f) f.close() except Exception as e: f = open("settings.config", "wb") f.close() self.serailBaudrateCombobox.setCurrentIndex(paramObj.baudRate) self.serailBytesCombobox.setCurrentIndex(paramObj.dataBytes) self.serailParityCombobox.setCurrentIndex(paramObj.parity) self.serailStopbitsCombobox.setCurrentIndex(paramObj.stopBits) if paramObj.receiveAscii == False: self.receiveSettingsHex.setChecked(True) if paramObj.receiveAutoLinefeed == False: self.receiveSettingsAutoLinefeed.setChecked(False) else: self.receiveSettingsAutoLinefeed.setChecked(True) self.receiveSettingsAutoLinefeedTime.setText(paramObj.receiveAutoLindefeedTime) if paramObj.sendAscii == False: self.sendSettingsHex.setChecked(True) if paramObj.sendScheduled == False: self.sendSettingsScheduledCheckBox.setChecked(False) else: self.sendSettingsScheduledCheckBox.setChecked(True) self.sendSettingsScheduled.setText(paramObj.sendScheduledTime) if paramObj.useCRLF == False: self.sendSettingsCFLF.setChecked(False) else: self.sendSettingsCFLF.setChecked(True) for i in range(0, len(paramObj.sendHistoryList)): str = paramObj.sendHistoryList[i] self.sendHistory.addItem(str) if paramObj.rts == 0: self.checkBoxRts.setChecked(False) else: self.checkBoxRts.setChecked(True) if paramObj.dtr == 0: self.checkBoxDtr.setChecked(False) else: self.checkBoxDtr.setChecked(True) self.encodingCombobox.setCurrentIndex(paramObj.encodingIndex) self.param = paramObj return def keyPressEvent(self, event): if event.key() == Qt.Key_Control: self.keyControlPressed = True elif event.key() == Qt.Key_Return or event.key()==Qt.Key_Enter: if self.keyControlPressed: self.sendData() elif event.key() == Qt.Key_L: if self.keyControlPressed: self.sendArea.clear() elif event.key() == Qt.Key_K: if self.keyControlPressed: self.receiveArea.clear() return def keyReleaseEvent(self,event): if event.key() == Qt.Key_Control: self.keyControlPressed = False return def sendAreaFontChanged(self,font): print("font changed") return def functionAdd(self): QMessageBox.information(self, "On the way", "On the way") return def showHideSettings(self): if self.isHideSettings: self.showSettings() self.isHideSettings = False else: self.hideSettings() self.isHideSettings = True return def showSettings(self): self.settingWidget.show() self.settingsButton.setStyleSheet( parameters.strStyleShowHideButtonLeft.replace("$DataPath",self.DataPath)) return; def hideSettings(self): self.settingWidget.hide() self.settingsButton.setStyleSheet( parameters.strStyleShowHideButtonRight.replace("$DataPath", self.DataPath)) return; def showHideFunctional(self): if self.isHideFunctinal: self.showFunctional() self.isHideFunctinal = False else: self.hideFunctional() self.isHideFunctinal = True return def showFunctional(self): self.functionalWiget.show() self.functionalButton.setStyleSheet( parameters.strStyleShowHideButtonRight.replace("$DataPath",self.DataPath)) return; def hideFunctional(self): self.functionalWiget.hide() self.functionalButton.setStyleSheet( parameters.strStyleShowHideButtonLeft.replace("$DataPath", self.DataPath)) return; def skinChange(self): if self.param.skin == 1: # light file = open(self.DataPath + '/assets/qss/style-dark.qss', "r") self.param.skin = 2 else: # elif self.param.skin == 2: # dark file = open(self.DataPath + '/assets/qss/style.qss', "r") self.param.skin = 1 self.app.setStyleSheet(file.read().replace("$DataPath", self.DataPath)) return def showAbout(self): QMessageBox.information(self, "About","<h1 style='color:#f75a5a';margin=10px;>"+parameters.appName+ '</h1><br><b style="color:#08c7a1;margin = 5px;">V'+str(helpAbout.versionMajor)+"."+ str(helpAbout.versionMinor)+"."+str(helpAbout.versionDev)+ "</b><br><br>"+helpAbout.date+"<br><br>"+helpAbout.strAbout()) return def action1(self): print("action1") return def autoUpdateDetect(self): auto = autoUpdate.AutoUpdate() if auto.detectNewVersion(): auto.OpenBrowser() def openDevManagement(self): os.system('start devmgmt.msc') def openWaveDisplay(self): self.wave = Wave() self.isWaveOpen = True self.wave.closed.connect(self.OnWaveClosed) def OnWaveClosed(self): print("wave window closed") self.isWaveOpen = False
def generate_panel(self, formset): """ Generate a panel for the module form with all the controls formset format example: [('_video', '_arenas', '_run'), {"Player":['_threshold', "_player", "=", "_results", "_query"], "Background image":[(' ', '_selectBackground', '_paintBackground'), '_image']}, "_progress"] tuple: will display the controls in the same horizontal line list: will display the controls in the same vertical line dict: will display the controls in a tab widget '||': will plit the controls in a horizontal line '=': will plit the controls in a vertical line @param formset: Form configuration @type formset: list """ control = None if '=' in formset: control = QSplitter(QtCore.Qt.Vertical) tmp = list(formset) index = tmp.index('=') firstPanel = self.generate_panel(formset[0:index]) secondPanel = self.generate_panel(formset[index + 1:]) control.addWidget(firstPanel) control.addWidget(secondPanel) self._splitters.append(control) return control elif '||' in formset: control = QSplitter(QtCore.Qt.Horizontal) tmp = list(formset) rindex = lindex = index = tmp.index('||') rindex -= 1 rindex += 2 if isinstance(formset[lindex - 1], int): lindex = lindex - 1 if len(formset) > rindex and isinstance(formset[index + 1], int): rindex += 1 firstPanel = self.generate_panel(formset[0:lindex]) secondPanel = self.generate_panel(formset[rindex:]) if isinstance(formset[index - 1], int): firstPanel.setMaximumWidth(formset[index - 1]) if isinstance(formset[index + 1], int): secondPanel.setMaximumWidth(formset[index + 1]) control.addWidget(firstPanel) control.addWidget(secondPanel) self._splitters.append(control) return control control = QFrame(self) layout = None if type(formset) is tuple: layout = QHBoxLayout() for row in formset: if isinstance(row, (list, tuple)): panel = self.generate_panel(row) layout.addWidget(panel) elif row == " ": spacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) layout.addItem(spacer) elif type(row) is dict: c = self.generate_tabs(row) layout.addWidget(c) self._tabs.append(c) else: param = self.controls.get(row, None) if param is None: label = QLabel() label.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) # layout.addWidget( label ) if row.startswith('info:'): label.setText(row[5:]) font = QFont() font.setPointSize(10) label.setFont(font) label.setAccessibleName('info') elif row.startswith('h1:'): label.setText(row[3:]) font = QFont() font.setPointSize(17) font.setBold(True) label.setFont(font) label.setAccessibleName('h1') elif row.startswith('h2:'): label.setText(row[3:]) font = QFont() font.setPointSize(16) font.setBold(True) label.setFont(font) label.setAccessibleName('h2') elif row.startswith('h3:'): label.setText(row[3:]) font = QFont() font.setPointSize(15) font.setBold(True) label.setFont(font) label.setAccessibleName('h3') elif row.startswith('h4:'): label.setText(row[3:]) font = QFont() font.setPointSize(14) font.setBold(True) label.setFont(font) label.setAccessibleName('h4') elif row.startswith('h5:'): label.setText(row[3:]) font = QFont() font.setPointSize(12) font.setBold(True) label.setFont(font) label.setAccessibleName('h5') else: label.setText(row) font = QFont() font.setPointSize(10) label.setFont(font) label.setAccessibleName('msg') label.setToolTip(label.text()) layout.addWidget(label) else: param.parent = self param.name = row layout.addWidget(param.form) elif type(formset) is list: layout = QVBoxLayout() for row in formset: if isinstance(row, (list, tuple)): panel = self.generate_panel(row) layout.addWidget(panel) elif row == " ": spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) layout.addItem(spacer) elif type(row) is dict: c = self.generate_tabs(row) layout.addWidget(c) self._tabs.append(c) else: param = self.controls.get(row, None) if param is None: label = QLabel() label.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) label.resize(30, 30) # layout.addWidget( label ) if row.startswith('info:'): label.setText(row[5:]) font = QFont() font.setPointSize(10) label.setFont(font) label.setAccessibleName('info') elif row.startswith('h1:'): label.setText(row[3:]) font = QFont() font.setPointSize(17) font.setBold(True) label.setFont(font) label.setAccessibleName('h1') elif row.startswith('h2:'): label.setText(row[3:]) font = QFont() font.setPointSize(16) font.setBold(True) label.setFont(font) label.setAccessibleName('h2') elif row.startswith('h3:'): label.setText(row[3:]) font = QFont() font.setPointSize(15) font.setBold(True) label.setFont(font) label.setAccessibleName('h3') elif row.startswith('h4:'): label.setText(row[3:]) font = QFont() font.setPointSize(14) font.setBold(True) label.setFont(font) label.setAccessibleName('h4') elif row.startswith('h5:'): label.setText(row[3:]) font = QFont() font.setPointSize(12) font.setBold(True) label.setFont(font) label.setAccessibleName('h5') else: label.setText(row) font = QFont() font.setPointSize(10) label.setFont(font) label.setAccessibleName('msg') label.setToolTip(label.text()) layout.addWidget(label) else: param.parent = self param.name = row layout.addWidget(param.form) if conf.PYFORMS_USE_QT5: layout.setContentsMargins(0, 0, 0, 0) else: layout.setMargin(0) control.setLayout(layout) return control
class Ui_MainWindow(QMainWindow): def __init__(self): super().__init__() # self.initUI() self.init_ui() self.generateData() self.UI_style() def init_ui(self): self.setFixedSize(1200, 700) self.setWindowTitle('STalking') self.setWindowIcon(QIcon("icon/stlogo.ico")) self.main_widget = QtWidgets.QWidget() # 创建窗口主部件 self.main_widget.setObjectName('main_widget') self.main_layout = QtWidgets.QGridLayout() # 创建主部件的网格布局 self.main_widget.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局 self.left_widget = QtWidgets.QWidget() # 创建左侧部件 左侧为功能按钮 self.left_widget.setObjectName('left_widget') self.left_layout = QtWidgets.QGridLayout() # 创建左侧部件的网格布局层 self.left_widget.setLayout(self.left_layout) # 设置左侧部件布局为网格 self.center_Splitter = QSplitter(Qt.Horizontal) self.center_Splitter.setObjectName('center_Splitter') self.center_layout = QtWidgets.QGridLayout() self.center_Splitter.setLayout(self.center_layout) # 设置右侧部件布局为网格 self.main_layout.addWidget(self.left_widget, 0, 0, 16, 3) # 左侧部件在第0行第0列,占8行3列 # self.main_layout.addWidget(self.center_QWidget, 0, 3, 16, 17) # 左侧部件在第0行第3列,占8行3列 self.main_layout.addWidget(self.center_Splitter, 0, 3, 16, 17) # 左侧部件在第0行第3列,占8行3列 self.setCentralWidget(self.main_widget) # 设置窗口主部件 self.icon_button = QtWidgets.QToolButton() self.icon_button.setIcon(QtGui.QIcon('icon/stlogo.ico')) # 设置按钮图标 self.icon_button.setIconSize(QtCore.QSize(150, 100)) # 设置图标大小 self.left_label_1 = QtWidgets.QPushButton("模型选择") self.left_label_1.setObjectName('left_label') self.left_label_2 = QtWidgets.QPushButton("保存与设置") self.left_label_2.setObjectName('left_label') self.left_label_3 = QtWidgets.QPushButton("其他") self.left_label_3.setObjectName('left_label') self.left_button_1 = QtWidgets.QPushButton( qtawesome.icon('fa.database', color='gray'), "选择GMM") self.left_button_1.setObjectName('left_button') self.left_button_2 = QtWidgets.QPushButton( qtawesome.icon('fa.file', color='gray'), "选择UBM") self.left_button_2.setObjectName('left_button') self.left_button_3 = QtWidgets.QPushButton( qtawesome.icon('fa.plus-circle', color='gray'), "选择视频") self.left_button_3.setObjectName('left_button') self.left_button_4 = QtWidgets.QPushButton( qtawesome.icon('fa.save', color='gray'), "保存模型") self.left_button_4.setObjectName('left_button') self.left_button_5 = QtWidgets.QPushButton( qtawesome.icon('fa.file', color='gray'), "模型路径") self.left_button_5.setObjectName('left_button') self.left_button_6 = QtWidgets.QPushButton( qtawesome.icon('fa.folder-open', color='gray'), "文件路径") self.left_button_6.setObjectName('left_button') self.left_button_7 = QtWidgets.QPushButton( qtawesome.icon('fa.comment', color='gray'), "使用向导") self.left_button_7.setObjectName('left_button') self.left_button_8 = QtWidgets.QPushButton( qtawesome.icon('fa.star', color='gray'), "版权说明") self.left_button_8.setObjectName('left_button') self.left_button_9 = QtWidgets.QPushButton( qtawesome.icon('fa.question', color='gray'), "关于我们") self.left_button_9.setObjectName('left_button') self.left_xxx = QtWidgets.QPushButton(" ") self.left_layout.addWidget(self.icon_button, 0, 0.5, 1, 3) self.left_layout.addWidget(self.left_label_1, 1, 0, 1, 3) self.left_layout.addWidget(self.left_button_1, 2, 0, 1, 3) self.left_layout.addWidget(self.left_button_2, 3, 0, 1, 3) self.left_layout.addWidget(self.left_button_3, 4, 0, 1, 3) self.left_layout.addWidget(self.left_label_2, 5, 0, 1, 3) self.left_layout.addWidget(self.left_button_4, 6, 0, 1, 3) self.left_layout.addWidget(self.left_button_5, 7, 0, 1, 3) self.left_layout.addWidget(self.left_button_6, 8, 0, 1, 3) self.left_layout.addWidget(self.left_label_3, 9, 0, 1, 3) self.left_layout.addWidget(self.left_button_7, 10, 0, 1, 3) self.left_layout.addWidget(self.left_button_8, 11, 0, 1, 3) self.left_layout.addWidget(self.left_button_9, 12, 0, 1, 3) self.model_list_widget = QtWidgets.QWidget() self.model_list_widget.setObjectName('model_widget') self.model_list_layout = QtWidgets.QGridLayout() # 创建左侧部件的网格布局层 self.model_list_widget.setLayout(self.model_list_layout) # 设置左侧部件布局为网格 self.model_list_label = QtWidgets.QLabel("模型列表") self.model_list_label.setObjectName('my_lable') self.model_view_list = QListWidget() # 文件列表 self.model_view_list.setObjectName('my_list') # self.model_view_list.setFixedWidth(200) self.right_Splitter = QSplitter(Qt.Vertical) self.right_Splitter.setObjectName('right_Splitter') self.model_list_layout.addWidget(self.model_list_label, 0, 0, 1, 1) self.model_list_layout.addWidget(self.model_view_list, 1, 0, 9, 1) self.center_Splitter.addWidget(self.model_list_widget) self.center_Splitter.addWidget(self.right_Splitter) self.center_Splitter.setStretchFactor(0, 2) self.center_Splitter.setStretchFactor(1, 8) self.result_label = QtWidgets.QLabel("数据分析") self.result_label.setFixedHeight(80) self.result_label.setObjectName('my_lable') self.right_html_page_TabWidget = QtWidgets.QTabWidget() self.right_html_page_TabWidget.setObjectName( 'right_html_page_TabWidget') self.right_log_widget = QtWidgets.QWidget() # log 框 = button + log self.right_log_widget.setObjectName('right_log_widget') self.right_log_layout = QtWidgets.QGridLayout() self.right_log_widget.setLayout(self.right_log_layout) # 设置右侧部件布局为网格 self.right_Splitter.addWidget(self.result_label) self.right_Splitter.addWidget(self.right_html_page_TabWidget) self.right_Splitter.addWidget(self.right_log_widget) self.right_Splitter.setStretchFactor(0, 1) self.right_Splitter.setStretchFactor(1, 9) self.right_Splitter.setStretchFactor(2, 1) self.right_log_toolbar = QToolBar() self.right_log_toolbar.setObjectName('right_log_toolbar') self.right_log_toolbar.setOrientation(Qt.Vertical) # self.right_button_layout.addWidget(self.toolbarGmm) delete_action = QAction(QIcon('icon/delete-gray.png'), '清空日志', self) self.right_log_toolbar.addAction(delete_action) export_action = QAction(QIcon('icon/save_m.png'), '导出日志', self) self.right_log_toolbar.addAction(export_action) # self.right_log_layout.setSpacing(0) self.right_log_contend = QListWidget() # self.right_log_contend.setFixedHeight(100) self.right_log_contend.setObjectName('my_list') self.right_log_layout.addWidget(self.right_log_toolbar, 0, 0, 1, 3) self.right_log_layout.addWidget(self.right_log_contend, 0, 1, 1, 18) # 定义 css def UI_style(self): self.main_widget.setStyleSheet(''' QWidget#main_widget{ background:#EBEBEB; border-top:1px solid #EBEBEB; border-bottom:1px solid #EBEBEB; border-left:1px solid #EBEBEB; border-top-left-radius:10px; border-bottom-left-radius:10px; } ''') self.result_label.setStyleSheet(''' QLabel{ border:none; background:#EBEBEB; font-size:20px; font-weight:900; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } ''') self.model_list_label.setStyleSheet(''' QLabel{ border:none; background:#EBEBEB; font-size:20px; font-weight:900; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } ''') self.icon_button.setStyleSheet(''' QToolButton{ border:none; background:#EBEBEB; } ''') self.main_widget.setStyleSheet(''' QWidget#center_QWidget{ color:#232C51; background:#EBEBEB; border-top:1px solid #EBEBEB; border-bottom:1px solid #EBEBEB; border-right:1px solid #EBEBEB; border-top-right-radius:10px; border-bottom-right-radius:10px; } QWidget#left_widget{ background:#EBEBEB; border-top:1px solid #EBEBEB; border-bottom:1px solid #EBEBEB; border-left:1px solid #EBEBEB; border-top-left-radius:10px; border-bottom-left-radius:10px; } ''') self.model_list_widget.setStyleSheet(''' QListWidget#my_list{ background:light white; border:none; width:300px; border-radius:10px; padding:2px 4px; } ''') self.left_widget.setStyleSheet(''' QPushButton{border:none;color:gray;font-size:18px;font-weight:700;} QPushButton#left_label{ border:none; border-bottom:1px solid dark gray; font-size:20px; font-weight:900; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } QPushButton#left_button:hover{border-left:4px solid red;font-weight:700;} ''') self.center_Splitter.setStyleSheet(''' QSplitter#center_Splitter{ background:#EBEBEB; } QSplitter#right_Splitter{ background:#EBEBEB; } QTabWidget#right_html_page_TabWidget{ width:300px; border-radius:10px; padding:2px 4px; border:none; font-size:16px; font-weight:700; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } } QLabel#my_lable{ background-color:#EBEBEB; border:none; font-size:20px; font-weight:bold; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } QToolBar#right_log_toolbar{ border:none; background-color: #EBEBEB; } QListWidget#my_list{ background:light white; border:none; width:300px; border-radius:10px; padding:2px 4px; } ''') self.model_list_label.setAlignment(Qt.AlignCenter) self.result_label.setAlignment(Qt.AlignCenter) self.model_list_label.setStyleSheet(''' QLabel{ background-color:light gray; border:none; font-size:20px; font-weight:bold; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } ''') self.right_log_widget.setStyleSheet(''' QListWidget#right_log_widget{ width:300px; border-radius:10px; padding:2px 4px; } QToolBar#right_log_toolbar{ border:none; background-color: light gray; } QListWidget#right_log_contend{ background:#EBEBEB; border:none; border:1px solid gray; width:300px; border-radius:10px; padding:2px 4px; } ''') # self.setWindowOpacity(1) # 设置窗口透明度 # self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明 # self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隐藏边框 # self.main_layout.setSpacing(0) def generateData(self): for group in range(1, 100): self.model_view_list.addItem("model_{0}".format(group)) for group in range(1, 100): self.right_log_contend.addItem( (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + " : operation_{0}").format(group)) for group in range(1, 4): self.tabItem = QTextBrowser() self.right_html_page_TabWidget.addTab(self.tabItem, "page_{0}".format(group)) self.tabItem.setHtml("""<table bgcolor=yellow> <tr><td>Groups:</td><td>comp.lang.python.announce</td></tr> <tr><td>From:</td><td>"Fuzzyman" <[email protected]></td></tr> <tr><td>Subject:</td><td><b>[ANN] Movable Python 2.0.0 Final Available</b></td></tr> </table> <h3>Movable Python 2.0.0 Final</h3> <p> <a href="http://www.voidspace.org.uk/python/movpy/"> http://www.voidspace.org.uk/python/movpy/</a> is now available. <p> The new binaries are available for download from the groups page : <p>Movable Python Groups Page <a href="http://voidspace.tradebit.com/groups.php"> http://voidspace.tradebit.com/groups.php</a> <p> Binaries are uploaded for Python 2.2.3, 2.3.5, 2.4.4, 2.5 and the MegaPack <a href="http://www.voidspace.org.uk/python/movpy/megapack.html"> http://www.voidspace.org.uk/python/movpy/megapack.html</a>. <p> There is also a fresh version of the free demo, based on Python 2.3.5: <p>Movable Python Trial Version <a href="http://voidspace.tradebit.com/files.php/7007"> http://voidspace.tradebit.com/files.php/7007</a> <h3>What is Movable Python</h3> <p> <b><i>Movable Python</i></b> is a distribution of Python, for Windows, that can run without being installed. It means you can carry a full development environment round on a USB stick. <p> It is also useful for testing programs with a 'clean Python install', and testing programs with multiple versions of Python. <p> The GUI program launcher makes it a useful programmers tool, including features like : <ul> <li>Log the output of all Python scripts run <li>Enable Psyco for all scripts <li>Quick Launch buttons for commonly used programs <li>Configure multiple interpreters for use from a single interface </ul> <p> It comes with the Pythonwin IDE and works fine with other IDEs like SPE <a href="http://developer.berlios.de/projects/python/"> http://developer.berlios.de/projects/python/</a>. <p> Plus many other features and bundled libraries.""")
class MainWindow(QMainWindow): """ 主窗口界面 """ def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) # 初始化 self.init() # ui设计 self.setup_ui() # 创建右键菜单 self.create_context_menu() # 主框体设计 self.set_main_form() # 加载qss样式 self.load_qss() def init(self): self.setGeometry(Const.WIN_X, Const.WIN_Y, Const.WIN_WIDTH, Const.WIN_HEIGHT) self.setObjectName('mainWindow') self.setWindowIcon(QIcon("./image/Logo/logo.png")) self.setWindowTitle('IFR智能公式识别系统') # 加载图片缩放公共类 self.imageScale = ImageScale() def setup_ui(self): """ 创建状态栏、菜单栏、工具栏 """ # 状态栏 self.statusBar = QStatusBar() self.setStatusBar(self.statusBar) self.statusBar.showMessage('准备就绪', 5000) # self.statusBar().setStyleSheet('background-color:lightGray;') # 菜单栏 self.menubar = QMenuBar() self.setMenuBar(self.menubar) # self.menuBar().setStyleSheet('background-color:lightGray;') # 文件 self.fileMenu = self.menubar.addMenu('&文件(F)') # 调用自定义action self.openPimax = Action.action_b_2(self, 'openPimax', '&打开图片文件', 'Ctrl+P', '打开图片文件') self.openPimax.setIcon(QIcon('./image/openQpixmap.jpg')) self.openText = Action.action_b_2(self, 'openText', '&打开文本文件', 'Ctrl+T', '打开文本文件') self.openText.setIcon(QIcon('./image/openText.ico')) self.openFile = Action.action_b_3(self, 'openFile', '打开文件', '打开文件', self.fileMenu) self.openFile.addAction(self.openPimax) self.openFile.addAction(self.openText) self.openPimax.triggered.connect(lambda: self.get_image()) self.openText.triggered.connect(lambda: self.get_text()) self.openRecentFile = Action.action_a_2(self, 'openRecentFile', '&最近打开的文件', 'Ctrl+O', '最近打开的文件', self.fileMenu) # self.openRecentFile.triggered.connect(self.) self.save = Action.action_a_2(self, 'save', '&保存分析结果', 'Ctrl+S', '保存数据分析结果', self.fileMenu) # self.save.triggered.connect(self.) self.saveAs = Action.action_a_2(self, 'saveAs', '&另保存分析结果', 'Ctrl+Shift+S', '另保存数据分析结果', self.fileMenu) # self.saveAs.triggered.connect(self.) self.printf = Action.action_a_2(self, 'printef', '&打印分析结果', 'Ctrl+P', '打印数据分析结果', self.fileMenu) # self.printf.triggered.connect(self.) self.exitAction = Action.action_a_1(self, 'exitAction', './image/mainWindowIcon/toolBarIcon/exit.png', '&退出', 'Ctrl+Q', '退出应用程序', self.fileMenu) self.exitAction.triggered.connect(self.close) # 编辑 self.exitMenu = self.menubar.addMenu('&编辑(E)') # # ####################查找与替换####################开始 self.search = Action.action_b_2(self, 'search', '&快速查找', 'Ctrl+F', '快速查找') self.replace = Action.action_b_2(self, 'replace', '&快速替换', 'Ctrl+H', '快速替换') # 新增二级菜单 self.searchAndReplaceMenu = Action.action_b_3(self, 'searchAndReplaceMenu', '查找与替换', '查找与替换', self.exitMenu) self.searchAndReplaceMenu.addAction(self.search) self.searchAndReplaceMenu.addAction(self.replace) # self.search.triggered.connect(self.) # self.replace.triggered.connect(self.) # ####################查找与替换####################结束 self.cut = Action.action_a_2(self, 'cut', '&剪切', 'Ctrl+X', '剪切', self.exitMenu) # self.cut.triggered.connect(self.) self.copy = Action.action_a_2(self, 'copy', '&复制', 'Ctrl+C', '复制', self.exitMenu) # self.copy.triggered.connect(self.) self.paste = Action.action_a_2(self, 'paste', '&粘贴', 'Ctrl+V', '粘贴', self.exitMenu) # self.paste.triggered.connect(self.) self.delete = Action.action_a_2(self, 'delect', '&删除', 'Del', '删除', self.exitMenu) # self.delect.triggered.connect(self.) self.selectAll = Action.action_a_2(self, 'selectAll', '&全选', 'Ctrl+Alt', '全选', self.exitMenu) # self.selectAll.triggered.connect(self.) # 视图 self.viewMenu = self.menubar.addMenu('&视图(V)') self.notice = Action.action_a_2(self, 'notice', '&通知', 'Ctrl+Alt+X', '信息通知提醒', self.viewMenu) # self.notice.triggered.connect(self.) # ####################窗口管理####################开始 self.window = Action.action_b_3(self, 'window', '&窗口', '展示一些基本窗口', self.viewMenu) # ####################窗口管理####################结束 # # # # ####################工具栏####################开始 self.tool = Action.action_b_3(self, 'tool', '&工具栏', '基本工具', self.viewMenu) self.calculator = Action.action_a_1(self, 'calculator', './image/calculator.jpg', '&计算器', 'C', '计算器', self.viewMenu) self.calculator.triggered.connect(lambda: self.calculator_win()) # ####################工具####################结束 self.fullScreen = Action.action_a_2(self, 'fullScreen', '&全屏幕', 'Shift+Alt+Enter', '全屏', self.viewMenu) # self.fullScreen.triggered.connect(self.) self.propertyWindow = Action.action_a_2(self, 'propertyWindow', '&属性窗口', 'F4', '属性窗口', self.viewMenu) # self.propertyWindow.triggered.connect(self.) # # 分析 self.navigateMenu = self.menubar.addMenu('&分析(N)') # # 工具 self.toolMenu = self.menubar.addMenu('&工具(T)') # # 扩展 self.extendMenu = self.menubar.addMenu('&扩展(X)') # # 窗口 self.windowMenu = self.menubar.addMenu('&窗口(W)') # # 帮助 self.helpMenu = self.menubar.addMenu('&帮助(H)') self.help = Action.action_a_2(self, 'help ', '&查看帮助', 'Ctrl+F1', '查看帮助', self.helpMenu) # self.help.triggered.connect(self.) # ####################菜单####################结束 ################################################################################################################ # ####################工具栏####################开始 # 工具 self.pixmapToolbar = self.addToolBar('打开图形文件') self.textToolbar = self.addToolBar('打开文本文件') self.pixmapToolbar.addAction(self.openPimax) self.textToolbar.addAction(self.openText) self.exitToolbar = self.addToolBar('退出') self.exitToolbar.addAction(self.exitAction) self.calculatorTooolbar = self.addToolBar('计算器') self.calculatorTooolbar.addAction(self.calculator) # ####################工具栏####################结束 # 槽函数线程 # 创建右键菜单 def create_context_menu(self): """ 创建右键菜单 :return: """ self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) # 创建QMenu self.contextMenu = QMenu(self) # ####################工具栏管理####################开始 self.toolBarManagementMenu = Action.action_b_4(self, 'toolBarManagementMenu', '&工具栏管理', self.contextMenu) # 未完成 # ####################工具栏管理####################结束 self.minAtion = Action.action_a_1(self, 'minAction', './image/min.png', '&最小化', 'Ctrl+M', '最小化窗口', self.contextMenu) self.contextMenu.addSeparator() # 添加分隔线 self.cutAction = Action.action_a_2(self, 'cutAction', '&剪切', 'Ctrl+X', '剪切', self.contextMenu) self.copyAction = Action.action_a_2(self, 'copyAction', '&复制', 'Ctrl+C', '复制', self.contextMenu) self.pasteAction = Action.action_a_2(self, 'pasteAction', '&粘贴', 'Ctrl+V', '粘贴', self.contextMenu) self.deleteAction = Action.action_a_2(self, 'delectAction', '&删除', 'Del', '删除', self.contextMenu) self.selectAllAction = Action.action_a_2(self, 'selectAllAction', '&全选', 'Ctrl+Alt', '全选', self.contextMenu) self.contextMenu.addSeparator() # 添加分隔线 self.closeAction = Action.action_a_1(self, 'closeAction', './image/Exit.png', '&退出', 'Ctrl+W', '退出', self.contextMenu) self.minAtion.triggered.connect(self.show_mininized_window) self.closeAction.triggered.connect(self.quit_window) # self.selectAllAction.triggered.connect(self.) # self.cutAction.triggered.connect(self.) # self.copyAction.triggered.connect(self.) # self.pasteAction.triggered.connect(self.) # self.delectAction.triggered.connect(self.) # ****************************** 业务逻辑 ********************************* def load_qss(self): """ 加载Qss样式表 :return: """ style_file = './Window/mainWindow/Qss/mainWindow.qss' qss_style = CommonhelperQss.read_qss(style_file) self.setStyleSheet(qss_style) def set_action_connect(self): """ 菜单栏、工具栏槽函数连接 :return: """ pass def calculator_win(self): """ 加载计算器窗口 :return: """ self.calculator_Win = Calculatormainwindow() self.calculator_Win.show() def set_main_form(self): """ 窗体布局以及主框体设计 :return: """ # 主框体 self.mainSpiltter = QSplitter(Qt.Vertical) self.mainSpiltter.setObjectName('mainSpiltter') self.mainSpiltterLayout = QVBoxLayout() # 设置主窗口中心窗体 self.setCentralWidget(self.mainSpiltter) # *******工作区间******* self.workWidget = QSplitter() self.workWidget.setObjectName('workWidget') self.mainSpiltter.addWidget(self.workWidget) self.workWidgetLayout = QHBoxLayout() self.workWidget.setLayout(self.workWidgetLayout) self.leftWidget = QFrame() self.leftWidget.setObjectName('leftWidget') self.leftWidget.setFrameShape(QFrame.StyledPanel) self.leftWidget.setMaximumWidth(230) self.leftWidgetLayout = QVBoxLayout() self.leftWidgetLayout.setContentsMargins(0, 0, 0, 0) self.leftWidget.setLayout(self.leftWidgetLayout) # self.hideBtn = QLabel() # self.hideBtn.setObjectName('hideBtn') # self.hideBtn.setPixmap(QPixmap('./image/mainWindowIcon/showAndHideIcon/hide0.ico')) # # self.showBtn = QLabel() # self.showBtn.setObjectName('showBtn') # self.showBtn.setPixmap(QPixmap('./image/mainWindowIcon/showAndHideIcon/show0.ico')) # 存放按钮 self.widget = QWidget() self.widget.setObjectName('widget') self.leftWidgetLayout.addWidget(self.widget) pixmap = self.imageScale.pixmap_scale('./image/Logo/logo0.png', 204, 80) self.logoIamgeLabel = QLabel(self.widget) self.logoIamgeLabel.setObjectName('logoImageLabel') self.logoIamgeLabel.setPixmap(pixmap) self.widgetLayout = QGridLayout() self.widget.setLayout(self.widgetLayout) self.widgetLayout.addWidget(self.logoIamgeLabel, 0, 1) # 多界面 # QListWidget + QStackedWidget实现 self.leftListWidget = QListWidget() # 左侧选项列表 self.leftListWidget.setObjectName('leftListWidget') self.rightWidget = QStackedWidget() # 右侧框体 self.rightWidget.setObjectName('rightWidget') self.leftWidgetLayout.addWidget(self.leftListWidget) self.workWidgetLayout.addWidget(self.leftWidget) self.workWidgetLayout.addWidget(self.rightWidget) # ********左侧选项列表布局以及设置****************************** # 设置左侧选项列表大小 self.leftListWidget.setMinimumWidth(Const.LEFTWIDGET_WIDTH) # 左侧选项列表与右侧框体的index对应绑定 self.leftListWidget.currentRowChanged.connect(self.rightWidget.setCurrentIndex) # 去掉边框 self.leftListWidget.setFrameShape(QListWidget.NoFrame) # 隐藏滚动条 self.leftListWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.leftListWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) list_str = ['智能识别', '公式生成器', '学习资源区', '设置', '关于'] # 左侧选项添加 for i in range(5): self.item = QListWidgetItem(list_str[i], self.leftListWidget) self.item.setSizeHint(QSize(Const.ITEM_WIDTH, Const.ITEM_HEIGHT)) # 居中显示 self.item.setTextAlignment(Qt.AlignCenter) # 设置默认选中item[1] self.leftListWidget.setCurrentRow(0) # ********右侧主框体布局以及设置********************************** self.rightForm1 = RightForm1() self.rightForm2 = RightForm2() self.rightForm3 = RightForm3() self.rightForm4 = RightForm4() self.rightForm5 = RightForm5() self.rightWidget.addWidget(self.rightForm1) self.rightWidget.addWidget(self.rightForm2) self.rightWidget.addWidget(self.rightForm3) self.rightWidget.addWidget(self.rightForm4) self.rightWidget.addWidget(self.rightForm5) # ############################################################# # 消息通知框 self.messageInform = MesageFrame() self.messageInform.setObjectName('messageInform') # 消息通知框默认隐藏 self.messageInform.hide() self.mainSpiltter.addWidget(self.messageInform) # *****侧边栏***** # 右侧边栏 self.rightBar = QFrame() self.rightBar.setObjectName('rightBar') self.rightBar.setFixedWidth(35) self.rightBar.setFrameShape(QFrame.StyledPanel) self.rightBarLayout = QVBoxLayout() self.rightBar.setLayout(self.rightBarLayout) self.workWidgetLayout.addWidget(self.rightBar) # 右侧边栏控件 # 右侧边栏添加控件 # 下侧边栏 self.bottomBar = QFrame() self.bottomBar.setObjectName('bottomBar') self.bottomBar.setMaximumHeight(35) self.bottomBar.setFrameShape(QFrame.StyledPanel) self.bottomBarLayout = QHBoxLayout() self.bottomBarLayout.setAlignment(Qt.AlignRight) # 右对齐 self.bottomBar.setLayout(self.bottomBarLayout) self.mainSpiltter.addWidget(self.bottomBar) # 下侧边栏控件 # 留白控件 blank = QLabel(self.bottomBar) blank.setObjectName('blank') self.informText = QLabel(self.bottomBar) self.informText.setObjectName('informText') self.informText.setText('通知') self.informBtn = QPushButton(self.bottomBar) self.informBtn.setObjectName('informBtn') self.informBtn.resize(QSize(35, 35)) self.informBtn.setIcon(QIcon('./image/mainWindowIcon/messageBarBtnIcon/inform0.png')) self.informBtn.clicked.connect(lambda: self.open_inform_frame()) # 下侧边栏添加控件 self.bottomBarLayout.addWidget(self.informBtn) self.bottomBarLayout.addWidget(self.informText) self.bottomBarLayout.addWidget(blank) # ****************************业务逻辑****************************** # 右键菜单 def show_context_menu(self): """ 右键点击时调用的函数 :return: """ # 显示菜单前,将它移动到鼠标点击的位置 self.contextMenu.exec_(QCursor.pos()) # 最小化窗口 def show_mininized_window(self): """ :return: """ self.showMinimized() # 最大化窗口 def show_maximized_window(self): """ :return: """ self.showMaximized() # 复原窗口 def show_restore_window(self): """ :return: """ if self.isMaximized(): self.showNormal() else: self.showMaximized() # 关闭窗口 def quit_window(self): """ :return: """ self.close() # 打开文件 def get_image(self): """ getOpenFileName():返回用户所选择文件的名称,并打开该文件 第一个参数用于指定父组件 第二个参数指定对话框标题 第三个参数指定目录 第四个参数是文件扩展名过滤器 """ pass # fname, _ = QFileDialog.getOpenFileName(self, '选择图形文件', 'C:\\', "*.jpg *.gif *.png") # self.pixmapLabel.setPixmap(QPixmap(fname)) def get_text(self): """ :return: """ pass # # 初始化实例,并设置一些参数 # # textDialog = QFileDialog() # # textDialog.setFileMode(QFileDialog.AnyFile) # # textDialog.setFilter(QDir.Files) # textDialog = QFileDialog.getOpenFileName(self, '选择文本文件', 'C:\\', "*.txt *.doc *.docx") # # 当选择器关闭的时候 # if textDialog.exec_(): # # 拿到所选择的文本 # filenames = textDialog.selectedFiles() # # 读取文本内容设置到textEdit中 # f = open(filenames[0], 'r') # with f: # data = f.read() # self.textEdit.setText(data) def open_inform_frame(self): self.messageInform.show()