Esempio n. 1
0
class ArchieveDialog(QtWidgets.QDialog):

    def __init__(self,parent, db):
        super(ArchieveDialog, self).__init__(parent)
        self.conversation = QTextEdit(self)
        self.combo = QComboBox(self)
        self.db = db
        self.initUI()

    def initUI(self):
        self.resize(300,300)
        for key, value in self.db.items():
            self.combo.addItem(key)
        self.conversation.move(0,20)
        self.combo.move(0, 0)
        self.combo.activated[str].connect(self.onActivated)

    def onActivated(self, text):
        self.conversation.clear()
        self.conversation.append(self.db[text])
Esempio n. 2
0
class ConsoleWidget(QWidget):

    def __init__(self, parent=None):
        super(ConsoleWidget, self).__init__(parent)

        self.textEdit = QTextEdit()
        self.textEdit.setFont(QFont('Consolas'))
        self.clearButton = QPushButton()
        self.clearButton.setText('Clear')

        self.vboxLayout = QVBoxLayout()
        self.vboxLayout.addWidget(self.textEdit)
        self.vboxLayout.addWidget(self.clearButton)
        self.setLayout(self.vboxLayout)

        self.clearButton.clicked.connect(self.clearConsoleTexts)

    def clearConsoleTexts(self):
        self.textEdit.clear()

    @pyqtSlot(str)
    def consoleOutput(self, msg):
        self.textEdit.append(msg)
Esempio n. 3
0
class Tabl(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.tableWidget = QTableWidget()
        #result = QLabel('Result')
        #table_label=QLabel('Tables')
        databases_n = QLineEdit()
        databases_n.setPlaceholderText('A name of databases')
        self.table_n = QLineEdit()
        self.table_n.setPlaceholderText('Enter or copy/paste name of table')
        self.result_text = QTextEdit()
        self.result_text.setPlaceholderText('*** R E S U L T   A R E A ***')
        self.tableWidget = QTableWidget()
        self.Cleartab()
        #self.tableWidget.setPlaceholderText('sdfgsdfsdfgsdf')

        button01 = QPushButton('Show databases')
        button01.clicked.connect(self.Select_databases)
        self.sqlparameters = QLineEdit()
        self.sqlparameters.setPlaceholderText(
            'Enter host (localhost or sqldatabase.com)')
        self.sqlparameters2 = QLineEdit()
        self.sqlparameters2.setPlaceholderText('Enter username (User)')
        self.sqlparameters3 = QLineEdit()
        self.sqlparameters3.setEchoMode(QLineEdit.Password)
        self.sqlparameters3.setPlaceholderText(
            'Enter the password(maybe blank)')

        button1 = QPushButton('Select databases')
        button1.clicked.connect(self.Select_databases)
        button11 = QPushButton('Use database')
        button11.clicked.connect(self.UseDatabase)
        self.use_database = QLineEdit()
        self.use_database.setPlaceholderText(
            'Enter or copy/paste a database name')

        button2 = QPushButton('Select table')
        button2.clicked.connect(self.Select_Table)

        button_clear = QPushButton('Clear Result Area')
        button_clear.clicked.connect(self.Clearfun)

        button_clear_tab = QPushButton('Clear Tables Area')
        button_clear_tab.clicked.connect(self.Cleartab)

        button_exit = QPushButton('Exit')
        button_exit.clicked.connect(self.Exit)
        ###########################
        vhbox = QHBoxLayout()
        vhbox.addWidget(self.sqlparameters)
        vhbox.addWidget(self.sqlparameters2)
        vhbox.addWidget(self.sqlparameters3)

        grid = QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(button01, 1, 0)
        grid.addLayout(vhbox, 1, 1)

        #grid.addWidget(button1, 2, 0)
        #grid.addWidget(databases_n, 2, 1)

        grid.addWidget(button11, 2, 0)
        grid.addWidget(self.use_database, 2, 1)

        grid.addWidget(button2, 3, 0)
        grid.addWidget(self.table_n, 3, 1)

        #grid.addWidget(button_clear, 5,0)
        #grid.addWidget(button_clear_tab, 5,1)

        #grid.addWidget(result, 6, 0)
        grid.addWidget(button_clear, 4, 0)
        grid.addWidget(self.result_text, 4, 1)

        #grid.addWidget(table_label, 7, 0)
        grid.addWidget(button_clear_tab, 5, 0)
        grid.addWidget(self.tableWidget, 5, 1)

        grid.addWidget(button_exit, 6, 0)

        self.setLayout(grid)

        self.setGeometry(300, 300, 700, 700)
        self.setWindowTitle('--= MySQL Tables =--')
        self.show()

    def Select_databases(self):
        #self.db=pymysql.connect("ensembldb.ensembl.org","anonymous","")
        #self.db=pymysql.connect("localhost","root","123")
        if self.sqlparameters.text() == '' and self.sqlparameters2.text(
        ) == '' and self.sqlparameters3.text() == '':
            sqlp = 'localhost'
            sqlp2 = 'root'
            sqlp3 = '123'
        else:
            sqlp = self.sqlparameters.text()
            sqlp2 = self.sqlparameters2.text()
            sqlp3 = self.sqlparameters3.text()
        #print(sqlp+sqlp2+sqlp3)
        #self.db=pymysql.connect(*(("{0},{1},{2}".format(sqlp, sqlp2, sqlp3)).split(',')))
        self.db = pymysql.connect(('{0}'.format(sqlp)), ('{0}'.format(sqlp2)),
                                  ('{0}'.format(sqlp3)))
        self.cursor = self.db.cursor()
        # Select Name of tables
        self.cursor.execute('show databases')
        self.b1 = []
        for row in self.cursor:
            self.a1 = []
            for i in row:
                self.a1.append(str(i))
                self.b1.append(' '.join(self.a1))
        self.text_ = '\n'.join(self.b1)
        #print(self.text_)
        self.result_text.append('\n ***Databases*** \n \n' + self.text_)
        ### Close the Base!
        #self.db.close()

    def UseDatabase(self):
        if self.use_database.text() == '':
            return
        database_use = self.use_database.text()
        #self.db=pymysql.connect("localhost","root","123","forum")
        self.cursor = self.db.cursor()
        self.cursor.execute('use {}'.format(database_use))
        self.cursor.execute('show tables')
        self.b1 = []
        for row in self.cursor:
            self.a1 = []
            for i in row:
                self.a1.append(str(i))
                self.b1.append(' '.join(self.a1))
        self.text_ = '\n'.join(self.b1)
        print(self.text_)
        self.result_text.append('\n ***Tables*** \n \n' + self.text_)

    def Select_Table(self):
        if self.table_n.text() == '':
            return
        self.table_sel = self.table_n.text()
        print("**" + self.table_sel)

        #self.db=pymysql.connect("localhost","root","123","forum")
        self.cursor = self.db.cursor()
        self.cursor.execute("select * from {0}".format(self.table_sel))
        #del self.aa
        self.aa = []
        try:
            for row in self.cursor:
                print(row)
                self.aa.append(str(row))
                print(self.aa)

            for i in range(len(self.aa)):
                self.tableWidget.setRowCount(len(self.aa))
                self.tableWidget.setColumnCount(1)
                self.tableWidget.resizeColumnsToContents()
                self.tableWidget.setItem(i, 0, QTableWidgetItem(self.aa[i]))
        finally:
            return

    def Clearfun(self):
        self.result_text.clear()

    def Cleartab(self):
        self.tableWidget.clear()
        self.tableWidget.setRowCount(2)
        self.tableWidget.setColumnCount(2)

    def Exit(self):
        if self.cursor != None or self.db != None:
            time.sleep = 3
            self.db.close()
            self.cursor.close()

        sys.exit(0)
Esempio n. 4
0
class AddressBook(QWidget):
    def __init__(self, parent=None):
        super(AddressBook, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldName = ''
        self.oldAddress = ''

        nameLabel = QLabel("Name:")
        self.nameLine = QLineEdit()
        self.nameLine.setReadOnly(True)

        addressLabel = QLabel("Address:")
        self.addressText = QTextEdit()
        self.addressText.setReadOnly(True)

        self.addButton = QPushButton("Add")
        self.addButton.show()
        self.submitButton = QPushButton("Submit")
        self.submitButton.hide()
        self.cancelButton = QPushButton("Cancel")
        self.cancelButton.hide()
        self.nextButton = QPushButton("Next")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("Previous")
        self.previousButton.setEnabled(False)

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton, Qt.AlignTop)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addStretch()

        buttonLayout2 = QHBoxLayout()
        buttonLayout2.addWidget(self.previousButton)
        buttonLayout2.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addLayout(buttonLayout1, 1, 2)
        mainLayout.addLayout(buttonLayout2, 3, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("Very Simple Address Book")

    def addContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.nameLine.clear()
        self.addressText.clear()

        self.nameLine.setReadOnly(False)
        self.nameLine.setFocus(Qt.OtherFocusReason)
        self.addressText.setReadOnly(False)

        self.addButton.setEnabled(False)
        self.nextButton.setEnabled(False)
        self.previousButton.setEnabled(False)
        self.submitButton.show()
        self.cancelButton.show()

    def submitContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name == "" or address == "":
            QMessageBox.information(self, "Empty Field",
                    "Please enter a name and address.")
            return

        if name not in self.contacts:
            self.contacts[name] = address
            QMessageBox.information(self, "Add Successful",
                    "\"%s\" has beem added to your address book." % name)
        else:
            QMessageBox.information(self, "Add Unsuccessful",
                    "Sorry, \"%s\" is already in your address book." % name)
            return

        if not self.contacts:
            self.nameLine.clear()
            self.addressText.clear()

        self.nameLine.setReadOnly(True)
        self.addressText.setReadOnly(True)
        self.addButton.setEnabled(True)

        number = len(self.contacts)
        self.nextButton.setEnabled(number > 1)
        self.previousButton.setEnabled(number > 1)

        self.submitButton.hide()
        self.cancelButton.hide()

    def cancel(self):
        self.nameLine.setText(self.oldName)
        self.addressText.setText(self.oldAddress)

        if not self.contacts:
            self.nameLine.clear()
            self.addressText.clear()

        self.nameLine.setReadOnly(True)
        self.addressText.setReadOnly(True)
        self.addButton.setEnabled(True)

        number = len(self.contacts)
        self.nextButton.setEnabled(number > 1)
        self.previousButton.setEnabled(number > 1)

        self.submitButton.hide()
        self.cancelButton.hide()

    def next(self):
        name = self.nameLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_name, _ = it.next()

                if this_name == name:
                    next_name, next_address = it.next()
                    break
        except StopIteration:
            next_name, next_address = iter(self.contacts).next()

        self.nameLine.setText(next_name)
        self.addressText.setText(next_address)

    def previous(self):
        name = self.nameLine.text()

        prev_name = prev_address = None
        for this_name, this_address in self.contacts:
            if this_name == name:
                break

            prev_name = this_name
            prev_address = this_address
        else:
            self.nameLine.clear()
            self.addressText.clear()
            return

        if prev_name is None:
            for prev_name, prev_address in self.contacts:
                pass

        self.nameLine.setText(prev_name)
        self.addressText.setText(prev_address)
Esempio n. 5
0
class MainWindow(QMainWindow):
    receiveUpdateSignal = pyqtSignal(str)
    errorSignal = pyqtSignal(str)
    isDetectSerialPort = False
    receiveCount = 0
    sendCount = 0
    isScheduledSending = False

    def __init__(self):
        super().__init__()
        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
        mainWidget = QWidget()
        settingLayout = QVBoxLayout()
        sendReceiveLayout = QVBoxLayout()
        sendFunctionalLayout = QVBoxLayout()
        mainLayout = QHBoxLayout()
        mainLayout.addLayout(settingLayout)
        mainLayout.addLayout(sendReceiveLayout)
        mainLayout.addLayout(sendFunctionalLayout)
        mainWidget.setLayout(mainLayout)
        mainLayout.setStretch(0, 2)
        mainLayout.setStretch(1, 6)
        mainLayout.setStretch(2, 2)
        self.setCentralWidget(mainWidget)

        # widgets receive and send area
        self.receiveArea = QTextEdit()
        self.sendArea = QTextEdit()
        self.clearReceiveButtion = QPushButton(parameters.strClearReceive)
        self.sendButtion = QPushButton(parameters.strSend)
        self.sendHistory = QComboBox()
        sendAreaWidgetsLayout = QHBoxLayout()
        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.addLayout(sendAreaWidgetsLayout)
        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.Combobox()
        self.serailBaudrateCombobox = QComboBox()
        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 = QComboBox()
        self.serailBytesCombobox.addItem("5")
        self.serailBytesCombobox.addItem("6")
        self.serailBytesCombobox.addItem("7")
        self.serailBytesCombobox.addItem("8")
        self.serailBytesCombobox.setCurrentIndex(3)
        self.serailParityCombobox = QComboBox()
        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 = QComboBox()
        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)
        self.settingsButton = QPushButton(parameters.strSettings)
        self.aboutButton = QPushButton(parameters.strAbout)
        menuLayout = QHBoxLayout()
        menuLayout.addWidget(self.settingsButton)
        menuLayout.addWidget(self.aboutButton)
        functionalGroupBox = QGroupBox(parameters.strFunctionalSend)
        functionalGridLayout = QGridLayout()
        functionalGridLayout.addWidget(self.addButton, 0, 1)
        functionalGroupBox.setLayout(functionalGridLayout)
        sendFunctionalLayout.addLayout(menuLayout)
        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))
        self.setWindowIcon(QIcon(parameters.appIcon))
        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.showSettings)
        self.aboutButton.clicked.connect(self.showAbout)
        self.addButton.clicked.connect(self.functionAdd)
        return

    def openCloseSerial(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
                    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)
                    receiveProcess = threading.Thread(target=self.receiveData)
                    receiveProcess.setDaemon(True)
                    receiveProcess.start()
                except Exception as e:
                    self.com.close()
                    self.receiveProgressStop = True
                    self.errorHint(parameters.strOpenFailed + str(e))
        except Exception:
            pass
        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.errorHint(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("send:", data)
                self.sendCount += len(data)
                self.com.write(data)
                self.sendHistoryFindDelete(data.decode())
                self.sendHistory.insertItem(0, data.decode())
                self.sendHistory.setCurrentIndex(0)
                self.receiveUpdateSignal.emit(None)
                # 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.errorHint(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.errorHint(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 != None:
            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=mainWindow.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()
        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)
        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()
        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 showSettings(self):
        QMessageBox.information(self, "Settings", "On the way")
        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) +
            "</b><br><br>" + helpAbout.date + "<br><br>" + helpAbout.strAbout)
        return

    def autoUpdateDetect(self):
        auto = autoUpdate.AutoUpdate()
        if auto.detectNewVersion():
            auto.OpenBrowser()

    def openDevManagement(self):
        os.system('echo aaaa')
        os.system('start devmgmt.msc')
Esempio n. 6
0
class Window(QMainWindow):
    # constructor method
    def __init__(self):
        super().__init__()
        self.title = "Pura Vida Compilador"
        # dimensions
        self.width = 800
        self.height = 700
        self.setMinimumSize(800, 700)
        self.setMaximumSize(800, 700)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        # modify the background color
        self.setStyleSheet("background-color: #808080;")
        # center the window
        resolution = ctypes.windll.user32
        with_resolution = resolution.GetSystemMetrics(0)
        height_resolution = resolution.GetSystemMetrics(1)
        self.left = (with_resolution / 2) - (self.frameSize().width() / 2)
        self.top = (height_resolution / 2) - (self.frameSize().height() / 2)
        # calling the configuration procedures
        self.InitWindowConfiguration()
        self.Create_ToolBar()
        self.Create_TextEdit()
        self.show()

    # the window config
    def InitWindowConfiguration(self):
        # here we have to set the window icon
        self.setWindowIcon(QtGui.QIcon("Resources\Icon.png"))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

    # configuration of ToolBar menu
    def Create_ToolBar(self):
        # creating the action buttons and icons
        exitAction = QAction(QIcon("Resources/cancel.png"), "Close Program",
                             self)
        exitAction.triggered.connect(self.Close_App)

        openAction = QAction(QIcon("Resources/folder.png"),
                             "Open a existing file", self)
        openAction.triggered.connect(self.Open_Code)

        compiAction = QAction(QIcon("Resources/check.png"), "Compile the code",
                              self)
        compiAction.triggered.connect(self.OnClickCompileButton)

        infoAction = QAction(QIcon("Resources/info.png"), "About Us", self)
        infoAction.triggered.connect(self.OpenGitHub)

        newAction = QAction(QIcon("Resources/new.png"), "New File", self)
        newAction.triggered.connect(self.Code_New)

        saveAction = QAction(QIcon("Resources/save.png"), "Save this code",
                             self)
        saveAction.triggered.connect(self.Save_Code)

        # adding the actions to the ToolBar
        self.toolbar = self.addToolBar("ToolBar")
        self.toolbar.addAction(newAction)
        self.toolbar.addAction(openAction)
        self.toolbar.addAction(saveAction)
        self.toolbar.addAction(compiAction)
        self.toolbar.addAction(infoAction)
        self.toolbar.addAction(exitAction)
        self.toolbar.setMovable(False)

    # this the Widget in charge of the text area where the code is written
    def Create_TextEdit(self):
        self.textEdit = QTextEdit(self)
        self.setCentralWidget(self.textEdit)
        self.textEdit.setStyleSheet("background-color: #003153;")
        # change the text font
        font = QtGui.QFont()
        font.setPointSize(14)
        self.textEdit.setFont(font)
        self.textEdit.setAcceptRichText(False)
        # Linking the textEdit with the Syntax Color beast module
        self.highlight = SyntaxColor.PythonHighlighter(
            self.textEdit.document())

    # procedure in charge of the program exit
    def Close_App(self):
        self.close()

    # procedure that validate the compile button, at now, it does nothing but is waiting for the logic
    def OnClickCompileButton(self):
        print(self.textEdit.toPlainText())

    # when user clicks info button
    def OpenGitHub(self):
        url = "https://github.com/OscarAraya18/CE3104_LedCube8"
        webbrowser.open(url)

    # when user clicks save
    def Save_Code(self):
        filename = QFileDialog.getSaveFileName(self, "Save Code",
                                               os.getenv('Home'))
        if filename[0]:
            f = open(filename[0], 'w')
            with f:
                code = self.textEdit.toPlainText()
                f.write(code)
                #using QMessageBox
                mb = QMessageBox()
                mb.setWindowTitle("Save File")
                mb.setText("Your file was saved successfully")
                mb.setIcon(QMessageBox.Information)
                x = mb.exec()

    # when user wants to open an existing file.txt
    def Open_Code(self):
        filename = QFileDialog.getOpenFileName(self, "Choose the file",
                                               os.getenv('Home'))
        if filename[0]:
            f = open(filename[0], 'r')
            with f:
                open_code = f.read()
                self.textEdit.setText(open_code)

    # this procedure delete the actual code and create a new file to code
    def Code_New(self):
        mb = QMessageBox()
        mb.setWindowTitle("New File")
        mb.setText("Are you sure that you want to create a new file,")
        mb.setIcon(QMessageBox.Information)
        mb.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        mb.buttonClicked.connect(self.popup_button)
        x = mb.exec()

    #validating the Yes|No option in the MessageBox
    def popup_button(self, i):
        print(i.text())
        if i.text() == "&Yes":
            self.textEdit.clear()
Esempio n. 7
0
class AddressBook(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.contacts = SortedDict()
        self.oldName = ''
        self.oldAddress = ''

        nameLabel = QLabel("Name:")
        self.nameLine = QLineEdit()
        self.nameLine.setReadOnly(True)

        addressLabel = QLabel("Address:")
        self.addressText = QTextEdit()
        self.addressText.setReadOnly(True)

        self.addButton = QPushButton("&Add")
        self.addButton.show()
        self.submitButton = QPushButton("&Submit")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&Cancel")
        self.cancelButton.hide()
        self.nextButton = QPushButton("&Next")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("&Previous")
        self.previousButton.setEnabled(False)

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)

        leftLayout = QVBoxLayout()
        leftLayout.addWidget(self.addButton, Qt.AlignTop)
        leftLayout.addWidget(self.submitButton)
        leftLayout.addWidget(self.cancelButton)
        leftLayout.addStretch()

        bottomLayout = QHBoxLayout()
        bottomLayout.addWidget(self.previousButton)
        bottomLayout.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addLayout(leftLayout, 1, 2)
        mainLayout.addLayout(bottomLayout, 3, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Address Book")

    def addContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.nameLine.clear()
        self.addressText.clear()

        self.nameLine.setReadOnly(False)
        self.nameLine.setFocus(Qt.OtherFocusReason)
        self.addressText.setReadOnly(False)

        self.addButton.setEnabled(False)
        self.nextButton.setEnabled(False)
        self.previousButton.setEnabled(False)
        self.submitButton.show()
        self.cancelButton.show()

    def submitContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name == "" or address == "":
            QMessageBox.information(self, "Empty Field",
                    "Please enter a name and address.")
            return

        if name not in self.contacts:
            self.contacts[name] = address
            QMessageBox.information(self, "Add Successful",
                    "\"%s\" has been added to your address book." % name)
        else:
            QMessageBox.information(self, "Add Unsuccessful",
                    "Sorry, \"%s\" is already in your address book." % name)
            return

        self.nameLine.setReadOnly(True)
        self.addressText.setReadOnly(True)
        self.addButton.setEnabled(True)

        number = len(self.contacts)
        self.nextButton.setEnabled(number > 1)
        self.previousButton.setEnabled(number > 1)

        self.submitButton.hide()
        self.cancelButton.hide()

    def cancel(self):
        self.nameLine.setText(self.oldName)
        self.addressText.setText(self.oldAddress)

        self.nameLine.setReadOnly(True)
        self.addressText.setReadOnly(True)
        self.addButton.setEnabled(True)

        number = len(self.contacts)
        self.nextButton.setEnabled(number > 1)
        self.previousButton.setEnabled(number > 1)

        self.submitButton.hide()
        self.cancelButton.hide()

    def next(self):
        name = self.nameLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_name = next(it)

                if this_name == name:
                    next_name = next(it)
                    next_address = self.contacts[next_name]
                    break
        except StopIteration:
            next_name = name
            next_address = self.contacts[name]

        self.nameLine.setText(next_name)
        self.addressText.setText(next_address)

    def previous(self):
        name = self.nameLine.text()

        reverse_list = [i for i in iter(self.contacts)]
        def reverse_gener(lst):
            lst = lst.copy()
            lst.reverse()
            for i in lst:
                yield i

        it = reverse_gener(reverse_list)

        try:
            while True:
                this_name = next(it)

                if this_name == name:
                    next_name = next(it)
                    next_address = self.contacts[next_name]
                    break
        except StopIteration:
            next_name = name
            next_address = self.contacts[name]

        self.nameLine.setText(next_name)
        self.addressText.setText(next_address)
Esempio n. 8
0
class BookLog(QWidget):
    NavigationMode, AddingMode, EditingMode = range(3)

    def __init__(self, parent=None):
        super(BookLog, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldTitle = ''
        self.oldMemo = ''
        self.oldShoziflag = False
        self.oldIsbn = ''
        self.oldDokuryodate = QDate()
        self.currentMode = self.NavigationMode

        #ラベル
        titleLabel = QLabel("書名:")
        self.titleLine = QLineEdit()
        self.titleLine.setReadOnly(True)

        dokuryoLabel = QLabel("読了日:")
        self.dokuryodate = QDateEdit()
        self.dokuryodate.setReadOnly(True)

        memoLabel = QLabel("メモ:")
        self.memoText = QTextEdit()
        self.memoText.setReadOnly(True)

        isbnLabel = QLabel("ISBN:")
        self.isbnLine = QLineEdit()
        self.isbnLine.setReadOnly(True)

        shoziflag = QLabel("所持:")
        self.shoziflag = QCheckBox()

        self.addButton = QPushButton("&追加")
        self.addButton.show()
        self.editButton = QPushButton("&編集")
        self.editButton.setEnabled(False)
        self.removeButton = QPushButton("&削除")
        self.removeButton.setEnabled(False)
        self.findButton = QPushButton("&検索")
        self.findButton.setEnabled(False)
        self.submitButton = QPushButton("&挿入")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&キャンセル")
        self.cancelButton.hide()

        self.nextButton = QPushButton("&次")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("&前")
        self.previousButton.setEnabled(False)

        self.loadButton = QPushButton("&Load...")
        self.loadButton.setToolTip("Load contacts from a file")
        self.saveButton = QPushButton("Sa&ve...")
        self.saveButton.setToolTip("Save contacts to a file")
        self.saveButton.setEnabled(False)

        self.exportButton = QPushButton("Ex&port")
        self.exportButton.setToolTip("Export as vCard")
        self.exportButton.setEnabled(False)

        self.dialog = FindDialog()

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.editButton.clicked.connect(self.editContact)
        self.removeButton.clicked.connect(self.removeContact)
        #self.findButton.clicked.connect(self.findContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)
        self.loadButton.clicked.connect(self.loadFromFile)
        self.saveButton.clicked.connect(self.saveToFile)
        self.exportButton.clicked.connect(self.exportAsVCard)

        #self.createMenus()
        #topFiller = QWidget()
        #topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton)
        buttonLayout1.addWidget(self.editButton)
        buttonLayout1.addWidget(self.removeButton)
        buttonLayout1.addWidget(self.findButton)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addWidget(self.loadButton)
        buttonLayout1.addWidget(self.saveButton)
        buttonLayout1.addWidget(self.exportButton)
        buttonLayout1.addStretch()

        buttonLayout2 = QHBoxLayout()
        buttonLayout2.addWidget(self.previousButton)
        buttonLayout2.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(titleLabel, 0, 0)
        mainLayout.addWidget(self.titleLine, 0, 1)
        mainLayout.addWidget(memoLabel, 3, 0, Qt.AlignTop)
        mainLayout.addWidget(self.memoText, 3, 1)
        mainLayout.addWidget(dokuryoLabel, 2, 0)
        mainLayout.addWidget(self.dokuryodate, 2, 1)
        mainLayout.addWidget(isbnLabel, 1, 0)
        mainLayout.addWidget(self.isbnLine, 1, 1)
        mainLayout.addWidget(shoziflag, 4, 0)
        mainLayout.addWidget(self.shoziflag, 4, 1)
        mainLayout.addLayout(buttonLayout1, 6, 2)
        mainLayout.addLayout(buttonLayout2, 5, 1)
        #テーブル

        self.table = QTableWidget(
            100,
            5,
        )
        self.table.setHorizontalHeaderLabels(["書名", "ISBN", "読了日", "メモ", "所持"])
        self.table.verticalHeader().setVisible(False)
        #for i, (title, memo) in enumerate(tableData):

        i = 0
        for title, obj in self.contacts.items():
            titleItem = QTableWidgetItem(title)
            memoItem = QTableWidgetItem()
            memoItem.setData(Qt.DisplayRole, memo)
            if obj['shoziflag'] == True:
                maru = '○'
            else:
                maru = ''
            self.table.setItem(i, 0, titleItem)
            self.table.setItem(i, 1, QTableWidgetItem(obj['isbn']))
            self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate']))
            self.table.setItem(i, 3, QTableWidgetItem(obj['memo']))
            self.table.setItem(i, 4, QTableWidgetItem(maru))
            i += 1
        #table.resize(150, 50)
        #self.table.resizeColumnToContents(0)
        self.table.horizontalHeader().setStretchLastSection(True)

        self.table.doubleClicked.connect(self.tableclick)
        mainLayout.addWidget(self.table, 6, 1)
        #mainLayout.addWidget(topFiller)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Book Log")
        #self.csvImport()
        self.loadFromFile('./a.bl')

    def createUI(self):
        self.setWindowTitle('Equipment Manager 0.3')
        #Menu Bar
        fileMenuBar = QMenuBar(self)
        menuFile = QMenu(fileMenuBar)
        actionChangePath = QAction(tr("Change Path"), self)
        fileMenuBar.addMenu(menuFile)
        menuFile.addAction(actionChangePath)

    def addContact(self):
        self.oldTitle = self.titleLine.text()
        self.oldMemo = self.memoText.toPlainText()
        self.oldIsbn = self.isbnLine.text()

        self.titleLine.clear()
        self.memoText.clear()
        self.isbnLine.clear()

        self.updateInterface(self.AddingMode)

    def editContact(self):
        self.oldTitle = self.titleLine.text()
        self.oldMemo = self.memoText.toPlainText()
        self.oldDokuryodate = self.dokuryodate.text()
        self.oldIsbn = self.isbnLine.text()
        self.oldShoziflag = self.shoziflag.isChecked()

        self.updateInterface(self.EditingMode)

    def submitContact(self):
        title = self.titleLine.text()
        memo = self.memoText.toPlainText()
        isbn = self.isbnLine.text()
        dokuryodate = self.dokuryodate.text()
        shoziflag = self.shoziflag.isChecked()

        if title == "" or memo == "":
            QMessageBox.information(self, "Empty Field",
                                    "Please enter a title and memo.")
            return

        if self.currentMode == self.AddingMode:
            if title not in self.contacts:
                self.contacts[title] = {
                    'memo': memo,
                    'dokuryodate': dokuryodate,
                    'isbn': isbn,
                    'shoziflag': shoziflag
                }
                QMessageBox.information(self, "追加しました",
                                        "\"%s\" は追加されました。" % title)
            else:
                QMessageBox.information(self, "追加できませんでした",
                                        "\"%s\" はすでに存在しています。" % title)
                return

        elif self.currentMode == self.EditingMode:
            if self.oldTitle != title:
                if title not in self.contacts:
                    QMessageBox.information(self, "編集しました",
                                            "\"%s\" は編集されました。" % self.oldTitle)
                    del self.contacts[self.oldTitle]
                    self.contacts[title] = memo
                else:
                    QMessageBox.information(self, "編集できませんでした。",
                                            "\"%s\"はすでに存在しています。" % title)
                    return
            elif self.oldMemo != memo:
                QMessageBox.information(self, "編集しました",
                                        "\"%s\"は編集されました。" % title)
                self.contacts[title] = {
                    memo: memo,
                    dokuryodate: dokuryodate,
                    shoziflag: shoziflag,
                    isbn: isbn
                }

        self.updateInterface(self.NavigationMode)

    # ボタンの処理
    def cancel(self):
        self.titleLine.setText(self.oldTitle)
        self.memoText.setText(self.oldMemo)
        self.dokuryodate.setDate(self.oldDokuryodate)
        self.shoziflag.setChecked(self.oldShoziflag)
        self.isbnLine.setText(self.oldIsbn)
        self.updateInterface(self.NavigationMode)

    def removeContact(self):
        title = self.titleLine.text()
        memo = self.memoText.toPlainText()

        if title in self.contacts:
            button = QMessageBox.question(
                self, "Confirm Remove",
                "Are you sure you want to remove \"%s\"?" % title,
                QMessageBox.Yes | QMessageBox.No)

            if button == QMessageBox.Yes:
                self.previous()
                del self.contacts[title]

                QMessageBox.information(
                    self, "Remove Successful",
                    "\"%s\" has been removed from your memo book." % title)

        self.updateInterface(self.NavigationMode)

    def next(self):
        title = self.titleLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_title, _ = it.next()

                if this_title == title:
                    next_title, next_memo, next_date = it.next()
                    break
        except StopIteration:
            next_title, next_memo = iter(self.contacts).next()

        self.titleLine.setText(next_title)
        self.memoText.setText(next_memo)

    def previous(self):
        title = self.titleLine.text()

        prev_title = prev_memo = None
        for this_title, this_memo in self.contacts:
            if this_title == title:
                break

            prev_title = this_title
            prev_memo = this_memo
        else:
            self.titleLine.clear()
            self.memoText.clear()
            return

        if prev_title is None:
            for prev_title, prev_memo in self.contacts:
                pass

        self.titleLine.setText(prev_title)
        self.memoText.setText(prev_memo)

    def Contact(self):
        self.dialog.show()

        if self.dialog.exec_() == QDialog.Accepted:
            contactTitle = self.dialog.getFindText()

            found = False
            for this_title, this_memo in self.contacts:
                #    if contactTitle in this_title:
                if re.search(contactTitle, this_title):
                    found = True
                    break

            if found:
                self.titleLine.setText(this_title)
                self.memoText.setText(self.contacts[this_title])
                self.isbnLine.setText(self.contacts[this_title])
                self.dokuryodate.setDate(self.contacts[this_title])
                self.shoziflag.setChecked(self.contacts[this_title])
            else:
                QMessageBox.information(
                    self, "Contact Not Found",
                    "Sorry, \"%s\" is not in your address book." %
                    contactTitle)
                return

        self.updateInterface(self.NavigationMode)

# ボタンを押せるか押せないかの処理

    def updateInterface(self, mode):
        self.currentMode = mode

        if self.currentMode in (self.AddingMode, self.EditingMode):
            self.titleLine.setReadOnly(False)
            self.titleLine.setFocus(Qt.OtherFocusReason)
            self.isbnLine.setReadOnly(False)
            self.dokuryodate.setReadOnly(False)
            self.memoText.setReadOnly(False)

            self.addButton.setEnabled(False)
            self.editButton.setEnabled(False)
            self.removeButton.setEnabled(False)

            self.nextButton.setEnabled(False)
            self.previousButton.setEnabled(False)

            self.submitButton.show()
            self.cancelButton.show()

            self.loadButton.setEnabled(False)
            self.saveButton.setEnabled(False)
            self.exportButton.setEnabled(False)

        elif self.currentMode == self.NavigationMode:
            if not self.contacts:
                self.titleLine.clear()
                self.memoText.clear()
                self.dokuryodate.clear()
                self.isbnLine.clear()

            self.titleLine.setReadOnly(True)
            self.memoText.setReadOnly(True)
            self.dokuryodate.setReadOnly(True)
            self.shoziflag
            self.isbnLine.setReadOnly(True)
            self.addButton.setEnabled(True)

            number = len(self.contacts)
            self.editButton.setEnabled(number >= 1)
            self.removeButton.setEnabled(number >= 1)
            self.findButton.setEnabled(number > 2)
            self.nextButton.setEnabled(number > 1)
            self.previousButton.setEnabled(number > 1)

            self.submitButton.hide()
            self.cancelButton.hide()

            self.exportButton.setEnabled(number >= 1)

            self.loadButton.setEnabled(True)
            self.saveButton.setEnabled(number >= 1)
            #テーブルの更新
            i = 0
            for title, obj in self.contacts.items():
                titleItem = QTableWidgetItem(title)
                memoItem = QTableWidgetItem()
                memoItem.setData(Qt.DisplayRole, obj['memo'])
                if obj['shoziflag'] == True:
                    maru = '○'
                else:
                    maru = ''

                self.table.setItem(i, 0, titleItem)
                self.table.setItem(i, 1, QTableWidgetItem(obj['isbn']))
                self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate']))
                self.table.setItem(i, 3, QTableWidgetItem(obj['memo']))
                self.table.setItem(i, 4, QTableWidgetItem(maru))

                i += 1

    def saveToFile(self):
        fileTitle, _ = QFileDialog.getSaveFileName(
            self, "Save book log", '', "Book Log (*.bl);;All Files (*)")

        if not fileTitle:
            return

        try:
            out_file = open(str(fileTitle), 'wb')
        except IOError:
            QMessageBox.information(
                self, "Unable to open file",
                "There was an error opening \"%s\"" % fileTitle)
            return
        pickle.dump(self.contacts, out_file)
        out_file.close()

    def loadFromFile(self, fileName=None):

        if not fileName:
            fileName, _ = QFileDialog.getOpenFileName(
                self, "Open Address Book", '',
                "Address Book (*.bl);;All Files (*)")

        try:
            in_file = open(str(fileName), 'rb')
        except IOError:
            QMessageBox.information(
                self, "Unable to open file",
                "There was an error opening \"%s\"" % fileName)
            return

        self.contacts = pickle.load(in_file)
        in_file.close()

        if len(self.contacts) == 0:
            QMessageBox.information(
                self, "No contacts in file",
                "The file you are attempting to open contains no "
                "contacts.")
        else:
            for title, obj in self.contacts:
                date = QDate.fromString(obj['dokuryodate'])
                self.titleLine.setText(title)
                self.memoText.setText(obj['memo'])
                self.shoziflag.setChecked(obj['shoziflag'])
                self.isbnLine.setText(obj['isbn'])
                self.dokuryodate.setDate(date)

        self.updateInterface(self.NavigationMode)

    def exportAsVCard(self):
        title = str(self.titleLine.text())
        memo = self.memoText.toPlainText()

        titleList = title.split()

        if len(titleList) > 1:
            firstName = nameList[0]
            lastName = nameList[-1]
        else:
            firstName = name
            lastName = ''

        fileName, _ = QFileDialog.getSaveFileName(
            self, "Export Contact", '', "vCard Files (*.vcf);;All Files (*)")

        if not fileName:
            return

        out_file = QFile(fileName)

        if not out_file.open(QIODevice.WriteOnly):
            QMessageBox.information(self, "Unable to open file",
                                    out_file.errorString())
            return

        out_s = QTextStream(out_file)

        out_s << 'BEGIN:VCARD' << '\n'
        out_s << 'VERSION:2.1' << '\n'
        out_s << 'N:' << lastName << ';' << firstName << '\n'
        out_s << 'FN:' << ' '.join(nameList) << '\n'

        address.replace(';', '\\;')
        address.replace('\n', ';')
        address.replace(',', ' ')

        out_s << 'ADR;HOME:;' << address << '\n'
        out_s << 'END:VCARD' << '\n'

        QMessageBox.information(self, "Export Successful",
                                "\"%s\" has been exported as a vCard." % name)

    def csvImport(self):
        with open('MediaMarkerExport.csv', newline='', encoding='utf-8') as f:
            reader = csv.reader(f)
            for r in reader:
                if r[2] == 1:
                    flag = True
                else:
                    flag = False
                self.contacts[r[0]] = {
                    'isbn': r[1],
                    'dokuryodate': r[3].replace('-', '/'),
                    'shoziflag': flag,
                    'memo': ''
                }
        aa = 0

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        #self.fileMenu.addAction(self.newAct)
        #self.fileMenu.addAction(self.openAct)
        #self.fileMenu.addAction(self.saveAct)
        #self.fileMenu.addAction(self.printAct)
        #self.fileMenu.addSeparator()
        #self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.undoAct)
        self.editMenu.addAction(self.redoAct)
        self.editMenu.addSeparator()
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)
        self.editMenu.addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

        self.formatMenu = self.editMenu.addMenu("&Format")
        self.formatMenu.addAction(self.boldAct)
        self.formatMenu.addAction(self.italicAct)
        self.formatMenu.addSeparator().setText("Alignment")
        self.formatMenu.addAction(self.leftAlignAct)
        self.formatMenu.addAction(self.rightAlignAct)
        self.formatMenu.addAction(self.justifyAct)
        self.formatMenu.addAction(self.centerAct)
        self.formatMenu.addSeparator()
        self.formatMenu.addAction(self.setLineSpacingAct)
        self.formatMenu.addAction(self.setParagraphSpacingAct)

    def tableclick(self, mi):
        row = mi.row()
        column = mi.column()
        #QMessageBox.information(self, "Export Successful",
        #        "%d x %d" % (row, column))
        title = self.titleLine.text()
        it = iter(self.contacts)

        try:
            n = 0
            while True:

                next_title, next_obj = it.next()
                if row == n:

                    break
                n += 1
        except StopIteration:
            next_title, next_obj = iter(self.contacts).next()

        self.titleLine.setText(next_title)
        self.memoText.setText(next_obj['memo'])
        self.isbnLine.setText(next_obj['isbn'])
        self.dokuryodate.setDate(next_obj['dokuryodate'])
        self.shoziflag.setChecked(next_obj['shoziflag'])
Esempio n. 9
0
class AddressBook(QWidget):
    NavigationMode, AddingMode, EditingMode = range(3)

    def __init__(self, parent=None):
        super(AddressBook, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldName = ""
        self.oldAddress = ""
        self.currentMode = self.NavigationMode

        nameLabel = QLabel("Name:")
        self.nameLine = QLineEdit()
        self.nameLine.setReadOnly(True)

        addressLabel = QLabel("Address:")
        self.addressText = QTextEdit()
        self.addressText.setReadOnly(True)

        self.addButton = QPushButton("&Add")
        self.addButton.show()
        self.editButton = QPushButton("&Edit")
        self.editButton.setEnabled(False)
        self.removeButton = QPushButton("&Remove")
        self.removeButton.setEnabled(False)
        self.findButton = QPushButton("&Find")
        self.findButton.setEnabled(False)
        self.submitButton = QPushButton("&Submit")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&Cancel")
        self.cancelButton.hide()

        self.nextButton = QPushButton("&Next")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("&Previous")
        self.previousButton.setEnabled(False)

        self.dialog = FindDialog()

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.editButton.clicked.connect(self.editContact)
        self.removeButton.clicked.connect(self.removeContact)
        self.findButton.clicked.connect(self.findContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton)
        buttonLayout1.addWidget(self.editButton)
        buttonLayout1.addWidget(self.removeButton)
        buttonLayout1.addWidget(self.findButton)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addStretch()

        buttonLayout2 = QHBoxLayout()
        buttonLayout2.addWidget(self.previousButton)
        buttonLayout2.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addLayout(buttonLayout1, 1, 2)
        mainLayout.addLayout(buttonLayout2, 2, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Address Book")

    def addContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.nameLine.clear()
        self.addressText.clear()

        self.updateInterface(self.AddingMode)

    def editContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.updateInterface(self.EditingMode)

    def submitContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name == "" or address == "":
            QMessageBox.information(self, "Empty Field",
                                    "Please enter a name and address.")
            return

        if self.currentMode == self.AddingMode:
            if name not in self.contacts:
                self.contacts[name] = address
                QMessageBox.information(
                    self,
                    "Add Successful",
                    '"%s" has been added to your address book.' % name,
                )
            else:
                QMessageBox.information(
                    self,
                    "Add Unsuccessful",
                    'Sorry, "%s" is already in your address book.' % name,
                )
                return

        elif self.currentMode == self.EditingMode:
            if self.oldName != name:
                if name not in self.contacts:
                    QMessageBox.information(
                        self,
                        "Edit Successful",
                        '"%s" has been edited in your address book.' %
                        self.oldName,
                    )
                    del self.contacts[self.oldName]
                    self.contacts[name] = address
                else:
                    QMessageBox.information(
                        self,
                        "Edit Unsuccessful",
                        'Sorry, "%s" is already in your address book.' % name,
                    )
                    return
            elif self.oldAddress != address:
                QMessageBox.information(
                    self,
                    "Edit Successful",
                    '"%s" has been edited in your address book.' % name,
                )
                self.contacts[name] = address

        self.updateInterface(self.NavigationMode)

    def cancel(self):
        self.nameLine.setText(self.oldName)
        self.addressText.setText(self.oldAddress)
        self.updateInterface(self.NavigationMode)

    def removeContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name in self.contacts:
            button = QMessageBox.question(
                self,
                "Confirm Remove",
                'Are you sure you want to remove "%s"?' % name,
                QMessageBox.Yes | QMessageBox.No,
            )

            if button == QMessageBox.Yes:
                self.previous()
                del self.contacts[name]

                QMessageBox.information(
                    self,
                    "Remove Successful",
                    '"%s" has been removed from your address book.' % name,
                )

        self.updateInterface(self.NavigationMode)

    def next(self):
        name = self.nameLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_name, _ = it.next()

                if this_name == name:
                    next_name, next_address = it.next()
                    break
        except StopIteration:
            next_name, next_address = iter(self.contacts).next()

        self.nameLine.setText(next_name)
        self.addressText.setText(next_address)

    def previous(self):
        name = self.nameLine.text()

        prev_name = prev_address = None
        for this_name, this_address in self.contacts:
            if this_name == name:
                break

            prev_name = this_name
            prev_address = this_address
        else:
            self.nameLine.clear()
            self.addressText.clear()
            return

        if prev_name is None:
            for prev_name, prev_address in self.contacts:
                pass

        self.nameLine.setText(prev_name)
        self.addressText.setText(prev_address)

    def findContact(self):
        self.dialog.show()

        if self.dialog.exec_() == QDialog.Accepted:
            contactName = self.dialog.getFindText()

            if contactName in self.contacts:
                self.nameLine.setText(contactName)
                self.addressText.setText(self.contacts[contactName])
            else:
                QMessageBox.information(
                    self,
                    "Contact Not Found",
                    'Sorry, "%s" is not in your address book.' % contactName,
                )
                return

        self.updateInterface(self.NavigationMode)

    def updateInterface(self, mode):
        self.currentMode = mode

        if self.currentMode in (self.AddingMode, self.EditingMode):
            self.nameLine.setReadOnly(False)
            self.nameLine.setFocus(Qt.OtherFocusReason)
            self.addressText.setReadOnly(False)

            self.addButton.setEnabled(False)
            self.editButton.setEnabled(False)
            self.removeButton.setEnabled(False)

            self.nextButton.setEnabled(False)
            self.previousButton.setEnabled(False)

            self.submitButton.show()
            self.cancelButton.show()

        elif self.currentMode == self.NavigationMode:
            if not self.contacts:
                self.nameLine.clear()
                self.addressText.clear()

            self.nameLine.setReadOnly(True)
            self.addressText.setReadOnly(True)
            self.addButton.setEnabled(True)

            number = len(self.contacts)
            self.editButton.setEnabled(number >= 1)
            self.removeButton.setEnabled(number >= 1)
            self.findButton.setEnabled(number > 2)
            self.nextButton.setEnabled(number > 1)
            self.previousButton.setEnabled(number > 1)

            self.submitButton.hide()
            self.cancelButton.hide()
Esempio n. 10
0
class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.init_ui()
        self.filenames = []

    def init_ui(self):

        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))

        new_action = QAction('New File', self)
        new_action.setShortcut('Ctrl+N')
        new_action.setStatusTip('Create new file')
        new_action.triggered.connect(self.new_file)

        open_action = QAction('Open...', self)
        open_action.setShortcut('Ctrl+O')
        open_action.setStatusTip('Open a file')
        open_action.triggered.connect(self.open_file)

        save_action = QAction('Save File', self)
        save_action.setShortcut('Ctrl+S')
        save_action.setStatusTip('Save current file')
        save_action.triggered.connect(self.save_file)

        new_save_action = QAction('Save File As...', self)
        new_save_action.setShortcut('Shift+Ctrl+S')
        new_save_action.setStatusTip('Save current file')
        new_save_action.triggered.connect(self.save_file_as)

        close_action = QAction('Close File', self)
        close_action.setShortcut('Ctrl+Q')
        close_action.setStatusTip('Close Notepad')
        close_action.triggered.connect(self.close)

        undo_action = QAction('Undo', self)
        undo_action.setShortcut('Ctrl+Z')

        copy_action = QAction('Copy', self)
        copy_action.setShortcut('Ctrl+C')

        cut_action = QAction('Cut', self)
        cut_action.setShortcut('Ctrl+X')

        paste_action = QAction('Paste', self)
        paste_action.setShortcut('Ctrl+V')

        minimize_action = QAction('Minimize', self)
        minimize_action.setShortcut('Ctrl+M')

        view_action = QAction('Show', self)
        view_action.setShortcut('Ctrl+/')

        menubar = self.menuBar()
        file_menu = menubar.addMenu('&File')
        edit_menu = menubar.addMenu('&Edit')
        view_menu = menubar.addMenu('&View')
        window_menu = menubar.addMenu('&Window')

        file_menu.addAction(new_action)
        file_menu.addAction(open_action)
        file_menu.addAction(save_action)
        file_menu.addAction(new_save_action)
        file_menu.addAction(close_action)

        edit_menu.addAction(undo_action)
        edit_menu.addAction(copy_action)
        edit_menu.addAction(cut_action)
        edit_menu.addAction(paste_action)

        view_menu.addAction(view_action)

        window_menu.addAction(minimize_action)

        self.text = QTextEdit(self)
        self.setCentralWidget(self.text)
        self.setGeometry(300, 300, 1324, 1068)
        self.setWindowTitle('Notepad')
        self.setStyleSheet('font-size: 14pt; font-family: Courier;')

        self.show()

    def new_file(self):
        self.text.clear()

    def save_file(self):
        if len(self.filenames) > 0:
            filename = self.filenames[0]
            f = open(filename, 'w')
            filedata = self.text.toPlainText()
            f.write(filedata)
            f.close()
        else:
            self.save_file_as()

    def save_file_as(self):
        filename = QFileDialog.getSaveFileName(
            self, 'Save File', os.getenv('HOME'))[0]
        print(filename)
        if filename != ('', ''):
            f = open(filename, 'w')
            filedata = self.text.toPlainText()
            f.write(filedata)
            f.close()

    def open_file(self):
        filename = QFileDialog.getOpenFileName(
            self, 'Open File', os.getenv('HOME'))[0]
        f = open(filename, 'r')
        filedata = f.read()
        self.text.setText(filedata)
        f.close()
        self.setWindowTitle(filename)
        self.filenames.append(filename)
Esempio n. 11
0
class Report(QMainWindow):

    def __init__(self):

        super(Report, self).__init__()
        self.status_view   = "window"
        self.status_colors = "light"
        self.font_size     = 22
        self.font_database = QFontDatabase()

        # add font cmtex9
        self.font_file_cmtex9 = "cmtex9.ttf"
        self.font_identifier_cmtex9 = QFontDatabase.addApplicationFont(
            self.font_file_cmtex9
        )
        self.fontFamilyName_cmtex9 = self.font_database.applicationFontFamilies(
            self.font_identifier_cmtex9
        )[0]
        self.update_font()

        self.initialise_UI()

    def update_font(self):

        # add font cmtex9
        self.font_cmtex9 = QFont(self.fontFamilyName_cmtex9, self.font_size)
        # add font Courier Prime
        self.font_CourierPrime = QFont("Courier Prime", self.font_size)
        # set default font
        self.font_current = self.font_cmtex9
        self.font_current.setFixedPitch(True)
        self.setFont(self.font_current)

    def initialise_UI(self):

        action_toggle_view = QAction("toggle view", self)
        action_toggle_view.setShortcut("F11")
        action_toggle_view.setStatusTip("toggle fullscreen/window view")
        action_toggle_view.triggered.connect(self.toggle_view)

        action_toggle_colors = QAction("toggle colors", self)
        action_toggle_colors.setShortcut("Ctrl+D")
        action_toggle_colors.setStatusTip("toggle light/dark colors")
        action_toggle_colors.triggered.connect(self.toggle_colors)

        action_set_font_size = QAction("set font size", self)
        action_set_font_size.setShortcut("Ctrl+T")
        action_set_font_size.setStatusTip("set font size")
        action_set_font_size.triggered.connect(self.set_font_size)

        action_new = QAction("new", self)
        action_new.setShortcut("Ctrl+N")
        action_new.setStatusTip("create new file")
        action_new.triggered.connect(self.new_file)

        action_save = QAction("save", self)
        action_save.setShortcut("Ctrl+S")
        action_save.setStatusTip("save current file")
        action_save.triggered.connect(self.save_file)

        action_open = QAction("open", self)
        action_open.setShortcut("Ctrl+O")
        action_open.setStatusTip("open a file")
        action_open.triggered.connect(self.open_file)

        action_close = QAction("close", self)
        action_close.setShortcut("Ctrl+W")
        action_close.setStatusTip("close report")
        action_close.triggered.connect(self.close)

        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("&file")
        file_menu.addAction(action_toggle_view)
        file_menu.addAction(action_toggle_colors)
        file_menu.addAction(action_set_font_size)
        file_menu.addAction(action_new)
        file_menu.addAction(action_save)
        file_menu.addAction(action_open)
        file_menu.addAction(action_close)

        self.text = QTextEdit(self)
        self.text.setStyleSheet(
            """
            QTextEdit{
                color: #000000;
                background-color: #ffffff;
            }
            """
        )

        self.setCentralWidget(self.text)
        self.setGeometry(300, 300, 300, 300)
        self.showMaximized()
        self.setWindowTitle("report")
        self.show()

    def toggle_view(self):

        if self.status_view == "window":

            self.showFullScreen()
            self.status_view = "fullscreen"

            return

        if self.status_view == "fullscreen":

            self.showMaximized()
            self.status_view = "window"

            return

    def toggle_colors(self):

        if self.status_colors == "light":

            self.text.setStyleSheet(
                """
                QTextEdit{
                    color: #ffffff;
                    background-color: #000000;
                }
                """
            )
            self.status_colors = "dark"

            return

        if self.status_colors == "dark":

            self.text.setStyleSheet(
                """
                QTextEdit{
                    color: #000000;
                    background-color: #ffffff;
                }
                """
            )
            self.status_colors = "light"

            return

    def set_font_size(self):

        font_size, ok = QInputDialog.getText(
            self,
            "font size", 
            "enter font size:"
        )
        if ok is True:
            self.font_size = int(font_size)
            self.update_font()

    def new_file(self):

        self.text.clear()

    def save_file(self):

        filename = QFileDialog.getSaveFileName(
            self,
            "save file",
            os.getenv("HOME")
        )[0]

        if filename != u"":

            with open(filename, "w") as file_save:
                file_data = self.text.toPlainText()
                file_save.write(file_data)

    def open_file(self):

        filename = QFileDialog.getOpenFileName(
            self,
            "open file",
            os.getenv("HOME")
        )[0]

        with open(filename, "r") as file_open:
            file_data = file_open.read()
            self.text.setText(file_data)
Esempio n. 12
0
class TextEdit(QMainWindow):
    def __init__(self, fileName=None, parent=None):
        super(TextEdit, self).__init__(parent)

        self.setWindowIcon(QIcon(':/images/logo.png'))
        self.setToolButtonStyle(Qt.ToolButtonFollowStyle)
        self.setupFileActions()
        self.setupEditActions()
        self.setupTextActions()

        helpMenu = QMenu("Help", self)
        self.menuBar().addMenu(helpMenu)
        helpMenu.addAction("About", self.about)
        helpMenu.addAction("About &Qt", QApplication.instance().aboutQt)
 
        self.textEdit = QTextEdit(self)
        self.textEdit.currentCharFormatChanged.connect(
                self.currentCharFormatChanged)
        self.textEdit.cursorPositionChanged.connect(self.cursorPositionChanged)
        self.setCentralWidget(self.textEdit)
        self.textEdit.setFocus()
        self.setCurrentFileName()
        self.fontChanged(self.textEdit.font())
        self.colorChanged(self.textEdit.textColor())
        self.alignmentChanged(self.textEdit.alignment())
        self.textEdit.document().modificationChanged.connect(
                self.actionSave.setEnabled)
        self.textEdit.document().modificationChanged.connect(
                self.setWindowModified)
        self.textEdit.document().undoAvailable.connect(
                self.actionUndo.setEnabled)
        self.textEdit.document().redoAvailable.connect(
                self.actionRedo.setEnabled)
        self.setWindowModified(self.textEdit.document().isModified())
        self.actionSave.setEnabled(self.textEdit.document().isModified())
        self.actionUndo.setEnabled(self.textEdit.document().isUndoAvailable())
        self.actionRedo.setEnabled(self.textEdit.document().isRedoAvailable())
        self.actionUndo.triggered.connect(self.textEdit.undo)
        self.actionRedo.triggered.connect(self.textEdit.redo)
        self.actionCut.setEnabled(False)
        self.actionCopy.setEnabled(False)
        self.actionCut.triggered.connect(self.textEdit.cut)
        self.actionCopy.triggered.connect(self.textEdit.copy)
        self.actionPaste.triggered.connect(self.textEdit.paste)
        self.textEdit.copyAvailable.connect(self.actionCut.setEnabled)
        self.textEdit.copyAvailable.connect(self.actionCopy.setEnabled)
        QApplication.clipboard().dataChanged.connect(self.clipboardDataChanged)

        if fileName is None:
            fileName = ':/example.html'

        if not self.load(fileName):
            self.fileNew()

    def closeEvent(self, e):
        if self.maybeSave():
            e.accept()
        else:
            e.ignore()

    def setupFileActions(self):
        tb = QToolBar(self)
        tb.setWindowTitle("File Actions")
        self.addToolBar(tb)

        menu = QMenu("&File", self)
        self.menuBar().addMenu(menu)

        self.actionNew = QAction(
                QIcon.fromTheme('document-new',
                        QIcon(rsrcPath + '/filenew.png')),
                "&New", self, priority=QAction.LowPriority,
                shortcut=QKeySequence.New, triggered=self.fileNew)
        tb.addAction(self.actionNew)
        menu.addAction(self.actionNew)

        self.actionOpen = QAction(
                QIcon.fromTheme('document-open',
                        QIcon(rsrcPath + '/fileopen.png')),
                "&Open...", self, shortcut=QKeySequence.Open,
                triggered=self.fileOpen)
        tb.addAction(self.actionOpen)
        menu.addAction(self.actionOpen)
        menu.addSeparator()

        self.actionSave = QAction(
                QIcon.fromTheme('document-save',
                        QIcon(rsrcPath + '/filesave.png')),
                "&Save", self, shortcut=QKeySequence.Save,
                triggered=self.fileSave, enabled=False)
        tb.addAction(self.actionSave)
        menu.addAction(self.actionSave)

        self.actionSaveAs = QAction("Save &As...", self,
                priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.SHIFT + Qt.Key_S,
                triggered=self.fileSaveAs)
        menu.addAction(self.actionSaveAs)
        menu.addSeparator()
 
        self.actionPrint = QAction(
                QIcon.fromTheme('document-print',
                        QIcon(rsrcPath + '/fileprint.png')),
                "&Print...", self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Print, triggered=self.filePrint)
        tb.addAction(self.actionPrint)
        menu.addAction(self.actionPrint)

        self.actionPrintPreview = QAction(
                QIcon.fromTheme('fileprint',
                        QIcon(rsrcPath + '/fileprint.png')),
                "Print Preview...", self,
                shortcut=Qt.CTRL + Qt.SHIFT + Qt.Key_P,
                triggered=self.filePrintPreview)
        menu.addAction(self.actionPrintPreview)

        self.actionPrintPdf = QAction(
                QIcon.fromTheme('exportpdf',
                        QIcon(rsrcPath + '/exportpdf.png')),
                "&Export PDF...", self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_D,
                triggered=self.filePrintPdf)
        tb.addAction(self.actionPrintPdf)
        menu.addAction(self.actionPrintPdf)
        menu.addSeparator()

        self.actionQuit = QAction("&Quit", self, shortcut=QKeySequence.Quit,
                triggered=self.close)
        menu.addAction(self.actionQuit)

    def setupEditActions(self):
        tb = QToolBar(self)
        tb.setWindowTitle("Edit Actions")
        self.addToolBar(tb)

        menu = QMenu("&Edit", self)
        self.menuBar().addMenu(menu)

        self.actionUndo = QAction(
                QIcon.fromTheme('edit-undo',
                        QIcon(rsrcPath + '/editundo.png')),
                "&Undo", self, shortcut=QKeySequence.Undo)
        tb.addAction(self.actionUndo)
        menu.addAction(self.actionUndo)

        self.actionRedo = QAction(
                QIcon.fromTheme('edit-redo',
                        QIcon(rsrcPath + '/editredo.png')),
                "&Redo", self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Redo)
        tb.addAction(self.actionRedo)
        menu.addAction(self.actionRedo)
        menu.addSeparator()

        self.actionCut = QAction(
                QIcon.fromTheme('edit-cut', QIcon(rsrcPath + '/editcut.png')),
                "Cu&t", self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Cut)
        tb.addAction(self.actionCut)
        menu.addAction(self.actionCut)

        self.actionCopy = QAction(
                QIcon.fromTheme('edit-copy',
                        QIcon(rsrcPath + '/editcopy.png')),
                "&Copy", self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Copy)
        tb.addAction(self.actionCopy)
        menu.addAction(self.actionCopy)

        self.actionPaste = QAction(
                QIcon.fromTheme('edit-paste',
                        QIcon(rsrcPath + '/editpaste.png')),
                "&Paste", self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Paste,
                enabled=(len(QApplication.clipboard().text()) != 0))
        tb.addAction(self.actionPaste)
        menu.addAction(self.actionPaste)

    def setupTextActions(self):
        tb = QToolBar(self)
        tb.setWindowTitle("Format Actions")
        self.addToolBar(tb)

        menu = QMenu("F&ormat", self)
        self.menuBar().addMenu(menu)

        self.actionTextBold = QAction(
                QIcon.fromTheme('format-text-bold',
                        QIcon(rsrcPath + '/textbold.png')),
                "&Bold", self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_B, triggered=self.textBold,
                checkable=True)
        bold = QFont()
        bold.setBold(True)
        self.actionTextBold.setFont(bold)
        tb.addAction(self.actionTextBold)
        menu.addAction(self.actionTextBold)

        self.actionTextItalic = QAction(
                QIcon.fromTheme('format-text-italic',
                        QIcon(rsrcPath + '/textitalic.png')),
                "&Italic", self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_I, triggered=self.textItalic,
                checkable=True)
        italic = QFont()
        italic.setItalic(True)
        self.actionTextItalic.setFont(italic)
        tb.addAction(self.actionTextItalic)
        menu.addAction(self.actionTextItalic)

        self.actionTextUnderline = QAction(
                QIcon.fromTheme('format-text-underline',
                        QIcon(rsrcPath + '/textunder.png')),
                "&Underline", self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_U, triggered=self.textUnderline,
                checkable=True)
        underline = QFont()
        underline.setUnderline(True)
        self.actionTextUnderline.setFont(underline)
        tb.addAction(self.actionTextUnderline)
        menu.addAction(self.actionTextUnderline)

        menu.addSeparator()

        grp = QActionGroup(self, triggered=self.textAlign)

        # Make sure the alignLeft is always left of the alignRight.
        if QApplication.isLeftToRight():
            self.actionAlignLeft = QAction(
                    QIcon.fromTheme('format-justify-left',
                            QIcon(rsrcPath + '/textleft.png')),
                    "&Left", grp)
            self.actionAlignCenter = QAction(
                    QIcon.fromTheme('format-justify-center',
                            QIcon(rsrcPath + '/textcenter.png')),
                    "C&enter", grp)
            self.actionAlignRight = QAction(
                    QIcon.fromTheme('format-justify-right',
                            QIcon(rsrcPath + '/textright.png')),
                    "&Right", grp)
        else:
            self.actionAlignRight = QAction(
                    QIcon.fromTheme('format-justify-right',
                            QIcon(rsrcPath + '/textright.png')),
                    "&Right", grp)
            self.actionAlignCenter = QAction(
                    QIcon.fromTheme('format-justify-center',
                            QIcon(rsrcPath + '/textcenter.png')),
                    "C&enter", grp)
            self.actionAlignLeft = QAction(
                    QIcon.fromTheme('format-justify-left',
                            QIcon(rsrcPath + '/textleft.png')),
                    "&Left", grp)
 
        self.actionAlignJustify = QAction(
                QIcon.fromTheme('format-justify-fill',
                        QIcon(rsrcPath + '/textjustify.png')),
                "&Justify", grp)

        self.actionAlignLeft.setShortcut(Qt.CTRL + Qt.Key_L)
        self.actionAlignLeft.setCheckable(True)
        self.actionAlignLeft.setPriority(QAction.LowPriority)

        self.actionAlignCenter.setShortcut(Qt.CTRL + Qt.Key_E)
        self.actionAlignCenter.setCheckable(True)
        self.actionAlignCenter.setPriority(QAction.LowPriority)

        self.actionAlignRight.setShortcut(Qt.CTRL + Qt.Key_R)
        self.actionAlignRight.setCheckable(True)
        self.actionAlignRight.setPriority(QAction.LowPriority)

        self.actionAlignJustify.setShortcut(Qt.CTRL + Qt.Key_J)
        self.actionAlignJustify.setCheckable(True)
        self.actionAlignJustify.setPriority(QAction.LowPriority)

        tb.addActions(grp.actions())
        menu.addActions(grp.actions())
        menu.addSeparator()

        pix = QPixmap(16, 16)
        pix.fill(Qt.black)
        self.actionTextColor = QAction(QIcon(pix), "&Color...", self,
                triggered=self.textColor)
        tb.addAction(self.actionTextColor)
        menu.addAction(self.actionTextColor)

        tb = QToolBar(self)
        tb.setAllowedAreas(Qt.TopToolBarArea | Qt.BottomToolBarArea)
        tb.setWindowTitle("Format Actions")
        self.addToolBarBreak(Qt.TopToolBarArea)
        self.addToolBar(tb)

        comboStyle = QComboBox(tb)
        tb.addWidget(comboStyle)
        comboStyle.addItem("Standard")
        comboStyle.addItem("Bullet List (Disc)")
        comboStyle.addItem("Bullet List (Circle)")
        comboStyle.addItem("Bullet List (Square)")
        comboStyle.addItem("Ordered List (Decimal)")
        comboStyle.addItem("Ordered List (Alpha lower)")
        comboStyle.addItem("Ordered List (Alpha upper)")
        comboStyle.addItem("Ordered List (Roman lower)")
        comboStyle.addItem("Ordered List (Roman upper)")
        comboStyle.activated.connect(self.textStyle)

        self.comboFont = QFontComboBox(tb)
        tb.addWidget(self.comboFont)
        self.comboFont.activated[str].connect(self.textFamily)

        self.comboSize = QComboBox(tb)
        self.comboSize.setObjectName("comboSize")
        tb.addWidget(self.comboSize)
        self.comboSize.setEditable(True)

        db = QFontDatabase()
        for size in db.standardSizes():
            self.comboSize.addItem("%s" % (size))

        self.comboSize.activated[str].connect(self.textSize)
        self.comboSize.setCurrentIndex(
                self.comboSize.findText(
                        "%s" % (QApplication.font().pointSize())))

    def load(self, f):
        if not QFile.exists(f):
            return False

        fh = QFile(f)
        if not fh.open(QFile.ReadOnly):
            return False

        data = fh.readAll()
        codec = QTextCodec.codecForHtml(data)
        unistr = codec.toUnicode(data)

        if Qt.mightBeRichText(unistr):
            self.textEdit.setHtml(unistr)
        else:
            self.textEdit.setPlainText(unistr)

        self.setCurrentFileName(f)
        return True

    def maybeSave(self):
        if not self.textEdit.document().isModified():
            return True

        if self.fileName.startswith(':/'):
            return True

        ret = QMessageBox.warning(self, "Application",
                "The document has been modified.\n"
                "Do you want to save your changes?",
                QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)

        if ret == QMessageBox.Save:
            return self.fileSave()

        if ret == QMessageBox.Cancel:
            return False

        return True

    def setCurrentFileName(self, fileName=''):
        self.fileName = fileName
        self.textEdit.document().setModified(False)

        if not fileName:
            shownName = 'untitled.txt'
        else:
            shownName = QFileInfo(fileName).fileName()

        self.setWindowTitle(self.tr("%s[*] - %s" % (shownName, "Rich Text")))
        self.setWindowModified(False)

    def fileNew(self):
        if self.maybeSave():
            self.textEdit.clear()
            self.setCurrentFileName()

    def fileOpen(self):
        fn, _ = QFileDialog.getOpenFileName(self, "Open File...", None,
                "HTML-Files (*.htm *.html);;All Files (*)")

        if fn:
            self.load(fn)

    def fileSave(self):
        if not self.fileName:
            return self.fileSaveAs()

        writer = QTextDocumentWriter(self.fileName)
        success = writer.write(self.textEdit.document())
        if success:
            self.textEdit.document().setModified(False)

        return success

    def fileSaveAs(self):
        fn, _ = QFileDialog.getSaveFileName(self, "Save as...", None,
                "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)")

        if not fn:
            return False

        lfn = fn.lower()
        if not lfn.endswith(('.odt', '.htm', '.html')):
            # The default.
            fn += '.odt'

        self.setCurrentFileName(fn)
        return self.fileSave()

    def filePrint(self):
        printer = QPrinter(QPrinter.HighResolution)
        dlg = QPrintDialog(printer, self)

        if self.textEdit.textCursor().hasSelection():
            dlg.addEnabledOption(QPrintDialog.PrintSelection)

        dlg.setWindowTitle("Print Document")

        if dlg.exec_() == QPrintDialog.Accepted:
            self.textEdit.print_(printer)

        del dlg

    def filePrintPreview(self):
        printer = QPrinter(QPrinter.HighResolution)
        preview = QPrintPreviewDialog(printer, self)
        preview.paintRequested.connect(self.printPreview)
        preview.exec_()

    def printPreview(self, printer):
        self.textEdit.print_(printer)

    def filePrintPdf(self):
        fn, _ = QFileDialog.getSaveFileName(self, "Export PDF", None,
                "PDF files (*.pdf);;All Files (*)")

        if fn:
            if QFileInfo(fn).suffix().isEmpty():
                fn += '.pdf'

            printer = QPrinter(QPrinter.HighResolution)
            printer.setOutputFormat(QPrinter.PdfFormat)
            printer.setOutputFileName(fn)
            self.textEdit.document().print_(printer)

    def textBold(self):
        fmt = QTextCharFormat()
        fmt.setFontWeight(self.actionTextBold.isChecked() and QFont.Bold or QFont.Normal)
        self.mergeFormatOnWordOrSelection(fmt)

    def textUnderline(self):
        fmt = QTextCharFormat()
        fmt.setFontUnderline(self.actionTextUnderline.isChecked())
        self.mergeFormatOnWordOrSelection(fmt)

    def textItalic(self):
        fmt = QTextCharFormat()
        fmt.setFontItalic(self.actionTextItalic.isChecked())
        self.mergeFormatOnWordOrSelection(fmt)

    def textFamily(self, family):
        fmt = QTextCharFormat()
        fmt.setFontFamily(family)
        self.mergeFormatOnWordOrSelection(fmt)

    def textSize(self, pointSize):
        pointSize = float(pointSize)
        if pointSize > 0:
            fmt = QTextCharFormat()
            fmt.setFontPointSize(pointSize)
            self.mergeFormatOnWordOrSelection(fmt)

    def textStyle(self, styleIndex):
        cursor = self.textEdit.textCursor()
        if styleIndex:
            styleDict = {
                1: QTextListFormat.ListDisc,
                2: QTextListFormat.ListCircle,
                3: QTextListFormat.ListSquare,
                4: QTextListFormat.ListDecimal,
                5: QTextListFormat.ListLowerAlpha,
                6: QTextListFormat.ListUpperAlpha,
                7: QTextListFormat.ListLowerRoman,
                8: QTextListFormat.ListUpperRoman,
            }

            style = styleDict.get(styleIndex, QTextListFormat.ListDisc)
            cursor.beginEditBlock()
            blockFmt = cursor.blockFormat()
            listFmt = QTextListFormat()

            if cursor.currentList():
                listFmt = cursor.currentList().format()
            else:
                listFmt.setIndent(blockFmt.indent() + 1)
                blockFmt.setIndent(0)
                cursor.setBlockFormat(blockFmt)

            listFmt.setStyle(style)
            cursor.createList(listFmt)
            cursor.endEditBlock()
        else:
            bfmt = QTextBlockFormat()
            bfmt.setObjectIndex(-1)
            cursor.mergeBlockFormat(bfmt)

    def textColor(self):
        col = QColorDialog.getColor(self.textEdit.textColor(), self)
        if not col.isValid():
            return

        fmt = QTextCharFormat()
        fmt.setForeground(col)
        self.mergeFormatOnWordOrSelection(fmt)
        self.colorChanged(col)

    def textAlign(self, action):
        if action == self.actionAlignLeft:
            self.textEdit.setAlignment(Qt.AlignLeft | Qt.AlignAbsolute)
        elif action == self.actionAlignCenter:
            self.textEdit.setAlignment(Qt.AlignHCenter)
        elif action == self.actionAlignRight:
            self.textEdit.setAlignment(Qt.AlignRight | Qt.AlignAbsolute)
        elif action == self.actionAlignJustify:
            self.textEdit.setAlignment(Qt.AlignJustify)

    def currentCharFormatChanged(self, format):
        self.fontChanged(format.font())
        self.colorChanged(format.foreground().color())

    def cursorPositionChanged(self):
        self.alignmentChanged(self.textEdit.alignment())

    def clipboardDataChanged(self):
        self.actionPaste.setEnabled(len(QApplication.clipboard().text()) != 0)

    def about(self):
        QMessageBox.about(self, "About", 
                "This example demonstrates Qt's rich text editing facilities "
                "in action, providing an example document for you to "
                "experiment with.")

    def mergeFormatOnWordOrSelection(self, format):
        cursor = self.textEdit.textCursor()
        if not cursor.hasSelection():
            cursor.select(QTextCursor.WordUnderCursor)

        cursor.mergeCharFormat(format)
        self.textEdit.mergeCurrentCharFormat(format)

    def fontChanged(self, font):
        self.comboFont.setCurrentIndex(
                self.comboFont.findText(QFontInfo(font).family()))
        self.comboSize.setCurrentIndex(
                self.comboSize.findText("%s" % font.pointSize()))
        self.actionTextBold.setChecked(font.bold())
        self.actionTextItalic.setChecked(font.italic())
        self.actionTextUnderline.setChecked(font.underline())

    def colorChanged(self, color):
        pix = QPixmap(16, 16)
        pix.fill(color)
        self.actionTextColor.setIcon(QIcon(pix))

    def alignmentChanged(self, alignment):
        if alignment & Qt.AlignLeft:
            self.actionAlignLeft.setChecked(True)
        elif alignment & Qt.AlignHCenter:
            self.actionAlignCenter.setChecked(True)
        elif alignment & Qt.AlignRight:
            self.actionAlignRight.setChecked(True)
        elif alignment & Qt.AlignJustify:
            self.actionAlignJustify.setChecked(True)
Esempio n. 13
0
class AddUI(QWidget):
	def __init__(self, socman):
		super(AddUI, self).__init__()

		# create objects;

		self.__ob_label_title = QLabel("Заголовок, название:")
		self.__ob_label_text = QLabel("Текст, описание:")

		self.__ob_vlay_main = QVBoxLayout()

		self.__ob_line_title = QLineEdit()
		self.__ob_line_text = QTextEdit()

		self.__ob_button_add = Button("Назад")

		self.__socman = socman

		self.buttonClicked = 0

		# config;

		self.setLayout(self.__ob_vlay_main)
		self.setFixedSize(400,250)

		self.__ob_vlay_main.addWidget(self.__ob_label_title)
		self.__ob_vlay_main.addWidget(self.__ob_line_title)
		self.__ob_vlay_main.addWidget(self.__ob_label_text)
		self.__ob_vlay_main.addWidget(self.__ob_line_text)
		self.__ob_vlay_main.addWidget(self.__ob_button_add)
		self.__ob_vlay_main.setContentsMargins(0, 0, 0, 0)

		self.__ob_button_add.setFixedHeight(50)
		self.__ob_button_add.clicked.connect(self.__onButtonClicked)

		self.__ob_line_text.setStyleSheet("background: rgb(200, 200, 200); border: none;")
		self.__ob_line_title.setStyleSheet("background: rgb(200, 200, 200); border: none;")
		self.__ob_line_title.setFixedHeight(30)
		self.__ob_line_title.textChanged.connect(self.__onLinesEdit)
		self.__ob_line_text.textChanged.connect(self.__onLinesEdit)

	def __onButtonClicked(self):
		if(self.__ob_button_add.text() == "<p align='center'>Назад"):
			self.buttonClicked()
		elif(self.__ob_button_add.text() == "<p align='center'>Добавить"):
			if(self.__socman.add(self.__ob_line_title.text(), self.__ob_line_text.toPlainText())):
				self.__ob_button_add.setCurrentText("Не добавлено!")
			else:
				self.__ob_line_text.clear()
				self.__ob_line_title.clear()
				self.buttonClicked()

	def __onLinesEdit(self):
		if(len(self.__ob_line_title.text())):
			count = 0
			for i in self.__socman.getDump():
				if(self.__ob_line_title.text().upper() != i.getTitle().upper()):
					count += 1
				if(count == len(self.__socman.getDump())):
					if(len(self.__ob_line_text.toPlainText())):
						self.__ob_button_add.setCurrentText("Добавить")
					else:
						self.__ob_button_add.setCurrentText("Назад")
				else:
					self.__ob_button_add.setCurrentText("Такая запись уже существует")
		else:
			self.__ob_button_add.setCurrentText("Назад")
Esempio n. 14
0
class Gui(QMainWindow):
    mainText = None
    mast = None
    tenants = None
    inc = None
    rowStore = None
    Gen = None
    gen = None
    mastInput = None
    keyNum = 1

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        app_icon = QIcon()
        app_icon.addFile("key.png", QSize(256, 256))
        self.setWindowIcon(app_icon)
        # open
        openFile = QAction('Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.fileOpen)
        # save
        saveFile = QAction('Save', self)
        saveFile.setShortcut('Ctrl+S')
        saveFile.setStatusTip('Save new File')
        saveFile.triggered.connect(self.fileSave)
        printAction = QAction("Print", self)
        printAction.triggered.connect(self.printSetup)
        # exit
        exitAction = QAction('Exit', self)
        exitAction.triggered.connect(self.closeEvent)
        # menu object
        menubar = self.menuBar()
        # file drop down
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openFile)
        fileMenu.addAction(saveFile)
        fileMenu.addAction(printAction)
        fileMenu.addAction(exitAction)
        # widgets
        grid = QGridLayout()
        horiz = QVBoxLayout()
        bigHoriz = QHBoxLayout()
        horizLayout = QHBoxLayout()
        window = QWidget()
        window.setLayout(bigHoriz)
        leftPane = QFormLayout()
        bigHoriz.addLayout(leftPane)
        bigHoriz.addLayout(horiz)
        self.setCentralWidget(window)
        btn = QPushButton('Generate', self)
        btn.clicked.connect(lambda: self.runGen())
        clearBtn = QPushButton("Clear", self)
        clearBtn.clicked.connect(self.clearList)
        self.mainText = QListWidget(self)
        self.mainText.itemSelectionChanged.connect(self.listItemClicked)
        self.mainText.setFont(
            QFontDatabase.systemFont(QFontDatabase.FixedFont))
        self.mastInput = []
        i = 0
        while i < 6:
            t = QLineEdit()
            t.setMaxLength(1)
            t.setAlignment(Qt.AlignHCenter)
            t.textChanged.connect(self.textInputed)
            self.mastInput.append(t)
            i = i + 1
        for e in self.mastInput:
            horizLayout.addWidget(e)
        self.mast = QLineEdit()
        self.tenants = QLineEdit()
        self.inc = QLineEdit()
        self.title = QLineEdit()
        self.title.setMinimumWidth(200)
        self.desc = QLineEdit()
        self.address = QLineEdit()
        self.contact = QLineEdit()
        self.phone = QLineEdit()
        self.email = QLineEdit()
        self.notes = QTextEdit()
        self.keyway = QLineEdit()
        label = QLabel("Master Cuts")
        incLabel = QLabel("Increment")
        tenantLabel = QLabel("Tenants")
        # add widgets to layouts
        leftPane.addRow(QLabel("Title"), self.title)
        leftPane.addRow(QLabel("Description"), self.desc)
        leftPane.addRow(QLabel("Keyway"), self.keyway)
        leftPane.addRow(QLabel("Address"), self.address)
        leftPane.addRow(QLabel("contact"), self.contact)
        leftPane.addRow(QLabel("Phone"), self.phone)
        leftPane.addRow(QLabel("Email"), self.email)
        leftPane.addRow(QLabel("Notes"), self.notes)
        grid.addWidget(incLabel, 3, 0)
        grid.addWidget(tenantLabel, 2, 0)
        grid.addWidget(label, 1, 0)
        grid.addWidget(btn, 0, 0)
        horiz.addWidget(self.mainText)
        horiz.addLayout(grid)
        # horiz.addLayout(horizLayout)
        grid.addWidget(clearBtn, 0, 1)
        grid.addWidget(self.tenants, 2, 1)
        grid.addWidget(self.inc, 3, 1)
        grid.addLayout(horizLayout, 1, 1)
        # window properties
        self.setGeometry(300, 300, 500, 425)
        self.setWindowTitle('PySchlageGen')
        self.show()

    def textInputed(self, string):
        if len(string) == 1:
            self.focusNextChild()

    def getGen(self):
        return self.gen

    def runGen(self):
        self.mainText.clear()
        self.keyNum = 1
        text = self.mast.text()
        mastCuts = []
        try:
            for e in self.mastInput:
                if e.text():
                    mastCuts.append(int(e.text()))
            tenants = int(self.tenants.text())
            inc = int(self.inc.text())
            mastCuts = list(map(int, mastCuts))
            self.gen = schlageGen()
            self.gen.addMasterKey(mastCuts)
            output = self.gen.genSystem(tenants, inc)
            self.displayKeys(output)
        except:
            pass

    def displayKeys(self, output):
        i = 0
        for o in output:
            if self.keyNum < 10:
                f = str(self.keyNum) + ":     "
            elif self.keyNum < 100:
                f = str(self.keyNum) + ":   "
            elif self.keyNum < 1000:
                f = str(self.keyNum) + ": "
            else:
                f = str(self.keyNum) + ":"
            for e in o:
                f = f + str(e) + " "
            item = QListWidgetItem(f)
            self.mainText.insertItem(i, item)
            i = i + 1
            self.keyNum = self.keyNum + 1

    def formatText(self, flist, space=True, inj=" "):
        out = ""
        for e in flist[:-1]:
            out = out + str(e)
            if space:
                out = out + inj
        out = out + str(flist[-1])
        return out

    def printSetup(self):
        if self.gen != None:
            printSetup = PrintSetup(self)
            printSetup.exec()
        else:
            QMessageBox.about(self, "Error","Please generate a system before printing.")

    def clearList(self):
        self.title.clear()
        self.desc.clear()
        self.address.clear()
        self.keyway.clear()
        self.contact.clear()
        self.phone.clear()
        self.email.clear()
        self.keyNum = 1
        self.notes.clear()
        self.mainText.clear()
        self.tenants.clear()
        self.inc.clear()
        for e in self.mastInput:
            e.clear()

    def listItemClicked(self):
        item = self.mainText.currentItem()
        flags = item.flags()
        if flags & Qt.ItemIsEnabled:
            if self.rowStore != None:
                self.mainText.takeItem(self.rowStore + 1)
                self.mainText.takeItem(self.rowStore + 1)
            tenCuts = self.gen.getSystem()[int(item.text().split(":")[0]) - 1]
            tenCuts = list(map(int, tenCuts))
            output = self.gen.bittingCalc(tenCuts)
            row = self.mainText.currentRow()
            self.rowStore = row
            flags = item.flags()
            flags ^= Qt.ItemIsEnabled
            item = QListWidgetItem("        " + self.formatText(output[0]))
            item.setFlags(flags)
            item2 = QListWidgetItem("        " + self.formatText(output[1]))
            item2.setFlags(flags)
            self.mainText.insertItem(row + 1, item)
            self.mainText.insertItem(row + 2, item2)

    def fileOpen(self):
        self.clearList()
        home = expanduser("~")
        fname = QFileDialog.getOpenFileName(self, 'Open file', home, "*.mks")
        data = None
        if fname[0] != '':
            with open(fname[0], 'r') as infile:
                data = infile.read()
            sys = data.split("`")
            self.gen = schlageGen()
            master = list(map(int, sys[0]))
            self.gen.addMasterKey(master)
            del sys[0]
            self.inc.setText(str(sys[0]))
            del sys[0]
            self.title.setText(str(sys[0]))
            del sys[0]
            self.desc.setText(str(sys[0]))
            del sys[0]
            self.keyway.setText(str(sys[0]))
            del sys[0]
            self.address.setText(str(sys[0]))
            del sys[0]
            self.contact.setText(str(sys[0]))
            del sys[0]
            self.phone.setText(str(sys[0]))
            del sys[0]
            self.email.setText(str(sys[0]))
            del sys[0]
            self.notes.setPlainText(str(sys[0]))
            del sys[0]
            self.gen.setTenants(sys)
            self.displayKeys(sys)
            i = 0
            while i < len(master):
                self.mastInput[i].setText(str(master[i]))
                i = i + 1
            self.tenants.setText(str(len(sys)))

    def fileSave(self):
        if self.gen != None:
            home = expanduser("~")
            fname = QFileDialog.getSaveFileName(self, 'Open file', home, "*.mks")
            if fname[0]:
                with open(fname[0], "w") as thefile:
                    thefile.write("%s`" % self.formatText(
                        self.gen.getMasterKey(), False))
                    thefile.write("%s`" % self.inc.text())
                    thefile.write("%s`" % self.title.text())
                    thefile.write("%s`" % self.desc.text())
                    thefile.write("%s`" % self.keyway.text())
                    thefile.write("%s`" % self.address.text())
                    thefile.write("%s`" % self.contact.text())
                    thefile.write("%s`" % self.phone.text())
                    thefile.write("%s`" % self.email.text())
                    thefile.write("%s`" % self.notes.toPlainText())
                    for e in self.gen.getSystem()[:-1]:
                        thefile.write("%s`" % self.formatText(e, False))
                    thefile.write("%s" % self.formatText(
                        self.gen.getSystem()[-1], False))
        else:
            QMessageBox.about(self, "Error","Please generate a system before saving.")

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            sys.exit()
        else:
            if event:
                event.ignore()
class TB_Tools(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("安信可TB模块烧录工具 " + __version__)

        # if not os.path.exists('aithinker.png'):
        #     tmp = open('aithinker.png', 'wb+')
        #     tmp.write(base64.b64decode(logo))
        #     tmp.close()

        self.setWindowIcon(QIcon("aithinker.png"))
        #self.setWindowFlags(Qt.FramelessWindowHint)
        self.resize(500, 300)
        self.layout = QVBoxLayout()

        self.tbox_log = QTextEdit()

        line_1 = QHBoxLayout()

        self.serial_cb = QComboBox()

        btn_refresh_p = QPushButton("刷新串口")
        btn_erase_fw = QPushButton("擦除固件")
        btn_erase_key = QPushButton("擦除Mesh Key")
        btn_erase_all = QPushButton("整片擦除")
        btn_rst_chip = QPushButton("复位芯片")
        btn_clean_scn = QPushButton("清空窗口")

        btn_refresh_p.clicked.connect(self.refresh_p_fn)
        btn_erase_fw.clicked.connect(lambda: self.erase_fn("fw"))
        btn_erase_key.clicked.connect(lambda: self.erase_fn("key"))
        btn_erase_all.clicked.connect(lambda: self.erase_fn("all"))

        btn_rst_chip.clicked.connect(self.rst_chip_fn)
        btn_clean_scn.clicked.connect(self.clean_screen_fn)

        line_1.addWidget(self.serial_cb)
        line_1.addWidget(btn_refresh_p)
        line_1.addWidget(btn_erase_fw)
        line_1.addWidget(btn_erase_key)
        line_1.addWidget(btn_erase_all)
        line_1.addWidget(btn_rst_chip)
        line_1.addWidget(btn_clean_scn)

        line_1.setContentsMargins(0, 0, 0, 0)

        line_2 = QHBoxLayout()

        self.tbox_file = QLineEdit()
        btn_open_file = QPushButton("···")
        btn_burn = QPushButton("烧录固件")

        btn_open_file.clicked.connect(self.open_file_fn)
        btn_burn.clicked.connect(self.burn_fn)

        line_2.addWidget(self.tbox_file)
        line_2.addWidget(btn_open_file)
        line_2.addWidget(btn_burn)

        line_2.setContentsMargins(0, 0, 0, 0)

        line_3 = QHBoxLayout()

        self.tbox_ali_pID = QLineEdit()
        self.tbox_ali_Mac = QLineEdit()
        self.tbox_ali_Sct = QLineEdit()

        self.tbox_ali_pID.setPlaceholderText("Product ID")
        self.tbox_ali_Mac.setPlaceholderText("MAC地址")
        self.tbox_ali_Sct.setPlaceholderText("Device Secret")

        btn_burn_triad = QPushButton("烧录三元组")
        btn_burn_triad.clicked.connect(self.burn_triad_fn)

        line_3.addWidget(self.tbox_ali_pID)
        line_3.addWidget(self.tbox_ali_Sct)
        line_3.addWidget(self.tbox_ali_Mac)
        line_3.addWidget(btn_burn_triad)

        line_3.setContentsMargins(0, 0, 0, 0)

        line_3.setStretch(0, 2)
        line_3.setStretch(1, 5)
        line_3.setStretch(2, 2)
        line_3.setStretch(3, 1)

        self.layout.addWidget(self.tbox_log)
        self.layout.addLayout(line_1)
        self.layout.addLayout(line_2)
        self.layout.addLayout(line_3)

        self.pbar = QProgressBar(self)
        self.layout.addWidget(self.pbar)

        self.setLayout(self.layout)
        self.refresh_p_fn()

    def refresh_p_fn(self):  #刷新串口号
        self.serial_cb.clear()
        plist = get_port_list()
        for i in range(0, len(plist)):
            plist_0 = list(plist[i])
            self.serial_cb.addItem(str(plist_0[0]))

    def clean_screen_fn(self):
        self.tbox_log.clear()
        self.tbox_log.setStyleSheet("background-color:white;")

    def erase_fn(self, action):  #擦除Flash
        if not len(self.serial_cb.currentText()) > 0:
            self.log_string("请选择串口号!!!")
            return

        args = argparse.Namespace()

        if action == "fw":
            args.addr = 0x4000
            args.len_t = 44

        elif action == "key":
            args.addr = 0x30000
            args.len_t = 16

        elif action == "all":
            args.addr = 0x4000
            args.len_t = 124

        self.mThread = TelinkThread(_port_name=self.serial_cb.currentText(),
                                    action="erase",
                                    args=args)

        self.mThread.pressbarSignal.connect(self.pressBar_refresh)
        self.mThread.textSignal.connect(self.log_string)
        self.mThread.start()

    def rst_chip_fn(self):  #复位新片
        if not len(self.serial_cb.currentText()) > 0:
            self.log_string("请选择串口号!!!")
            return

        args = argparse.Namespace()

        self.mThread = TelinkThread(_port_name=self.serial_cb.currentText(),
                                    action="reset",
                                    args=args)

        self.mThread.pressbarSignal.connect(self.pressBar_refresh)
        self.mThread.textSignal.connect(self.log_string)
        self.mThread.start()

    def open_file_fn(self):  #选择固件
        directory = QFileDialog.getOpenFileName(self, "选择要烧录的固件", '',
                                                "固件 (*.bin)")

        if len(str(directory[0])) > 5:
            self.tbox_file.setText(str(directory[0]))
            self.tbox_file.setStyleSheet("background-color:LightGreen;")

    def burn_fn(self):  #烧录固件
        if not len(self.tbox_file.text()) > 5:
            self.log_string("请选择要烧录的固件!!!")
            self.tbox_file.setStyleSheet("background-color:red;")
            return

        if not os.path.exists(self.tbox_file.text()):
            self.log_string("固件不存在!!!")
            self.tbox_file.setStyleSheet("background-color:red;")
            return

        if not len(self.serial_cb.currentText()) > 0:
            self.log_string("请选择串口号!!!")
            return

        args = argparse.Namespace()
        args.file_name = self.tbox_file.text()

        self.mThread = TelinkThread(_port_name=self.serial_cb.currentText(),
                                    action="burn",
                                    args=args)

        self.mThread.pressbarSignal.connect(self.pressBar_refresh)
        self.mThread.textSignal.connect(self.log_string)
        self.mThread.start()

    def burn_triad_fn(self):  #烧录三元组
        try:
            data = struct.pack('<I', int(
                self.tbox_ali_pID.text())) + bytearray.fromhex(
                    self.tbox_ali_Mac.text()) + bytearray.fromhex(
                        self.tbox_ali_Sct.text())
        except Exception:
            self.log_string("三元组格式错误!!!")
            return

        if (len(data) != 26):
            self.log_string("三元组长度不对!!!")
            return

        if not len(self.serial_cb.currentText()) > 0:
            self.log_string("请选择串口号!!!")
            return

        args = argparse.Namespace()
        args.triad = data

        self.mThread = TelinkThread(_port_name=self.serial_cb.currentText(),
                                    action="burn_triad",
                                    args=args)

        self.mThread.pressbarSignal.connect(self.pressBar_refresh)
        self.mThread.textSignal.connect(self.log_string)
        self.mThread.start()

    def log_string(self, s):  #Log窗口日志输出
        self.tbox_log.append(s)

    def pressBar_refresh(self, a):  #刷新进度条及Log串口颜色
        if a < 101:
            self.pbar.setValue(a)

        if (a == 100):
            self.tbox_log.setStyleSheet("background-color:LawnGreen;")

        if (a == 200):
            self.tbox_log.setStyleSheet("background-color:red;")

        if (a == 1000):
            self.tbox_log.setStyleSheet("background-color:white;")
            self.pbar.setValue(0)
Esempio n. 16
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.filter_le = QLineEdit()
        self.filter_le.setPlaceholderText('Enter for search regexp...')
        self.filter_le.textEdited.connect(self.fill)

        self.table_dossier = get_table_widget(["TITLE"])
        self.table_dossier.itemClicked.connect(self._on_table_dossier_item_clicked)

        self.table_items = get_table_widget(["CONTENT"])
        self.table_items.itemClicked.connect(self._on_table_items_item_clicked)

        self.question_te = QTextEdit()
        self.answer_te = QTextEdit()

        self.dossier_title = _get_line_edit('-')
        self.dossier_url = _get_line_edit('-')
        self.dossier_date = QLabel('-')
        self.dossier_total_items = QLabel('-')

        central_content_widget = QWidget()
        central_content_widget.setLayout(QGridLayout())
        central_content_widget.layout().addWidget(QLabel('Title:'), 0, 0)
        central_content_widget.layout().addWidget(self.dossier_title, 0, 1)
        central_content_widget.layout().addWidget(QLabel('Url:'), 1, 0)
        central_content_widget.layout().addWidget(self.dossier_url, 1, 1)
        central_content_widget.layout().addWidget(QLabel('Date:'), 2, 0)
        central_content_widget.layout().addWidget(self.dossier_date, 2, 1)
        central_content_widget.layout().addWidget(QLabel('Total items:'), 3, 0)
        central_content_widget.layout().addWidget(self.dossier_total_items, 3, 1)
        central_content_widget.layout().addWidget(self.table_items, 4, 0, 1, 2)

        right_splitter = QSplitter(Qt.Vertical)
        right_splitter.addWidget(_get_field_widget('Question:', self.question_te))
        right_splitter.addWidget(_get_field_widget('Answer:', self.answer_te))

        main_splitter = QSplitter(Qt.Horizontal)
        main_splitter.addWidget(self.table_dossier)
        main_splitter.addWidget(central_content_widget)
        main_splitter.addWidget(right_splitter)

        main_layout = QVBoxLayout()
        main_layout.addWidget(self.filter_le)
        main_layout.addWidget(main_splitter)

        self.setCentralWidget(QWidget())
        self.centralWidget().setLayout(main_layout)

    def _get_search_pattern(self):
        search_text = self.filter_le.text()
        try:
            return re.compile(search_text, flags=re.IGNORECASE)
        except:
            pass

    def fill(self):
        # Удаление строк таблицы
        while self.table_dossier.rowCount():
            self.table_dossier.removeRow(0)

        items = Dossier.select()

        search_text = self.filter_le.text()
        pattern = self._get_search_pattern()
        if search_text and pattern:
            new_items = []
            for dossier in items:
                found = False
                for x in dossier.items:
                    if pattern.search(x.question_text) or pattern.search(x.question_text):
                        found = True
                        break
                if found:
                    new_items.append(dossier)

            items = new_items

        for i, dossier in enumerate(items):
            self.table_dossier.setRowCount(self.table_dossier.rowCount() + 1)

            item = QTableWidgetItem(dossier.title)
            item.setData(Qt.UserRole, dossier)
            self.table_dossier.setItem(i, 0, item)

        self.table_dossier.setCurrentCell(0, 0)
        self._on_table_dossier_item_clicked()

    def _on_table_dossier_item_clicked(self):
        # Удаление строк таблицы
        while self.table_items.rowCount():
            self.table_items.removeRow(0)

        self.question_te.clear()
        self.answer_te.clear()

        item = self.table_dossier.currentItem()
        if not item:
            return

        dossier = item.data(Qt.UserRole)

        self.dossier_title.setText(dossier.title)
        self.dossier_url.setText(dossier.url)
        self.dossier_date.setText(str(dossier.date))
        self.dossier_total_items.setText(str(len(dossier.items)))

        items = dossier.items

        search_text = self.filter_le.text()
        pattern = self._get_search_pattern()
        if search_text and pattern:
            items = [x for x in items if pattern.search(x.question_text) or pattern.search(x.answer_text)]

        for i, question_answer_pairs in enumerate(items):
            self.table_items.setRowCount(self.table_items.rowCount() + 1)

            question_text = question_answer_pairs.question_text
            answer_text = question_answer_pairs.answer_text
            title = shorten(question_text) + ' | ' + shorten(answer_text)

            item = QTableWidgetItem(title)
            item.setData(Qt.UserRole, question_answer_pairs)
            self.table_items.setItem(i, 0, item)

        self.table_items.setCurrentCell(0, 0)
        self._on_table_items_item_clicked()

    def _on_table_items_item_clicked(self):
        item = self.table_items.currentItem()
        if not item:
            return

        question_answer_pairs = item.data(Qt.UserRole)
        question_text = question_answer_pairs.question_text
        answer_text = question_answer_pairs.answer_text

        search_text = self.filter_le.text()
        pattern = self._get_search_pattern()
        if search_text and pattern:
            question_text = pattern.sub(lambda m: f'<b>{m.group()}</b>', question_text)
            answer_text = pattern.sub(lambda m: f'<b>{m.group()}</b>', answer_text)

        self.question_te.setText(question_text)
        self.answer_te.setText(answer_text)
Esempio n. 17
0
class TermWidget(QWidget):
    """Widget wich represents terminal. It only displays text and allows to enter text.
    All highlevel logic should be implemented by client classes
    """

    def __init__(self, font, *args):
        QWidget.__init__(self, *args)
        self._browser = QTextEdit(self)
        self._browser.setReadOnly(True)
        document = self._browser.document()
        document.setDefaultStyleSheet(document.defaultStyleSheet() +
                                      "span {white-space:pre;}")

        self._browser.setFont(font)
        self._edit = _TextEdit(self, font)

        lowLevelWidget = self._edit.focusProxy()
        if lowLevelWidget is None:
            lowLevelWidget = self._edit
        lowLevelWidget.installEventFilter(self)

        self._edit.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
        self.setFocusProxy(self._edit)

        layout = QVBoxLayout(self)
        layout.setSpacing(0)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self._browser)
        layout.addWidget(self._edit)

        self._history = ['']  # current empty line
        self._historyIndex = 0

        self._edit.setFocus()

    def terminate(self):
        self._edit.terminate()

    def eventFilter(self, obj, event):
        pass  # suppress docsting for non-public method
        """QWidget.eventFilter implementation. Catches _edit key pressings. Processes some of them
        """
        if event.type() == QEvent.KeyPress:
            if event.matches(QKeySequence.MoveToNextLine):
                if self._edit.cursorPosition[0] == (len(self._edit.lines) - 1):
                    self._onHistoryNext()
                    return True
            elif event.matches(QKeySequence.MoveToPreviousLine):
                if self._edit.cursorPosition[0] == 0:
                    self._onHistoryPrev()
                    return True
            elif event.matches(QKeySequence.MoveToNextPage) or \
                    event.matches(QKeySequence.MoveToPreviousPage):
                self._browser.keyPressEvent(event)
                return True
            elif event.matches(QKeySequence.InsertParagraphSeparator):
                return self._editNewLineEvent()

        return QWidget.eventFilter(self, obj, event)

    def _appendToBrowser(self, style, text):
        """Convert text to HTML for inserting it to browser. Insert the HTML
        """
        text = html.escape(text)

        text = text.replace('\n', '<br/>')

        defBg = self._browser.palette().color(QPalette.Base)

        h, s, v, a = defBg.getHsvF()

        if style == 'out':
            pass
        elif style == 'in':
            if v > 0.5:  # white background
                v = v - (v / 8)  # make darker
            else:
                v = v + ((1 - v) / 4)  # make ligher
        elif style == 'err':
            if v < 0.5:  # dark background
                v = v + ((1 - v) / 4)  # make ligher

            h = 0
            s = .4
        elif style == 'hint':
            if v < 0.5:  # dark background
                v = v + ((1 - v) / 4)  # make ligher

            h = 0.33
            s = .4
        else:
            assert 0

        bg = QColor.fromHsvF(h, s, v)
        text = '<span style="background-color: %s;">%s</span>' % (bg.name(), text)

        scrollBar = self._browser.verticalScrollBar()
        oldValue = scrollBar.value()

        if False:
            # hlamer: It seems, it is more comfortable, if text is always scrolled
            scrollAtTheEnd = oldValue == scrollBar.maximum()
        else:
            scrollAtTheEnd = True

        self._browser.moveCursor(QTextCursor.End)
        self._browser.insertHtml(text)

        if scrollAtTheEnd:
            scrollBar.setValue(scrollBar.maximum())
        else:
            scrollBar.setValue(oldValue)

        while self._browser.document().characterCount() > 1024 * 1024:
            cursor = self._browser.cursorForPosition(QPoint(0, 0))
            cursor.select(cursor.LineUnderCursor)
            if not cursor.selectedText():
                cursor.movePosition(cursor.Down, cursor.KeepAnchor)
                cursor.movePosition(cursor.EndOfLine, cursor.KeepAnchor)
            cursor.removeSelectedText()

    def setLanguage(self, language):
        """Set highlighting language for input widget
        """
        self._edit.detectSyntax(language=language)

    def execCommand(self, text):
        """Save current command in the history. Append it to the log. Execute child's method. Clear edit line.
        """
        self._appendToBrowser('in', text + '\n')

        if len(self._history) < 2 or\
           self._history[-2] != text:  # don't insert duplicating items
            self._history.insert(-1, text)

        self._historyIndex = len(self._history) - 1

        self._history[-1] = ''
        self._edit.text = ''

        if not text.endswith('\n'):
            text += '\n'

        self.childExecCommand(text)

    def childExecCommand(self, text):
        """Reimplement in the child classes to execute enterred commands
        """
        pass

    def appendOutput(self, text):
        """Appent text to output widget
        """
        self._appendToBrowser('out', text)

    def appendError(self, text):
        """Appent error text to output widget. Text is drawn with red background
        """
        self._appendToBrowser('err', text)

    def appendHint(self, text):
        """Appent error text to output widget. Text is drawn with red background
        """
        self._appendToBrowser('hint', text)

    def clear(self):
        """Clear the widget"""
        self._browser.clear()

    def isCommandComplete(self, text):
        """Executed when Enter is pressed to check if widget should execute the command, or insert newline.

        Implement this function in the child classes.
        """
        return True

    def _editNewLineEvent(self):
        """Handler of Enter pressing in the edit
        """
        text = self._edit.text

        if self.isCommandComplete(text):
            self.execCommand(text)
            return True  # processing finished
        else:
            return False  # let the editor process the event

    def _onHistoryNext(self):
        """Down pressed, show next item from the history
        """
        if (self._historyIndex + 1) < len(self._history):
            self._historyIndex += 1
            self._edit.text = self._history[self._historyIndex]
            self._edit.absCursorPosition = len(self._edit.text)

    def _onHistoryPrev(self):
        """Up pressed, show previous item from the history
        """
        if self._historyIndex > 0:
            if self._historyIndex == (len(self._history) - 1):
                self._history[-1] = self._edit.text
            self._historyIndex -= 1
            self._edit.text = self._history[self._historyIndex]
            self._edit.absCursorPosition = len(self._edit.text)
Esempio n. 18
0
class AddressBook(QWidget):
	NavigationMode, AddingMode, EditingMode = range(3)

	def __init__(self, parent=None):
		super(AddressBook, self).__init__(parent)

		self.contacts = SortedDict()
		self.oldName = ''
		self.oldAddress = ''
		self.currentMode = self.NavigationMode

		nameLabel = QLabel("Name:")
		self.nameLine = QLineEdit()
		self.nameLine.setReadOnly(True)

		addressLabel = QLabel("Address:")
		self.addressText = QTextEdit()
		self.addressText.setReadOnly(True)

		self.addButton = QPushButton("&Add")
		self.addButton.show()
		self.editButton = QPushButton("&Edit")
		self.editButton.setEnabled(False)
		self.removeButton = QPushButton("&Remove")
		self.removeButton.setEnabled(False)
		self.findButton = QPushButton("&Find")
		self.findButton.setEnabled(False)
		self.submitButton = QPushButton("&Submit")
		self.submitButton.hide()
		self.cancelButton = QPushButton("&Cancel")
		self.cancelButton.hide()

		self.nextButton = QPushButton("&Next")
		self.nextButton.setEnabled(False)
		self.previousButton = QPushButton("&Previous")
		self.previousButton.setEnabled(False)

		self.loadButton = QPushButton("&Load...")
		self.loadButton.setToolTip("Load contacts from a file")
		self.saveButton = QPushButton("Sa&ve...")
		self.saveButton.setToolTip("Save contacts to a file")
		self.saveButton.setEnabled(False)

		self.exportButton = QPushButton("Ex&port")
		self.exportButton.setToolTip("Export as vCard")
		self.exportButton.setEnabled(False)

		self.dialog = FindDialog()

		self.addButton.clicked.connect(self.addContact)
		self.submitButton.clicked.connect(self.submitContact)
		self.editButton.clicked.connect(self.editContact)
		self.removeButton.clicked.connect(self.removeContact)
		self.findButton.clicked.connect(self.findContact)
		self.cancelButton.clicked.connect(self.cancel)
		self.nextButton.clicked.connect(self.next)
		self.previousButton.clicked.connect(self.previous)
		self.loadButton.clicked.connect(self.loadFromFile)
		self.saveButton.clicked.connect(self.saveToFile)
		self.exportButton.clicked.connect(self.exportAsVCard)

		buttonLayout1 = QVBoxLayout()
		buttonLayout1.addWidget(self.addButton)
		buttonLayout1.addWidget(self.editButton)
		buttonLayout1.addWidget(self.removeButton)
		buttonLayout1.addWidget(self.findButton)
		buttonLayout1.addWidget(self.submitButton)
		buttonLayout1.addWidget(self.cancelButton)
		buttonLayout1.addWidget(self.loadButton)
		buttonLayout1.addWidget(self.saveButton)
		buttonLayout1.addWidget(self.exportButton)
		buttonLayout1.addStretch()

		buttonLayout2 = QHBoxLayout()
		buttonLayout2.addWidget(self.previousButton)
		buttonLayout2.addWidget(self.nextButton)

		mainLayout = QGridLayout()
		mainLayout.addWidget(nameLabel, 0, 0)
		mainLayout.addWidget(self.nameLine, 0, 1)
		mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
		mainLayout.addWidget(self.addressText, 1, 1)
		mainLayout.addLayout(buttonLayout1, 1, 2)
		mainLayout.addLayout(buttonLayout2, 2, 1)

		self.setLayout(mainLayout)
		self.setWindowTitle("Simple Address Book")

	def addContact(self):
		self.oldName = self.nameLine.text()
		self.oldAddress = self.addressText.toPlainText()

		self.nameLine.clear()
		self.addressText.clear()

		self.updateInterface(self.AddingMode)

	def editContact(self):
		self.oldName = self.nameLine.text()
		self.oldAddress = self.addressText.toPlainText()

		self.updateInterface(self.EditingMode)

	def submitContact(self):
		name = self.nameLine.text()
		address = self.addressText.toPlainText()

		if name == "" or address == "":
			QMessageBox.information(self, "Empty Field",
					"Please enter a name and address.")
			return

		if self.currentMode == self.AddingMode:
			if name not in self.contacts:
				self.contacts[name] = address
				QMessageBox.information(self, "Add Successful",
						"\"%s\" has been added to your address book." % name)
			else:
				QMessageBox.information(self, "Add Unsuccessful",
						"Sorry, \"%s\" is already in your address book." % name)
				return

		elif self.currentMode == self.EditingMode:
			if self.oldName != name:
				if name not in self.contacts:
					QMessageBox.information(self, "Edit Successful",
							"\"%s\" has been edited in your address book." % self.oldName)
					del self.contacts[self.oldName]
					self.contacts[name] = address
				else:
					QMessageBox.information(self, "Edit Unsuccessful",
							"Sorry, \"%s\" is already in your address book." % name)
					return
			elif self.oldAddress != address:
				QMessageBox.information(self, "Edit Successful",
						"\"%s\" has been edited in your address book." % name)
				self.contacts[name] = address

		self.updateInterface(self.NavigationMode)

	def cancel(self):
		self.nameLine.setText(self.oldName)
		self.addressText.setText(self.oldAddress)
		self.updateInterface(self.NavigationMode)

	def removeContact(self):
		name = self.nameLine.text()
		address = self.addressText.toPlainText()

		if name in self.contacts:
			button = QMessageBox.question(self, "Confirm Remove",
					"Are you sure you want to remove \"%s\"?" % name,
					QMessageBox.Yes | QMessageBox.No)

			if button == QMessageBox.Yes:
				self.previous()
				del self.contacts[name]

				QMessageBox.information(self, "Remove Successful",
						"\"%s\" has been removed from your address book." % name)

		self.updateInterface(self.NavigationMode)

	def next(self):
		name = self.nameLine.text()
		it = iter(self.contacts)

		try:
			while True:
				this_name, _ = it.next()

				if this_name == name:
					next_name, next_address = it.next()
					break
		except StopIteration:
			next_name, next_address = iter(self.contacts).next()

		self.nameLine.setText(next_name)
		self.addressText.setText(next_address)

	def previous(self):
		name = self.nameLine.text()

		prev_name = prev_address = None
		for this_name, this_address in self.contacts:
			if this_name == name:
				break

			prev_name = this_name
			prev_address = this_address
		else:
			self.nameLine.clear()
			self.addressText.clear()
			return

		if prev_name is None:
			for prev_name, prev_address in self.contacts:
				pass

		self.nameLine.setText(prev_name)
		self.addressText.setText(prev_address)

	def findContact(self):
		self.dialog.show()

		if self.dialog.exec_() == QDialog.Accepted:
			contactName = self.dialog.getFindText()

			if contactName in self.contacts:
				self.nameLine.setText(contactName)
				self.addressText.setText(self.contacts[contactName])
			else:
				QMessageBox.information(self, "Contact Not Found",
						"Sorry, \"%s\" is not in your address book." % contactName)
				return

		self.updateInterface(self.NavigationMode)

	def updateInterface(self, mode):
		self.currentMode = mode

		if self.currentMode in (self.AddingMode, self.EditingMode):
			self.nameLine.setReadOnly(False)
			self.nameLine.setFocus(Qt.OtherFocusReason)
			self.addressText.setReadOnly(False)

			self.addButton.setEnabled(False)
			self.editButton.setEnabled(False)
			self.removeButton.setEnabled(False)

			self.nextButton.setEnabled(False)
			self.previousButton.setEnabled(False)

			self.submitButton.show()
			self.cancelButton.show()

			self.loadButton.setEnabled(False)
			self.saveButton.setEnabled(False)
			self.exportButton.setEnabled(False)

		elif self.currentMode == self.NavigationMode:
			if not self.contacts:
				self.nameLine.clear()
				self.addressText.clear()

			self.nameLine.setReadOnly(True)
			self.addressText.setReadOnly(True)
			self.addButton.setEnabled(True)

			number = len(self.contacts)
			self.editButton.setEnabled(number >= 1)
			self.removeButton.setEnabled(number >= 1)
			self.findButton.setEnabled(number > 2)
			self.nextButton.setEnabled(number > 1)
			self.previousButton.setEnabled(number >1 )

			self.submitButton.hide()
			self.cancelButton.hide()

			self.exportButton.setEnabled(number >= 1)

			self.loadButton.setEnabled(True)
			self.saveButton.setEnabled(number >= 1)

	def saveToFile(self):
		fileName, _ = QFileDialog.getSaveFileName(self, "Save Address Book",
				'', "Address Book (*.abk);;All Files (*)")

		if not fileName:
			return

		try:
			out_file = open(str(fileName), 'wb')
		except IOError:
			QMessageBox.information(self, "Unable to open file",
					"There was an error opening \"%s\"" % fileName)
			return

		pickle.dump(self.contacts, out_file)
		out_file.close()

	def loadFromFile(self):
		fileName, _ = QFileDialog.getOpenFileName(self, "Open Address Book",
				'', "Address Book (*.abk);;All Files (*)")

		if not fileName:
			return

		try:
			in_file = open(str(fileName), 'rb')
		except IOError:
			QMessageBox.information(self, "Unable to open file",
					"There was an error opening \"%s\"" % fileName)
			return

		self.contacts = pickle.load(in_file)
		in_file.close()

		if len(self.contacts) == 0:
			QMessageBox.information(self, "No contacts in file",
					"The file you are attempting to open contains no "
					"contacts.")
		else:
			for name, address in self.contacts:
				self.nameLine.setText(name)
				self.addressText.setText(address)

		self.updateInterface(self.NavigationMode)

	def exportAsVCard(self):
		name = str(self.nameLine.text())
		address = self.addressText.toPlainText()

		nameList = name.split()

		if len(nameList) > 1:
			firstName = nameList[0]
			lastName = nameList[-1]
		else:
			firstName = name
			lastName = ''

		fileName, _ = QFileDialog.getSaveFileName(self, "Export Contact", '',
				"vCard Files (*.vcf);;All Files (*)")

		if not fileName:
			return

		out_file = QFile(fileName)

		if not out_file.open(QIODevice.WriteOnly):
			QMessageBox.information(self, "Unable to open file",
					out_file.errorString())
			return

		out_s = QTextStream(out_file)

		out_s << 'BEGIN:VCARD' << '\n'
		out_s << 'VERSION:2.1' << '\n'
		out_s << 'N:' << lastName << ';' << firstName << '\n'
		out_s << 'FN:' << ' '.join(nameList) << '\n'

		address.replace(';', '\\;')
		address.replace('\n', ';')
		address.replace(',', ' ')

		out_s << 'ADR;HOME:;' << address << '\n'
		out_s << 'END:VCARD' << '\n'

		QMessageBox.information(self, "Export Successful",
				"\"%s\" has been exported as a vCard." % name)
Esempio n. 19
0
class MainWindow(QMainWindow):
    def __init__(self):
        self.settings = QSettings("yayachiken", "PyMorsetrainer")
        if self.settings.value("currentLesson") is not None:
            self.lesson = int(self.settings.value("currentLesson"))
        else:
            self.lesson = 1
            self.settings.setValue("currentLesson", 1)
        
        self.requireNewExercise = False
        self.mp = None
        self.thread = None

        super().__init__()
        self.initUI()
        self.generateExercise()
        
    def initUI(self):
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.receivedTextEdit = QTextEdit()
        self.receivedTextEdit.setAcceptRichText(False)
        monospaceFont = QFont("Monospace")
        monospaceFont.setStyleHint(QFont.Monospace)
        self.receivedTextEdit.setFont(monospaceFont)
        
        playExerciseButton = QPushButton("Play exercise text")
        playExerciseButton.clicked.connect(self.playExercise)
        
        stopButton = QPushButton("Stop playing")
        stopButton.clicked.connect(self.stopPlaying)
        
        validateButton = QPushButton("Check input / Generate next exercise")
        validateButton.clicked.connect(self.checkInput)
        
        self.wpmLineEdit = QLineEdit("20")
        wpmLabel = QLabel("WPM")
        
        self.ewpmLineEdit = QLineEdit("15")
        ewpmLabel = QLabel("effective WPM")
        
        self.freqLineEdit = QLineEdit("800")
        freqLabel = QLabel("Frequency (Hz)")
        
        self.durationLineEdit = QLineEdit("1")
        durationLabel = QLabel("Duration (min)")
        
        lessonBox = QHBoxLayout()
        lessonBox.setAlignment(Qt.AlignLeft)
        
        lessonCombo = QComboBox()
        lessonCombo.setMaximumWidth(75)
        lessonCombo.addItem("1 - K M")
        for lesson in range(2, len(KOCH_LETTERS)):
            lessonCombo.addItem(str(lesson) + " - " + KOCH_LETTERS[lesson])
        lessonCombo.setCurrentIndex(self.lesson-1)
        lessonCombo.currentIndexChanged.connect(self.newLessonSelected)
        
        lessonIdLabel = QLabel("Lesson:")
        lessonIdLabel.setMaximumWidth(50)
        
        self.lessonLabel = QLabel(' '.join(KOCH_LETTERS[:self.lesson+1]))
        lessonBox.addWidget(lessonIdLabel)
        lessonBox.addWidget(lessonCombo)
        lessonBox.addWidget(self.lessonLabel)
        
        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.receivedTextEdit, 1, 1, 7, 1)
        grid.addWidget(playExerciseButton, 1, 2, 1, 2)
        grid.addWidget(stopButton, 2, 2, 1, 2)
        grid.addWidget(validateButton, 3, 2, 1, 2)
        grid.addWidget(self.wpmLineEdit, 4, 2)
        grid.addWidget(wpmLabel, 4, 3)
        grid.addWidget(self.ewpmLineEdit, 5, 2)
        grid.addWidget(ewpmLabel, 5, 3)
        grid.addWidget(self.freqLineEdit, 6, 2)
        grid.addWidget(freqLabel, 6, 3)
        grid.addWidget(self.durationLineEdit, 7, 2)
        grid.addWidget(durationLabel, 7, 3)
        grid.addLayout(lessonBox, 8, 1, 1, 3)
        
        self.centralWidget.setLayout(grid)
        
        self.setWindowTitle('PyMorsetrainer')
        self.show()
        
    def closeEvent(self, event):
        self.stopPlaying()
        
        
    def playExercise(self):
        if self.requireNewExercise == True:
            self.generateExercise()
        wpm = int(self.wpmLineEdit.text())
        effectiveWpm = int(self.ewpmLineEdit.text())
        frequency = int(self.freqLineEdit.text())
        self.mp = MorsePlayer(self.morse_solution, wpm, effectiveWpm, frequency)
        self.mp.start()
    
    def stopPlaying(self):
        if self.mp is not None:
            self.mp.shutdown()
    
    def newLessonSelected(self, comboId):
        self.lesson = comboId+1
        self.settings.setValue("currentLesson", self.lesson)
        self.lessonLabel.setText(' '.join(KOCH_LETTERS[:self.lesson+1]))
        self.requireNewExercise = True
        
    def generateExercise(self):
        letters = KOCH_LETTERS[:self.lesson+1]
        wpm = int(self.wpmLineEdit.text())
        effectiveWpm = int(self.ewpmLineEdit.text())
        frequency = int(self.freqLineEdit.text())
        duration = int(self.durationLineEdit.text())
        
        mc = MorseCode("")
        
        while mc.tally_length_in_seconds(wpm, effectiveWpm) < duration * 60:
            new_word = ""
            for _ in range(0, 5):
                new_word += (random.choice(letters))
            mc.set_morse_text(mc.get_morse_text() + " " + new_word)
        self.requireNewExercise = False
        self.morse_solution = mc.get_morse_text()
        print(self.morse_solution)
        
    def checkInput(self):
        self.evalWindow = EvaluationWindow(self.receivedTextEdit.toPlainText().upper(), self.morse_solution)
        self.evalWindow.setModal(True)
        self.evalWindow.show()
        self.requireNewExercise = True
        self.receivedTextEdit.clear()
Esempio n. 20
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.createDockWindows()

        self.setWindowTitle("Dock Widgets")

        self.newLetter()

    def newLetter(self):
        self.textEdit.clear()

        cursor = self.textEdit.textCursor()
        cursor.movePosition(QTextCursor.Start)
        topFrame = cursor.currentFrame()
        topFrameFormat = topFrame.frameFormat()
        topFrameFormat.setPadding(16)
        topFrame.setFrameFormat(topFrameFormat)

        textFormat = QTextCharFormat()
        boldFormat = QTextCharFormat()
        boldFormat.setFontWeight(QFont.Bold)
        italicFormat = QTextCharFormat()
        italicFormat.setFontItalic(True)

        tableFormat = QTextTableFormat()
        tableFormat.setBorder(1)
        tableFormat.setCellPadding(16)
        tableFormat.setAlignment(Qt.AlignRight)
        cursor.insertTable(1, 1, tableFormat)
        cursor.insertText("The Firm", boldFormat)
        cursor.insertBlock()
        cursor.insertText("321 City Street", textFormat)
        cursor.insertBlock()
        cursor.insertText("Industry Park")
        cursor.insertBlock()
        cursor.insertText("Some Country")
        cursor.setPosition(topFrame.lastPosition())
        cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"),
                          textFormat)
        cursor.insertBlock()
        cursor.insertBlock()
        cursor.insertText("Dear ", textFormat)
        cursor.insertText("NAME", italicFormat)
        cursor.insertText(",", textFormat)
        for i in range(3):
            cursor.insertBlock()
        cursor.insertText("Yours sincerely,", textFormat)
        for i in range(3):
            cursor.insertBlock()
        cursor.insertText("The Boss", textFormat)
        cursor.insertBlock()
        cursor.insertText("ADDRESS", italicFormat)

    def print_(self):
        document = self.textEdit.document()
        printer = QPrinter()

        dlg = QPrintDialog(printer, self)
        if dlg.exec_() != QDialog.Accepted:
            return

        document.print_(printer)

        self.statusBar().showMessage("Ready", 2000)

    def save(self):
        filename, _ = QFileDialog.getSaveFileName(self, "Choose a file name",
                                                  '.', "HTML (*.html *.htm)")
        if not filename:
            return

        file = QFile(filename)
        if not file.open(QFile.WriteOnly | QFile.Text):
            QMessageBox.warning(
                self, "Dock Widgets",
                "Cannot write file %s:\n%s." % (filename, file.errorString()))
            return

        out = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        out << self.textEdit.toHtml()
        QApplication.restoreOverrideCursor()

        self.statusBar().showMessage("Saved '%s'" % filename, 2000)

    def undo(self):
        document = self.textEdit.document()
        document.undo()

    def insertCustomer(self, customer):
        if not customer:
            return
        customerList = customer.split(', ')
        document = self.textEdit.document()
        cursor = document.find('NAME')
        if not cursor.isNull():
            cursor.beginEditBlock()
            cursor.insertText(customerList[0])
            oldcursor = cursor
            cursor = document.find('ADDRESS')
            if not cursor.isNull():
                for i in customerList[1:]:
                    cursor.insertBlock()
                    cursor.insertText(i)
                cursor.endEditBlock()
            else:
                oldcursor.endEditBlock()

    def addParagraph(self, paragraph):
        if not paragraph:
            return
        document = self.textEdit.document()
        cursor = document.find("Yours sincerely,")
        if cursor.isNull():
            return
        cursor.beginEditBlock()
        cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor,
                            2)
        cursor.insertBlock()
        cursor.insertText(paragraph)
        cursor.insertBlock()
        cursor.endEditBlock()

    def about(self):
        QMessageBox.about(
            self, "About Dock Widgets",
            "The <b>Dock Widgets</b> example demonstrates how to use "
            "Qt's dock widgets. You can enter your own text, click a "
            "customer to add a customer name and address, and click "
            "standard paragraphs to add them.")

    def createActions(self):
        self.newLetterAct = QAction(QIcon(':/images/new.png'),
                                    "&New Letter",
                                    self,
                                    shortcut=QKeySequence.New,
                                    statusTip="Create a new form letter",
                                    triggered=self.newLetter)

        self.saveAct = QAction(QIcon(':/images/save.png'),
                               "&Save...",
                               self,
                               shortcut=QKeySequence.Save,
                               statusTip="Save the current form letter",
                               triggered=self.save)

        self.printAct = QAction(QIcon(':/images/print.png'),
                                "&Print...",
                                self,
                                shortcut=QKeySequence.Print,
                                statusTip="Print the current form letter",
                                triggered=self.print_)

        self.undoAct = QAction(QIcon(':/images/undo.png'),
                               "&Undo",
                               self,
                               shortcut=QKeySequence.Undo,
                               statusTip="Undo the last editing action",
                               triggered=self.undo)

        self.quitAct = QAction("&Quit",
                               self,
                               shortcut="Ctrl+Q",
                               statusTip="Quit the application",
                               triggered=self.close)

        self.aboutAct = QAction("&About",
                                self,
                                statusTip="Show the application's About box",
                                triggered=self.about)

        self.aboutQtAct = QAction("About &Qt",
                                  self,
                                  statusTip="Show the Qt library's About box",
                                  triggered=QApplication.instance().aboutQt)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newLetterAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.printAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.quitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.undoAct)

        self.viewMenu = self.menuBar().addMenu("&View")

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newLetterAct)
        self.fileToolBar.addAction(self.saveAct)
        self.fileToolBar.addAction(self.printAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.undoAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def createDockWindows(self):
        dock = QDockWidget("Customers", self)
        dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
        self.customerList = QListWidget(dock)
        self.customerList.addItems(
            ("John Doe, Harmony Enterprises, 12 Lakeside, Ambleton",
             "Jane Doe, Memorabilia, 23 Watersedge, Beaton",
             "Tammy Shea, Tiblanka, 38 Sea Views, Carlton",
             "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal",
             "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston",
             "Sally Hobart, Tiroli Tea, 67 Long River, Fedula"))
        dock.setWidget(self.customerList)
        self.addDockWidget(Qt.RightDockWidgetArea, dock)
        self.viewMenu.addAction(dock.toggleViewAction())

        dock = QDockWidget("Paragraphs", self)
        self.paragraphsList = QListWidget(dock)
        self.paragraphsList.addItems(
            ("Thank you for your payment which we have received today.",
             "Your order has been dispatched and should be with you within "
             "28 days.",
             "We have dispatched those items that were in stock. The rest of "
             "your order will be dispatched once all the remaining items "
             "have arrived at our warehouse. No additional shipping "
             "charges will be made.",
             "You made a small overpayment (less than $5) which we will keep "
             "on account for you, or return at your request.",
             "You made a small underpayment (less than $1), but we have sent "
             "your order anyway. We'll add this underpayment to your next "
             "bill.",
             "Unfortunately you did not send enough money. Please remit an "
             "additional $. Your order will be dispatched as soon as the "
             "complete amount has been received.",
             "You made an overpayment (more than $5). Do you wish to buy more "
             "items, or should we return the excess to you?"))
        dock.setWidget(self.paragraphsList)
        self.addDockWidget(Qt.RightDockWidgetArea, dock)
        self.viewMenu.addAction(dock.toggleViewAction())

        self.customerList.currentTextChanged.connect(self.insertCustomer)
        self.paragraphsList.currentTextChanged.connect(self.addParagraph)
Esempio n. 21
0
class MainWindow(QMainWindow):
    def __init__(self):
        self.settings = QSettings("yayachiken", "PyMorsetrainer")
        if not self.settings.allKeys():
            print("Initializing application settings...")
            self.settings.setValue("currentLesson", "1")
            self.settings.setValue("wpm", "20")
            self.settings.setValue("effectiveWpm", "15")
            self.settings.setValue("frequency", "800")
            self.settings.setValue("duration", "1")
        
        self.requireNewExercise = False
        self.mp = None
        self.lessonButtons = []
        self.debug = False

        super().__init__()
        self.initUI()
        self.generateExercise()
        
    def initUI(self):
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.receivedTextEdit = QTextEdit()
        self.receivedTextEdit.setAcceptRichText(False)
        monospaceFont = QFont("Monospace")
        monospaceFont.setStyleHint(QFont.Monospace)
        self.receivedTextEdit.setFont(monospaceFont)
        
        playExerciseButton = QPushButton("Play exercise text")
        playExerciseButton.clicked.connect(self.playExercise)
        
        stopButton = QPushButton("Stop playing")
        stopButton.clicked.connect(self.stopPlaying)
        
        validateButton = QPushButton("Check input / Generate next exercise")
        validateButton.clicked.connect(self.checkInput)
        
        self.wpmLineEdit = QLineEdit(self.settings.value("wpm"))
        self.wpmLineEdit.textChanged.connect(functools.partial(self.saveChangedText, self.wpmLineEdit, "wpm"))
        wpmLabel = QLabel("WPM")
        
        self.ewpmLineEdit = QLineEdit(self.settings.value("effectiveWpm"))
        self.ewpmLineEdit.textChanged.connect(functools.partial(self.saveChangedText, self.ewpmLineEdit, "effectiveWpm"))
        ewpmLabel = QLabel("effective WPM")
        
        self.freqLineEdit = QLineEdit(self.settings.value("frequency"))
        self.freqLineEdit.textChanged.connect(functools.partial(self.saveChangedText, self.freqLineEdit, "frequency"))
        freqLabel = QLabel("Frequency (Hz)")
        
        self.durationLineEdit = QLineEdit(self.settings.value("duration"))
        self.durationLineEdit.textChanged.connect(functools.partial(self.saveChangedText, self.durationLineEdit, "duration"))
        durationLabel = QLabel("Duration (min)")
        
        self.lessonGrid = QGridLayout()
        
        lessonCombo = QComboBox()
        lessonCombo.setStyleSheet("combobox-popup: 0;")
        lessonCombo.addItem("1 - K M")
        for lesson in range(2, len(KOCH_LETTERS)):
            lessonCombo.addItem(str(lesson) + " - " + KOCH_LETTERS[lesson])
        lessonCombo.setCurrentIndex(int(self.settings.value("currentLesson"))-1)
        lessonCombo.currentIndexChanged.connect(self.newLessonSelected)
        
        lessonIdLabel = QLabel("Lesson:")
        
        lessonBox = QHBoxLayout()
        lessonBox.addWidget(lessonIdLabel)
        lessonBox.addWidget(lessonCombo)
        lessonBox.addStretch(-1)

        self.createLessonLetterButtons(self.lessonGrid)
        
        mainLayout = QVBoxLayout()

        inputAndParameters = QHBoxLayout()
        parameterField = QVBoxLayout()
        inputAndParameters.addWidget(self.receivedTextEdit, stretch=1)
        self.receivedTextEdit.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.MinimumExpanding))
        inputAndParameters.addLayout(parameterField, stretch=0)

        parameterField.addWidget(playExerciseButton)
        parameterField.addWidget(stopButton)
        parameterField.addWidget(validateButton)

        parameterGrid = QGridLayout()
        parameterGrid.addWidget(self.wpmLineEdit, 0, 0)
        parameterGrid.addWidget(wpmLabel, 0, 1)
        parameterGrid.addWidget(self.ewpmLineEdit, 1, 0)
        parameterGrid.addWidget(ewpmLabel, 1, 1)
        parameterGrid.addWidget(self.freqLineEdit, 2, 0)
        parameterGrid.addWidget(freqLabel, 2, 1)
        parameterGrid.addWidget(self.durationLineEdit, 3, 0)
        parameterGrid.addWidget(durationLabel, 3, 1)
        parameterField.addLayout(parameterGrid)
        parameterField.insertSpacing(-1, 15)
        parameterField.addLayout(lessonBox)
        parameterField.insertStretch(-1)

        mainLayout.addLayout(inputAndParameters)
        mainLayout.addLayout(self.lessonGrid)
        
        self.centralWidget.setLayout(mainLayout)
        
        self.setWindowTitle('PyMorsetrainer')
        self.show()
        
    def closeEvent(self, event):
        self.stopPlaying()

    def createLessonLetterButtons(self, parentGrid):
        newButtonCount = int(self.settings.value("currentLesson")) + 1
        oldButtonCount = len(self.lessonButtons)

        if oldButtonCount > newButtonCount:
            for button in self.lessonButtons[newButtonCount:]:
                parentGrid.removeWidget(button)
                button.deleteLater()
            self.lessonButtons = self.lessonButtons[:newButtonCount]
        else:
            for idx, letter in enumerate(KOCH_LETTERS[oldButtonCount:newButtonCount]):
                idx = idx + oldButtonCount
                button = QToolButton()
                button.setText(letter)
                button.clicked.connect(functools.partial(self.playMorse, letter))
                buttonPolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed, QSizePolicy.PushButton)
                buttonPolicy.setHorizontalStretch(0)
                button.setSizePolicy(buttonPolicy)
                button.setMinimumWidth(5)
                parentGrid.addWidget(button, 1 + int(idx / 12), int(idx % 12))
                self.lessonButtons.append(button)
        
    def playMorse(self, text):
        if self.mp is not None:
            self.mp.shutdown()
        wpm = int(self.settings.value("wpm"))
        effectiveWpm = int(self.settings.value("effectiveWpm"))
        frequency = int(self.settings.value("frequency"))
        self.mp = MorsePlayer(text, wpm, effectiveWpm, frequency)
        self.mp.start()

    def playExercise(self):
        if self.requireNewExercise == True:
            self.generateExercise()
        self.playMorse(self.morse_solution)
    
    def stopPlaying(self):
        if self.mp is not None:
            self.mp.shutdown()
    
    def newLessonSelected(self, comboId):
        newLesson = comboId + 1
        self.settings.setValue("currentLesson", newLesson)
        self.createLessonLetterButtons(self.lessonGrid)
        self.requireNewExercise = True
        
    def generateExercise(self):
        lesson = int(self.settings.value("currentLesson"))
        letters = KOCH_LETTERS[:lesson+1]
        wpm = int(self.wpmLineEdit.text())
        effectiveWpm = int(self.ewpmLineEdit.text())
        frequency = int(self.freqLineEdit.text())
        duration = int(self.durationLineEdit.text())
        
        mc = MorseCode("")
        
        while mc.tally_length_in_seconds(wpm, effectiveWpm) < duration * 60:
            new_word = ""
            for _ in range(0, 5):
                new_word += (random.choice(letters))
            mc.set_morse_text(mc.get_morse_text() + " " + new_word)
        self.requireNewExercise = False
        self.morse_solution = mc.get_morse_text()
        if self.debug:
            print(self.morse_solution)
        
    def checkInput(self):
        self.evalWindow = EvaluationWindow(self.receivedTextEdit.toPlainText().upper(), self.morse_solution)
        self.evalWindow.setModal(True)
        self.evalWindow.show()
        self.requireNewExercise = True
        self.receivedTextEdit.clear()

    def saveChangedText(self, inputField, settingName):
        self.settings.setValue(settingName, inputField.text())

    def enableDebugMode():
        self.debug = True
Esempio n. 22
0
class WriteWeekly(QWidget):
	def __init__(self):
		super().__init__()
		self.initUI()

	def initUI(self):
		self.setGeometry(400, 100, 600, 500)
		self.setWindowTitle('发送邮件')

		#需要使用嵌套布局,整体是垂直布局(网格布局+水平布局),水平布局放两个按钮
		self.wwg = QWidget(self)
		self.wlayout = QVBoxLayout(self.wwg)
		self.creatGridLayout()
		self.createHLayout()

		self.wlayout.addLayout(self.grid)
		self.wlayout.addLayout(self.hlayout)

		self.setLayout(self.wlayout)

	def creatGridLayout(self):
		self.grid = QGridLayout()
		self.receiverLabel = QLabel('收件人:', self)
		self.receiverEdit = QLineEdit(self)
		self.subjectLabel = QLabel('主题:', self)
		self.subjectEdit = QLineEdit(self)
		self.fileLabel = QLabel('附件:', self)
		self.fileBtn = QPushButton('选择文件', self)
		self.fileBtn.clicked.connect(self.selectFile)
		self.contentLabel = QLabel('内容:', self)
		self.contentEdit = QTextEdit(self)
		self.receiverEdit.setFont(QFont('Microsoft YaHei UI', 11))
		self.subjectEdit.setFont(QFont('Microsoft YaHei UI', 11))
		self.contentEdit.setFont(QFont('Microsoft YaHei UI', 11))
		#设置网格间的距离
		self.grid.setSpacing(10)
		self.grid.addWidget(self.receiverLabel, 1, 0)
		self.grid.addWidget(self.receiverEdit, 1, 1)
		self.grid.addWidget(self.subjectLabel, 2, 0)
		self.grid.addWidget(self.subjectEdit, 2, 1)
		self.grid.addWidget(self.fileLabel, 3, 0)
		self.grid.addWidget(self.fileBtn, 3, 1)
		self.grid.addWidget(self.contentLabel, 4, 0)
		self.grid.addWidget(self.contentEdit, 4, 1, 20,1)

	def createHLayout(self):
		self.hlayout = QHBoxLayout()
		self.sendBtn = QPushButton('发送', self)
		self.cancelBtn = QPushButton('取消', self)
		self.cancelBtn.clicked.connect(self.close)

		self.hlayout.addStretch(3)
		self.hlayout.addWidget(self.sendBtn)
		self.hlayout.addStretch(1)
		self.hlayout.addWidget(self.cancelBtn)
		self.hlayout.addStretch(3)

	def selectFile(self):
		self.filename, _ = QFileDialog.getOpenFileName(self)
		self.fileBtn.setText(self.filename)

	def showDialog(self):
		self.show()
	
	# 关闭窗口时提醒
	def closeEvent(self, event):
		reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
		if reply == QMessageBox.Yes:
			event.accept()        
		else:
			event.ignore()

	def sendEmail(self):
		# 登录邮箱
		yag = yagmail.SMTP(user = '******', password = '******', host = 'xxxx.com', port = 'xxx', smtp_starttls = False)
		# 收件人,允许多个收件人,用;隔开
		to = self.receiverEdit.text().split(';')
		# 主题
		subject = self.subjectEdit.text()
		# 附件
		files = self.fileBtn.text()
		if files == '选择文件':
			files = ''
		# 内容
		contents = self.contentEdit.toPlainText()
		# 发送(to:收件人,subject:邮箱主题,contents: 邮箱内容,附件:contents = [contents, 'C://Users//Desktop//log.txt'])
		yag.send(to = to, subject = subject, contents = [contents, files])
		print('%s\n %s\n %s\n %s\n' % (to, subject, files, contents))
		# 发送成功后清空文本内容
		QMessageBox.about(self, '结果', '发送成功')
		self.receiverEdit.clear()
		self.subjectEdit.clear()
		self.contentEdit.clear()
		self.fileBtn.setText('选择文件')
Esempio n. 23
0
class Example(QWidget):
	def __init__(self):
		super().__init__()
		self.initUI()

	def initUI(self):
		mainBox = QVBoxLayout()
		fileBox = QHBoxLayout()
		menuBox = QHBoxLayout()
		resBox = QHBoxLayout()
		self.outEdit = QTextEdit()
		toolBox = QVBoxLayout()

		mainBox.addLayout(fileBox)
		mainBox.addLayout(menuBox)
		mainBox.addLayout(resBox)
		resBox.addWidget(self.outEdit)
		resBox.addLayout(toolBox)

		openFileBtn = QPushButton('1.选择文件')
		self.fileNameEdit = QLineEdit()
		parseFileBtn = QPushButton('2.开始解析')
		fileBox.addWidget(openFileBtn)
		fileBox.addWidget(self.fileNameEdit)
		fileBox.addWidget(parseFileBtn)

		label1 = QLabel('3.筛选:')
		levelLabel = QLabel('log级别')
		self.levelCombo = QComboBox()
		self.levelCombo.setMinimumWidth(100)
		modLabel = QLabel('log模块')
		self.modCombo = QComboBox()
		self.modCombo.setMinimumWidth(100)
		funLabel = QLabel('功能')
		self.funCombo = QComboBox()
		self.funCombo.setMinimumWidth(100)
		menuBox.addWidget(label1)
		menuBox.addWidget(levelLabel)
		menuBox.addWidget(self.levelCombo)
		menuBox.addSpacing(15)
		menuBox.addWidget(modLabel)
		menuBox.addWidget(self.modCombo)
		menuBox.addSpacing(15)
		menuBox.addWidget(funLabel)
		menuBox.addWidget(self.funCombo)
		menuBox.addStretch()

		toolBtn1 = QPushButton('复制')
		toolBtn2 = QPushButton('保存')
		toolBtn3 = QPushButton('')
		toolBtn4 = QPushButton('')
		self.statusLabel = QLabel('')
		toolBox.addWidget(toolBtn1)
		toolBox.addWidget(toolBtn2)
		# toolBox.addWidget(toolBtn3)
		# toolBox.addWidget(toolBtn4)
		toolBox.addStretch()
		toolBox.addWidget(self.statusLabel)

		self.setLayout(mainBox)

		# 按钮连接到槽
		openFileBtn.clicked.connect(self.open_file)
		parseFileBtn.clicked.connect(self.parse_file)

		self.levelCombo.activated.connect(self.show_lines)
		self.modCombo.activated.connect(self.show_lines)
		self.funCombo.activated.connect(self.show_lines)

		toolBtn1.clicked.connect(self.copy_result)
		toolBtn2.clicked.connect(self.save_result)

		self.setGeometry(200, 300, 700, 500)
		self.setWindowTitle('log解析工具')
		self.show()

	def open_file(self):
		file = QFileDialog.getOpenFileName(self, '选择log文件', '')
		filename = file[0]
		self.fileNameEdit.setText(filename)

	def parse_file(self):
		self.please_wait()
		filename = self.fileNameEdit.text()

		start = time.time() # 计时开始

		self.L = plo.Parser(filename)
		for line_no in range(0,self.L.lines): # 遍历所有log
			try:
				self.L.parse_log_level(line_no) # log级别
				self.L.parse_log_mod(line_no) # log模块
				self.L.parse_log_all_func(line_no) # 其他功能
			except Exception as e:
				print(e)
			if line_no%1000 == 0 or line_no == self.L.lines - 1: # 每100行和最后一行执行一次刷新,可大大加快解析速度!
				self.outEdit.setText('解析中,请等待...('+str(line_no)+'/'+str(self.L.lines)+')')
				QApplication.processEvents()

		end = time.time() # 计时结束

		# log级别
		log_levels = self.L.get_levels()
		self.levelCombo.clear()
		self.levelCombo.addItem('全部')
		self.levelCombo.addItems(log_levels.keys())

		# log模块
		log_mods = self.L.get_mods()
		self.modCombo.clear()
		self.modCombo.addItem('全部')
		self.modCombo.addItems(log_mods.keys())

		# log功能
		log_funcs = self.L.get_funcs()
		self.funCombo.clear()
		self.funCombo.addItem('全部')
		self.funCombo.addItems(log_funcs.keys())

		# 输出结果
		print_log = ''
		print_log += '解析时间:%.2fs\n' % (end-start)
		print_log += ('各级别log统计结果:\n')
		for level_name in log_levels.keys():
			print_log += (level_name + ': ' + str(len(log_levels.get(level_name, []))) + '\n')
		print_log += '\n'
		print_log += ('各模块log统计结果:\n')
		for mod_name in log_mods.keys():
			print_log += (mod_name + ': ' + str(len(log_mods.get(mod_name, []))) + '\n')
		print_log += '\n'
		print_log += ('各功能统计结果:\n')
		for func_name in log_funcs.keys():
			print_log += (func_name + ': ' + str(len(log_funcs.get(func_name, []))) + '\n')
		self.parse_result = print_log # 保存解析结果
		self.outEdit.setText(print_log)

	def show_lines(self):
		'''
		筛选框操作后,显示结果
		'''
		selLevel = self.levelCombo.currentText()
		selMod = self.modCombo.currentText()
		selFun = self.funCombo.currentText()

		if(selLevel == '全部' and selMod == '全部' and selFun == '全部'): # 不要显示全部log
			self.outEdit.setText(self.parse_result)
			return

		self.please_wait()

		if (selLevel != '全部'):
			resLevel = self.L.get_log_lines(selLevel)

		if (selMod != '全部'):
			resMod = self.L.get_log_lines(selMod)

		if (selFun != '全部'):
			resFun = self.L.get_log_lines(selFun)

		# 逐行显示
		self.outEdit.clear()
		lines_num = 0
		for i in range(0, self.L.lines):
			if (selLevel != '全部' and i not in resLevel): # 不满足等级筛选条件
				continue
			if (selMod != '全部' and i not in resMod): # 不满足模块筛选条件
				continue
			if (selFun != '全部' and i not in resFun): # 不满足功能筛选条件
				continue
			# i满足所有筛选条件
			self.outEdit.moveCursor(QTextCursor.End) # 使用insertPlainText需保证cursor在末尾
			self.outEdit.insertPlainText(self.L.log[i])
			lines_num = lines_num + 1
			self.show_status('当前' + str(lines_num) + '条')
			QApplication.processEvents()
		self.show_status('共' + str(lines_num) + '条')

	def please_wait(self):
		self.outEdit.setText('解析中,请等待...')
		QApplication.processEvents()
		self.show_status('')

	def show_status(self, status):
		self.statusLabel.setText(status)
		QApplication.processEvents()

	def copy_result(self):
		clipboard = QApplication.clipboard()
		clipboard.setText(self.outEdit.toPlainText())
		self.show_status('复制成功')

	def save_result(self):
		file = QFileDialog.getSaveFileName(self, '保存log文件', '')
		filename = file[0]
		try:
			with open(filename, 'w+') as f:
				result = self.outEdit.toPlainText()
				f.write(result)
			self.show_status('保存成功')
		except Exception as e:
			print(e)
			self.show_status('保存失败')
Esempio n. 24
0
class MainWindow(QWidget):
    
    def __init__(self, parent, masternode_list, imgDir):
        super(QWidget, self).__init__(parent)
        self.parent = parent
        self.imgDir = imgDir 
        self.runInThread = ThreadFuns.runInThread
        ###-- Masternode list 
        self.masternode_list = masternode_list      
        ###-- Create clients and statuses
        self.hwdevice = None
        self.hwStatus = 0
        self.hwStatusMess = "Not Connected"
        self.rpcClient = None
        self.rpcConnected = False
        self.rpcStatusMess = "Not Connected"
        self.isBlockchainSynced = False      
        ###-- Load icons & images
        self.loadIcons()        
        ###-- Create main layout
        self.layout = QVBoxLayout()
        self.header = GuiHeader(self)
        self.initConsole()
        self.layout.addWidget(self.header)       
        ###-- Create RPC Whatchdog
        self.rpc_watchdogThread = QThread()
        self.myRpcWd = RpcWatchdog(self)
        self.myRpcWd.moveToThread(self.rpc_watchdogThread)
        self.rpc_watchdogThread.started.connect(self.myRpcWd.run)
        self.rpc_watchdogThread.start()       
        
        ###-- Create Queues and redirect stdout and stderr (eventually)
        self.queue = Queue()
        self.queue2 = Queue()
        sys.stdout = WriteStream(self.queue)
        sys.stderr = WriteStream(self.queue2)  
      
        
        ###-- Init last logs
        logFile = open(log_File, 'w+')
        timestamp = strftime('%Y-%m-%d %H:%M:%S', gmtime(now()))
        log_line = '<b style="color: blue">{}</b><br>'.format('STARTING SPMT at '+ timestamp)
        logFile.write(log_line)
        logFile.close()
        
        ###-- Create the thread to update console log for stdout
        self.consoleLogThread = QThread()
        self.myWSReceiver = WriteStreamReceiver(self.queue)
        self.myWSReceiver.mysignal.connect(self.append_to_console)
        self.myWSReceiver.moveToThread(self.consoleLogThread)
        self.consoleLogThread.started.connect(self.myWSReceiver.run)
        self.consoleLogThread.start()
        printDbg("Console Log thread started")       
        ###-- Create the thread to update console log for stderr
        self.consoleLogThread2 = QThread()
        self.myWSReceiver2 = WriteStreamReceiver(self.queue2)
        self.myWSReceiver2.mysignal.connect(self.append_to_console)
        self.myWSReceiver2.moveToThread(self.consoleLogThread2)
        self.consoleLogThread2.started.connect(self.myWSReceiver2.run)
        self.consoleLogThread2.start()
        printDbg("Console Log thread 2 started")       
        ###-- Initialize tabs
        self.tabs = QTabWidget()
        self.t_main = TabMain(self)
        self.t_mnconf = TabMNConf(self)
        self.t_rewards = TabRewards(self)
        ###-- Add tabs
        self.tabs.addTab(self.tabMain, "Masternode Control")
        #self.tabs.addTab(self.tabMNConf, "MN Configuration")
        self.tabs.addTab(self.tabRewards, "Transfer Rewards")              
        ###-- Connect change action
        self.tabs.currentChanged.connect(lambda: self.onTabChange())                    
        ###-- Draw Tabs 
        self.splitter = QSplitter(Qt.Vertical)
        ###-- Add tabs and console to Layout        
        self.splitter.addWidget(self.tabs)
        self.splitter.addWidget(self.console)
        self.splitter.setStretchFactor(0,0)
        self.splitter.setStretchFactor(1,1)
        self.splitter.setSizes([2,1])
        self.layout.addWidget(self.splitter)
        ###-- Set Layout
        self.setLayout(self.layout)
        ###-- Let's go
        self.mnode_to_change = None
        printOK("Hello! Welcome to " + parent.title)
        ##-- Check version
        self.onCheckVersion()
        
        
    
        
    @pyqtSlot(str)    
    def append_to_console(self, text):
        self.consoleArea.moveCursor(QTextCursor.End)
        self.consoleArea.insertHtml(text)
        # update last logs
        logFile = open(log_File, 'a+')
        logFile.write(text)
        logFile.close()
            
            
            
            
    def initConsole(self):
        self.console = QGroupBox()
        self.console.setTitle("Console Log")
        layout = QVBoxLayout()
        self.btn_consoleToggle = QPushButton('Hide')
        self.btn_consoleToggle.setToolTip('Show/Hide console')
        self.btn_consoleToggle.clicked.connect(lambda: self.onToggleConsole())
        consoleHeader = QHBoxLayout()
        consoleHeader.addWidget(self.btn_consoleToggle)
        self.consoleSaveButton = QPushButton('Save')
        self.consoleSaveButton.clicked.connect(lambda: self.onSaveConsole())
        consoleHeader.addWidget(self.consoleSaveButton)
        self.btn_consoleClean = QPushButton('Clean')
        self.btn_consoleClean.setToolTip('Clean console log area')
        self.btn_consoleClean.clicked.connect(lambda: self.onCleanConsole())
        consoleHeader.addWidget(self.btn_consoleClean)
        consoleHeader.addStretch(1)
        self.versionLabel = QLabel("--")
        self.versionLabel.setOpenExternalLinks(True)
        consoleHeader.addWidget(self.versionLabel)
        self.btn_checkVersion = QPushButton("Check SPMT version")
        self.btn_checkVersion.setToolTip("Check latest stable release of SPMT")
        self.btn_checkVersion.clicked.connect(lambda: self.onCheckVersion())
        consoleHeader.addWidget(self.btn_checkVersion)
        layout.addLayout(consoleHeader)
        self.consoleArea = QTextEdit()
        almostBlack = QColor(40, 40, 40)
        palette = QPalette()
        palette.setColor(QPalette.Base, almostBlack)
        green = QColor(0, 255, 0)
        palette.setColor(QPalette.Text, green)
        self.consoleArea.setPalette(palette)
        layout.addWidget(self.consoleArea)
        self.console.setLayout(layout) 
    

        
        
    def loadIcons(self):
        # Load Icons        
        self.ledPurpleH_icon = QPixmap(os.path.join(self.imgDir, 'icon_purpleLedH.png')).scaledToHeight(17, Qt.SmoothTransformation)
        self.ledGrayH_icon = QPixmap(os.path.join(self.imgDir, 'icon_grayLedH.png')).scaledToHeight(17, Qt.SmoothTransformation)
        self.ledHalfPurpleH_icon = QPixmap(os.path.join(self.imgDir, 'icon_halfPurpleLedH.png')).scaledToHeight(17, Qt.SmoothTransformation)
        self.ledRedV_icon = QPixmap(os.path.join(self.imgDir, 'icon_redLedV.png')).scaledToHeight(17, Qt.SmoothTransformation)
        self.ledGrayV_icon = QPixmap(os.path.join(self.imgDir, 'icon_grayLedV.png')).scaledToHeight(17, Qt.SmoothTransformation)
        self.ledGreenV_icon = QPixmap(os.path.join(self.imgDir, 'icon_greenLedV.png')).scaledToHeight(17, Qt.SmoothTransformation)
       
        
        
        
    def myPopUp(self, messType, messTitle, messText, defaultButton=QMessageBox.No):
        mess = QMessageBox(messType, messTitle, messText, defaultButton, parent=self)
        mess.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        mess.setDefaultButton(defaultButton)
        return mess.exec_()
    
        
     
    def myPopUp2(self, messType, messTitle, messText, singleButton=QMessageBox.Ok):
        mess = QMessageBox(messType, messTitle, messText, singleButton, parent=self)
        mess.setStandardButtons(singleButton | singleButton)
        return mess.exec_()
        
        
        
    
    @pyqtSlot()        
    def onCheckHw(self):
        printDbg("Checking for HW device...")
        self.updateHWstatus(None)
        self.showHWstatus()


        
    
    @pyqtSlot()
    def onCheckRpc(self):
        printDbg("Checking RPC server...")      
        self.runInThread(self.updateRPCstatus, (), self.showRPCstatus) 
        
        
        
    @pyqtSlot()
    def onCheckVersion(self):
        printDbg("Checking SPMT version...")
        self.versionLabel.setText("--")      
        self.runInThread(self.checkVersion, (), self.updateVersion) 
        
        
    def checkVersion(self, ctrl):
        local_version = self.parent.version['number'].split('.')
        remote_version = getRemoteSPMTversion().split('.')
        
        if (remote_version[0] > local_version[0]) or \
        (remote_version[0] == local_version[0] and remote_version[1] > local_version[1]) or \
        (remote_version[0] == local_version[0] and remote_version[1] == local_version[1] and remote_version[2] > local_version[2]):
            self.versionMess = '<b style="color:red">New Version Available:</b> %s.%s.%s  ' % (remote_version[0], remote_version[1], remote_version[2])
            self.versionMess += '(<a href="https://github.com/PIVX-Project/PIVX-SPMT/releases/">download</a>)'
        else:
            self.versionMess = "You have the latest version of SPMT"
            
            
    def updateVersion(self):
        if self.versionMess is not None:
            self.versionLabel.setText(self.versionMess)
        
        
        
    @pyqtSlot()
    def onCleanConsole(self):
        self.consoleArea.clear()
        
      
      
      
    @pyqtSlot()
    def onSaveConsole(self):
        timestamp = strftime('%Y-%m-%d_%H-%M-%S', gmtime(now()))
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self,"Save Logs to file","SPMT_Logs_%s.txt" % timestamp,"All Files (*);; Text Files (*.txt)", options=options)
        try:
            if fileName:
                printOK("Saving logs to %s" % fileName)
                log_file = open(fileName, 'w+')
                log_text = self.consoleArea.toPlainText()
                log_file.write(log_text)
                log_file.close()
                
        except Exception as e:
            err_msg = "error writing Log file"
            printException(getCallerName(), getFunctionName(), err_msg, e.args)
                
            
            
            
    @pyqtSlot()
    def onTabChange(self):
        # reload masternode list in tabs
        if self.tabs.currentWidget() == self.tabRewards:
            self.t_rewards.loadMnSelect()
            self.t_rewards.selectedRewards = None
            
        
        
        
    @pyqtSlot()
    def onToggleConsole(self):
        if self.btn_consoleToggle.text() == 'Hide':
            self.btn_consoleToggle.setText('Show')
            self.consoleArea.hide()
            self.previousH = self.splitter.sizes()[1]
            self.console.setMaximumHeight(70)
        else:
            self.console.setMinimumHeight(self.previousH)
            self.console.setMaximumHeight(starting_height)
            self.btn_consoleToggle.setText('Hide')
            self.consoleArea.show()  
            
            
    
    
    
    
    def showHWstatus(self):
        self.updateHWleds()
        self.myPopUp2(QMessageBox.Information, 'SPMT - hw check', "STATUS: %s" % self.hwStatusMess, QMessageBox.Ok)
        
        
    
        
    def showRPCstatus(self):
        self.updateRPCled()
        self.myPopUp2(QMessageBox.Information, 'SPMT - rpc check', "STATUS: %s" % self.rpcStatusMess, QMessageBox.Ok)

            
            
            
    def updateHWleds(self):
        if self.hwStatus == 1:
            self.header.hwLed.setPixmap(self.ledHalfPurpleH_icon)
        elif self.hwStatus == 2:
            self.header.hwLed.setPixmap(self.ledPurpleH_icon)
        else:
            self.header.hwLed.setPixmap(self.ledGrayH_icon)
        self.header.hwLed.setToolTip(self.hwStatusMess)
        
        
 
        
    def updateHWstatus(self, ctrl):          
        if self.hwdevice is None:
            self.hwdevice = HWdevice()
        
        device = self.hwdevice
        statusCode = device.getStatusCode()
        statusMess = device.getStatusMess(statusCode)
        printDbg("code: %s - mess: %s" % (statusCode, statusMess))
        if statusCode != 2:
            try:
                if getattr(self.hwdevice, 'dongle', None) is not None:
                    self.hwdevice.dongle.close()
                self.hwdevice.initDevice()
                device = self.hwdevice
                statusCode = device.getStatusCode()
                statusMess = device.getStatusMess(statusCode)

            except Exception as e:
                err_msg = "error in checkHw"
                printException(getCallerName(), getFunctionName(), err_msg, e.args)
                    
        self.hwStatus = statusCode
        self.hwStatusMess = statusMess
        
        
  
        
    def updateLastBlockLabel(self):
        text = '--'
        if self.rpcLastBlock == 1:
            text = "Loading block index..."
        elif self.rpcLastBlock > 0 and self.rpcConnected:
            text = str(self.rpcLastBlock)
            text += " ("       
            if not self.isBlockchainSynced:
                text += "Synchronizing"
            else:
                text += "Synced"
            text += ")"
                
        self.header.lastBlockLabel.setText(text)
        
       
        

                  
    def updateRPCled(self):
        if self.rpcConnected:
            self.header.rpcLed.setPixmap(self.ledPurpleH_icon)
        else:
            if self.rpcLastBlock == 1:
                self.header.rpcLed.setPixmap(self.ledHalfPurpleH_icon)
            else:
                self.header.rpcLed.setPixmap(self.ledGrayH_icon)
            
        self.header.rpcLed.setToolTip(self.rpcStatusMess)
        self.updateLastBlockLabel()
        

    
        
    def updateRPCstatus(self, ctrl):
        if self.rpcClient is None:
            try:
                self.rpcClient = RpcClient()
            except Exception as e:
                print(e)
        status, lastBlock = self.rpcClient.getStatus()
        statusMess = self.rpcClient.getStatusMess(status)
        if not status and lastBlock==0:
            try:
                self.rpcClient = RpcClient()
                status, lastBlock = self.rpcClient.getStatus()
                statusMess = self.rpcClient.getStatusMess(status)
            except Exception as e:
                err_msg = "error in checkRpc"
                printException(getCallerName(), getFunctionName(), err_msg, e)
        
        elif lastBlock == 1:
            statusMess = "PIVX wallet is connected but still synchronizing / verifying blocks"
        
        self.rpcConnected = status
        self.rpcLastBlock = lastBlock
        self.rpcStatusMess = statusMess
        self.isBlockchainSynced = self.rpcClient.isBlockchainSynced()
Esempio n. 25
0
class RF_Qt(QMainWindow):
    """
    Class to create the main GUI window. It extends QMainWindow.
    The GUI allows the user to load up to four font files, provide a new font name, adjust some options,
    view a preview of font changes, and finally generate new TrueType font files.
    """

    def __init__(self):
        """
        Create the main window.
        :return:
        """
        super(RF_Qt, self).__init__()

        # Define variables
        self.fnt_styles = ["Regular", "Italic", "Bold", "Bold Italic"]
        self.fnt_sty_combo_list = []
        self.fnt_file_name_list = []
        self.font_files = None
        self.font_info = FontInfo()
        # Create a QProcess object, and connect it to appropriate slots
        self.cli_process = QProcess(self)
        self.cli_process.setProcessChannelMode(QProcess.MergedChannels)
        self.cli_process.readyRead.connect(self.read_proc_output)
        self.cli_process.started.connect(self.manage_proc)
        self.cli_process.finished.connect(self.manage_proc)
        self.cli_process.error.connect(self.manage_proc)

        # Style for all groupbox labels
        gb_style = "QGroupBox { font-weight: bold; }"
        # Top level layout manager for the window.
        win_layout = QVBoxLayout()
        gb_fnt_files = QGroupBox("Font Files")
        gb_fnt_files.setStyleSheet(gb_style)
        grid_f_f = QGridLayout()
        grid_pos = 0

        # Font Files and styles #

        # Create a grid of font names with their respective font style combo boxes
        for i in range(len(self.fnt_styles)):
            self.fnt_file_name_list.append(QLabel("Load font file..."))
            cmb = QComboBox()
            cmb.addItem("")
            cmb.addItems(self.fnt_styles)
            cmb.setEnabled(False)
            cmb.setToolTip(
                "<qt/>If not automatically detected when the font is added, allows you to select what font "
                "sub-family the font file belongs to"
            )
            self.fnt_sty_combo_list.append(cmb)
            row, col = helper.calc_grid_pos(grid_pos, 2)
            grid_f_f.addWidget(self.fnt_file_name_list[i], row, col)
            grid_pos += 1
            row, col = helper.calc_grid_pos(grid_pos, 2)
            grid_f_f.addWidget(self.fnt_sty_combo_list[i], row, col)
            grid_pos += 1
        grid_f_f.setColumnStretch(0, 1)
        gb_fnt_files.setLayout(grid_f_f)
        win_layout.addWidget(gb_fnt_files)

        # New Font Name #
        gb_fnt_name = QGroupBox("Font Family Name")
        gb_fnt_name.setStyleSheet(gb_style)
        hb_fnt_name = QHBoxLayout()
        self.new_fnt_name = QLineEdit()
        self.new_fnt_name.setToolTip("Enter a name for the modified font.")
        self.new_fnt_name.textEdited[str].connect(self.set_family_name)
        hb_fnt_name.addWidget(self.new_fnt_name)
        gb_fnt_name.setLayout(hb_fnt_name)
        win_layout.addWidget(gb_fnt_name)

        # Options #
        hb_options = QHBoxLayout()

        ## Kerning, Panose, Alt. Name ##
        gb_basic_opt = QGroupBox("Basic Options")
        gb_basic_opt.setStyleSheet(gb_style)
        hb_basic_opt = QHBoxLayout()
        self.basic_opt_list = []
        basic_tooltips = (
            "<qt/>Some readers and software require 'legacy', or 'old style' kerning to be "
            "present for kerning to work.",
            "<qt/>Kobo readers can get confused by PANOSE settings. This option sets all "
            "PANOSE information to 0, or 'any'",
            "<qt/>Some fonts have issues with renaming. If the generated font does not have "
            "the same internal font name as you entered, try enabling this option.",
        )

        for opt, tip in zip(("Legacy Kerning", "Clear PANOSE", "Alt. Name"), basic_tooltips):
            self.basic_opt_list.append(QCheckBox(opt))
            self.basic_opt_list[-1].setToolTip(tip)
            hb_basic_opt.addWidget(self.basic_opt_list[-1])

        gb_basic_opt.setLayout(hb_basic_opt)
        hb_options.addWidget(gb_basic_opt)

        ## Hinting ##
        gb_hint_opt = QGroupBox("Hinting Option")
        gb_hint_opt.setStyleSheet(gb_style)
        hb_hint_opt = QHBoxLayout()
        self.hint_opt_list = []
        hint_tooltips = (
            "<qt/>Keep font hinting as it exists in the orginal font files.<br />"
            "In most cases, this will look fine on most ebook reading devices.",
            '<qt/>Some fonts are manually, or "hand" hinted for specific display types (such as LCD). '
            "These fonts may not look good on other display types such as e-ink, therefore they can be "
            "removed.",
            "<qt/>If you don't like the original hinting, but you want your font to be hinted, "
            "this option will auto hint your font.",
        )
        for opt, tip in zip(("Keep Existing", "Remove Existing", "AutoHint"), hint_tooltips):
            self.hint_opt_list.append(QRadioButton(opt))
            self.hint_opt_list[-1].setToolTip(tip)
            self.hint_opt_list[-1].toggled.connect(self.set_hint)
            hb_hint_opt.addWidget(self.hint_opt_list[-1])

        self.hint_opt_list[0].setChecked(Qt.Checked)
        gb_hint_opt.setLayout(hb_hint_opt)
        hb_options.addWidget(gb_hint_opt)

        win_layout.addLayout(hb_options)

        ## Darken ##
        gb_dark_opt = QGroupBox("Darken Options")
        gb_dark_opt.setStyleSheet(gb_style)
        hb_dark_opt = QHBoxLayout()
        self.darken_opt = QCheckBox("Darken Font")
        self.darken_opt.setToolTip("<qt/>Darken, or add weight to a font to make it easier to read on e-ink screens.")
        self.darken_opt.toggled.connect(self.set_darken_opt)
        hb_dark_opt.addWidget(self.darken_opt)
        self.mod_bearing_opt = QCheckBox("Modify Bearings")
        self.mod_bearing_opt.setToolTip(
            "<qt/>By default, adding weight to a font increases glyph width. Enable this "
            "option to set the glyph width to be roughly equal to the original.<br/><br/>"
            "WARNING: This reduces the spacing between glyphs, and should not be used if "
            "you have added too much weight."
        )
        self.mod_bearing_opt.toggled.connect(self.set_mod_bearing)
        self.mod_bearing_opt.setEnabled(False)
        hb_dark_opt.addWidget(self.mod_bearing_opt)

        self.lbl = QLabel("Darken Amount:")
        self.lbl.setEnabled(False)
        hb_dark_opt.addWidget(self.lbl)
        self.darken_amount_opt = QSlider(Qt.Horizontal)
        self.darken_amount_opt.setMinimum(1)
        self.darken_amount_opt.setMaximum(50)
        self.darken_amount_opt.setValue(12)
        self.darken_amount_opt.setEnabled(False)
        self.darken_amount_opt.setToolTip(
            "<qt/>Set the amount to darken a font by. 50 is considered turning a "
            "regular weight font into a bold weight font. It is not recommended to "
            "darken a font that much however."
        )
        self.darken_amount_opt.valueChanged[int].connect(self.set_darken_amount)
        hb_dark_opt.addWidget(self.darken_amount_opt)
        self.darken_amount_lab = QLabel()
        self.darken_amount_lab.setText(str(self.darken_amount_opt.value()))
        self.darken_amount_lab.setEnabled(False)
        hb_dark_opt.addWidget(self.darken_amount_lab)
        gb_dark_opt.setLayout(hb_dark_opt)

        win_layout.addWidget(gb_dark_opt)

        # Buttons #
        hb_buttons = QHBoxLayout()
        # hb_buttons.addStretch()
        self.gen_ttf_btn = QPushButton("Generate TTF")
        self.gen_ttf_btn.setEnabled(False)
        self.gen_ttf_btn.setToolTip(
            "<qt/>Generate a new TrueType font based on the options chosen in this program. "
            "<br /><br />"
            "The new fonts are saved in a directory of your choosing."
        )
        self.gen_ttf_btn.clicked.connect(self.gen_ttf)
        hb_buttons.addWidget(self.gen_ttf_btn)
        self.load_font_btn = QPushButton("Load Fonts")
        self.load_font_btn.setToolTip("<qt/>Load font files to modify.")
        self.load_font_btn.clicked.connect(self.load_fonts)
        hb_buttons.addWidget(self.load_font_btn)
        self.prog_bar = QProgressBar()
        self.prog_bar.setRange(0, 100)
        hb_buttons.addWidget(self.prog_bar)
        win_layout.addLayout(hb_buttons)

        # Output Log #
        gb_log_win = QGroupBox("Log Window")
        gb_log_win.setStyleSheet(gb_style)
        vb_log = QVBoxLayout()
        out_font = QFont("Courier")
        out_font.setStyleHint(QFont.Monospace)
        self.log_win = QTextEdit()
        self.log_win.setAcceptRichText(False)
        self.log_win.setFont(out_font)
        vb_log.addWidget(self.log_win)
        gb_log_win.setLayout(vb_log)
        win_layout.addWidget(gb_log_win)

        # Show Window #
        self.setCentralWidget(QWidget(self))
        self.centralWidget().setLayout(win_layout)
        self.setWindowTitle("Readify Font")

        self.show()

        # Check if fontforge is actually in users PATH. If it isn't, prompt user to provice a location
        self.ff_path = helper.which("fontforge")
        if not self.ff_path:
            self.set_ff_path()

    def set_ff_path(self):
        """
        Let user choose location of fontforge
        :return:
        """
        QMessageBox.warning(
            self,
            "Fontforge Missing!",
            "FontForge is not in your PATH! If it is installed, " "please locate it now.",
            QMessageBox.Ok,
            QMessageBox.Ok,
        )
        path = QFileDialog.getOpenFileName(self, "Locate FontForge...")
        if path[0]:
            self.ff_path = os.path.normpath(path[0])

    def set_basic_opt(self):
        """
        Handler to set basic options
        :return:
        """
        opt = self.sender()
        if opt.isChecked():
            if "kerning" in opt.text().lower():
                self.font_info.leg_kern = True
            if "panose" in opt.text().lower():
                self.font_info.strip_panose = True
            if "alt" in opt.text().lower():
                self.font_info.name_hack = True
        else:
            if "kerning" in opt.text().lower():
                self.font_info.leg_kern = False
            if "panose" in opt.text().lower():
                self.font_info.strip_panose = False
            if "alt" in opt.text().lower():
                self.font_info.name_hack = False

    def set_family_name(self, name):
        """
        Handler to set name option. Also checks if buttons need enabling
        :param name:
        :return:
        """
        if name:
            if helper.valid_filename(name):
                self.font_info.font_name = name
                if self.font_files:
                    self.gen_ttf_btn.setEnabled(True)
            else:
                self.gen_ttf_btn.setEnabled(False)
        else:
            self.gen_ttf_btn.setEnabled(False)

    def set_darken_amount(self, amount):
        """
        Set Darken amount slider
        :param amount:
        :return:
        """
        self.darken_amount_lab.setText(str(amount))
        self.font_info.add_weight = amount

    def set_hint(self):
        """
        Set hint options
        :return:
        """
        hint = self.sender()
        if hint.isChecked():
            if "keep" in hint.text().lower():
                self.font_info.change_hint = "keep"
            elif "remove" in hint.text().lower():
                self.font_info.change_hint = "remove"
            elif "auto" in hint.text().lower():
                self.font_info.change_hint = "auto"

    def set_darken_opt(self):
        """
        Set darken options
        :return:
        """
        if self.sender().isChecked():
            self.mod_bearing_opt.setEnabled(True)
            self.lbl.setEnabled(True)
            self.darken_amount_lab.setEnabled(True)
            self.darken_amount_opt.setEnabled(True)
            self.set_darken_amount(self.darken_amount_opt.value())
        else:
            self.mod_bearing_opt.setEnabled(False)
            self.lbl.setEnabled(False)
            self.darken_amount_lab.setEnabled(False)
            self.darken_amount_opt.setEnabled(False)
            self.set_darken_amount(0)

    def set_mod_bearing(self):
        """
        Set mod bearing options
        :return:
        """
        if self.mod_bearing_opt.isChecked():
            self.font_info.mod_bearings = True
        else:
            self.font_info.mod_bearings = False

    def load_fonts(self):
        """
        Load fonts from a directory, and sets appropriate options
        :return:
        """
        f_f = QFileDialog.getOpenFileNames(self, "Load Fonts", "", "Font Files (*.ttf *.otf)")
        if f_f[0]:
            for f_label, f_style in zip(self.fnt_file_name_list, self.fnt_sty_combo_list):
                f_label.setText("Load font file...")
                f_style.setCurrentIndex(SEL_NONE)
                f_style.setEnabled(False)

            self.font_files = f_f[0]
            f_f_names = []
            for file in self.font_files:
                file = os.path.normpath(file)
                base, fn = os.path.split(file)
                f_f_names.append(fn)

            for f_file, f_label, f_style in zip(f_f_names, self.fnt_file_name_list, self.fnt_sty_combo_list):
                f_label.setText(f_file)
                f_style.setEnabled(True)
                if "regular" in f_file.lower():
                    f_style.setCurrentIndex(SEL_REGULAR)
                elif "bold" in f_file.lower() and "italic" in f_file.lower():
                    f_style.setCurrentIndex(SEL_BOLDITALIC)
                elif "bold" in f_file.lower():
                    f_style.setCurrentIndex(SEL_BOLD)
                elif "italic" in f_file.lower():
                    f_style.setCurrentIndex(SEL_ITALIC)

            if self.new_fnt_name.text():
                self.gen_ttf_btn.setEnabled(True)

    def read_proc_output(self):
        """
        Read any stdout data available from the process and displays it in the output log window.
        :return:
        """
        if sys.version_info.major == 2:
            output = unicode(self.cli_process.readAllStandardOutput(), encoding=sys.getdefaultencoding())
        else:
            output = str(self.cli_process.readAllStandardOutput(), encoding=sys.getdefaultencoding())
        self.log_win.append(output)

    def manage_proc(self):
        """
        Manage the progress bar
        :return:
        """
        proc = self.sender()
        if proc.state() == QProcess.Running:
            self.prog_bar.setRange(0, 0)
        if proc.state() == QProcess.NotRunning:
            self.prog_bar.setRange(0, 100)
            self.prog_bar.setValue(100)

    def gen_ttf(self):
        """
        Generate modified TrueType font files, by calling the CLI script with the appropriate arguments.
        :param prev:
        :return:
        """
        self.log_win.clear()
        if not self.ff_path:
            self.set_ff_path()
        if self.ff_path:
            if not self.font_info.out_dir:
                save_dir = os.path.normpath(
                    QFileDialog.getExistingDirectory(self, "Select save directory...", options=QFileDialog.ShowDirsOnly)
                )
                if save_dir == "." or save_dir == "":
                    return
                else:
                    self.font_info.out_dir = save_dir
            else:
                save_dir = os.path.normpath(
                    QFileDialog.getExistingDirectory(
                        self, "Select Save directory...", self.font_info.out_dir, options=QFileDialog.ShowDirsOnly
                    )
                )
                if save_dir == "." or save_dir == "":
                    return
                else:
                    self.font_info.out_dir = save_dir

            for file, style in zip(self.font_files, self.fnt_sty_combo_list):
                if style.currentIndex() == SEL_REGULAR:
                    self.font_info.font_file_reg = file
                elif style.currentIndex() == SEL_BOLDITALIC:
                    self.font_info.font_file_bi = file
                elif style.currentIndex() == SEL_BOLD:
                    self.font_info.font_file_bd = file
                elif style.currentIndex() == SEL_ITALIC:
                    self.font_info.font_file_it = file

            cli_opt_list = self.font_info.gen_cli_command()
            self.cli_process.start(self.ff_path, cli_opt_list)

    def closeEvent(self, event):
        """
        Cleaning up...
        :param event:
        :return:
        """
        self.cli_process.close()
        event.accept()
class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.find_match = QPushButton('Make a Match!')
        self.find_match.clicked.connect(self.find_match_handler)

        self.player_front_label = QLabel('Player Front')
        self.player_front_info = QLabel(
            'n/a cards left\n Last played card: n/a')
        self.player_front_label.setAlignment(Qt.AlignHCenter)
        self.player_front_info.setAlignment(Qt.AlignCenter)

        self.player_left_label = QLabel('Player Left')
        self.player_left_info = QLabel(
            'n/a cards left\n Last played card: n/a')

        self.player_right_label = QLabel('Player Right')
        self.player_right_info = QLabel(
            'n/a cards left\n Last played card: n/a')

        self.table_info_edit = QTextEdit()
        self.table_info_edit.textChanged.connect(self.table_info_edit_changed)
        self.my_hand_label = QLabel('My Hand')
        self.my_hand_info = QLabel('Empty')
        self.my_hand_info.setAlignment(Qt.AlignCenter)
        self.my_hand_label.setAlignment(Qt.AlignHCenter)

        self.suit = QLabel('Enter a Suit')
        self.suit_edit = QLineEdit()
        self.number = QLabel('Enter a Number')
        self.number_edit = QLineEdit()

        self.play_button = QPushButton('Play!')
        self.play_button.setStyleSheet('QPushButton {height: 46px}')
        self.play_button.clicked.connect(self.play_card_handler)

        self.grid = QGridLayout()
        self.grid.setSpacing(10)

        self.grid.addWidget(self.find_match, 0, 0)

        self.grid.addWidget(self.player_front_label, 0, 2, 1, 3)
        self.grid.addWidget(self.player_front_info, 1, 2, 1, 3)
        self.grid.addWidget(self.player_left_label, 3, 1)
        self.grid.addWidget(self.player_left_info, 4, 1)
        self.grid.addWidget(self.player_right_label, 3, 5)
        self.grid.addWidget(self.player_right_info, 4, 5)
        self.grid.addWidget(self.table_info_edit, 2, 2, 4, 3)
        self.grid.addWidget(self.my_hand_info, 6, 2, 1, 3)
        self.grid.addWidget(self.my_hand_label, 7, 2, 1, 3)
        self.grid.addWidget(self.suit, 8, 2)
        self.grid.addWidget(self.suit_edit, 8, 3)
        self.grid.addWidget(self.number, 9, 2)
        self.grid.addWidget(self.number_edit, 9, 3)
        self.grid.addWidget(self.suit, 8, 2)
        self.grid.addWidget(self.play_button, 8, 4, 2, 1)

        self.setLayout(self.grid)

        self.setGeometry(150, 150, 1200, 600)
        self.setWindowTitle('Spade')
        self.show()

    def find_match_handler(self):
        self.clear_all_fields()
        self.push_message_to_table("Finding a Match")
        self.push_message_to_table("A match is found!!!")
        self.my_hand_info.setText(example_hand)

    def play_card_handler(self):
        suit = self.suit_edit.text()
        number = self.number_edit.text()
        if suit == '' or number == '':
            self.push_message_to_table("You mush enter valid suit and number!")
            return
        self.push_message_to_table('You just played: ' + suit + ' ' + number)
        self.update_hand('hand updated')

    def push_message_to_table(self, message):
        self.table_info_edit.setPlainText(self.table_info_edit.toPlainText() +
                                          message + '\n')

    def update_hand(self, my_hand):
        self.my_hand_info.setText(my_hand)

    def clear_table_info_edit(self):
        self.table_info_edit.clear()

    def clear_suit_edit(self):
        self.suit_edit.clear()

    def clear_number_edit(self):
        self.number_edit.clear()

    def clear_all_fields(self):
        self.player_front_info.setText(
            'n/a cards left\n Last played card: n/a')
        self.player_left_info.setText('n/a cards left\n Last played card: n/a')
        self.player_right_info.setText(
            'n/a cards left\n Last played card: n/a')
        self.my_hand_info.setText('Empty!')
        self.clear_table_info_edit()
        self.clear_suit_edit()
        self.clear_number_edit()

    def table_info_edit_changed(self):
        self.table_info_edit.moveCursor(QTextCursor.End)

    def update_front_info(self, num_of_cards_left, last_played_card):
        self.player_front_info.setText(
            f'{num_of_cards_left} cards left\n Last played card: {last_played_card}'
        )

    def update_left_info(self, num_of_cards_left, last_played_card):
        self.player_left_info.setText(
            f'{num_of_cards_left} cards left\n Last played card: {last_played_card}'
        )

    def update_right_info(self, num_of_cards_left, last_played_card):
        self.player_right_info.setText(
            f'{num_of_cards_left} cards left\n Last played card: {last_played_card}'
        )
Esempio n. 27
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.createDockWindows()

        self.setWindowTitle("Dock Widgets")

        self.newLetter()

    def newLetter(self):
        self.textEdit.clear()

        cursor = self.textEdit.textCursor()
        cursor.movePosition(QTextCursor.Start)
        topFrame = cursor.currentFrame()
        topFrameFormat = topFrame.frameFormat()
        topFrameFormat.setPadding(16)
        topFrame.setFrameFormat(topFrameFormat)

        textFormat = QTextCharFormat()
        boldFormat = QTextCharFormat()
        boldFormat.setFontWeight(QFont.Bold)
        italicFormat = QTextCharFormat()
        italicFormat.setFontItalic(True)

        tableFormat = QTextTableFormat()
        tableFormat.setBorder(1)
        tableFormat.setCellPadding(16)
        tableFormat.setAlignment(Qt.AlignRight)
        cursor.insertTable(1, 1, tableFormat)
        cursor.insertText("The Firm", boldFormat)
        cursor.insertBlock()
        cursor.insertText("321 City Street", textFormat)
        cursor.insertBlock()
        cursor.insertText("Industry Park")
        cursor.insertBlock()
        cursor.insertText("Some Country")
        cursor.setPosition(topFrame.lastPosition())
        cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"),
                textFormat)
        cursor.insertBlock()
        cursor.insertBlock()
        cursor.insertText("Dear ", textFormat)
        cursor.insertText("NAME", italicFormat)
        cursor.insertText(",", textFormat)
        for i in range(3):
            cursor.insertBlock()
        cursor.insertText("Yours sincerely,", textFormat)
        for i in range(3):
            cursor.insertBlock()
        cursor.insertText("The Boss", textFormat)
        cursor.insertBlock()
        cursor.insertText("ADDRESS", italicFormat)

    def print_(self):
        document = self.textEdit.document()
        printer = QPrinter()

        dlg = QPrintDialog(printer, self)
        if dlg.exec_() != QDialog.Accepted:
            return

        document.print_(printer)

        self.statusBar().showMessage("Ready", 2000)

    def save(self):
        filename, _ = QFileDialog.getSaveFileName(self,
                "Choose a file name", '.', "HTML (*.html *.htm)")
        if not filename:
            return

        file = QFile(filename)
        if not file.open(QFile.WriteOnly | QFile.Text):
            QMessageBox.warning(self, "Dock Widgets",
                    "Cannot write file %s:\n%s." % (filename, file.errorString()))
            return

        out = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        out << self.textEdit.toHtml()
        QApplication.restoreOverrideCursor()

        self.statusBar().showMessage("Saved '%s'" % filename, 2000)

    def undo(self):
        document = self.textEdit.document()
        document.undo()

    def insertCustomer(self, customer):
        if not customer:
            return
        customerList = customer.split(', ')
        document = self.textEdit.document()
        cursor = document.find('NAME')
        if not cursor.isNull():
            cursor.beginEditBlock()
            cursor.insertText(customerList[0])
            oldcursor = cursor
            cursor = document.find('ADDRESS')
            if not cursor.isNull():
                for i in customerList[1:]:
                    cursor.insertBlock()
                    cursor.insertText(i)
                cursor.endEditBlock()
            else:
                oldcursor.endEditBlock()

    def addParagraph(self, paragraph):
        if not paragraph:
            return
        document = self.textEdit.document()
        cursor = document.find("Yours sincerely,")
        if cursor.isNull():
            return
        cursor.beginEditBlock()
        cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor,
                2)
        cursor.insertBlock()
        cursor.insertText(paragraph)
        cursor.insertBlock()
        cursor.endEditBlock()

    def about(self):
        QMessageBox.about(self, "About Dock Widgets",
                "The <b>Dock Widgets</b> example demonstrates how to use "
                "Qt's dock widgets. You can enter your own text, click a "
                "customer to add a customer name and address, and click "
                "standard paragraphs to add them.")

    def createActions(self):
        self.newLetterAct = QAction(QIcon(':/images/new.png'), "&New Letter",
                self, shortcut=QKeySequence.New,
                statusTip="Create a new form letter", triggered=self.newLetter)

        self.saveAct = QAction(QIcon(':/images/save.png'), "&Save...", self,
                shortcut=QKeySequence.Save,
                statusTip="Save the current form letter", triggered=self.save)

        self.printAct = QAction(QIcon(':/images/print.png'), "&Print...", self,
                shortcut=QKeySequence.Print,
                statusTip="Print the current form letter",
                triggered=self.print_)

        self.undoAct = QAction(QIcon(':/images/undo.png'), "&Undo", self,
                shortcut=QKeySequence.Undo,
                statusTip="Undo the last editing action", triggered=self.undo)

        self.quitAct = QAction("&Quit", self, shortcut="Ctrl+Q",
                statusTip="Quit the application", triggered=self.close)

        self.aboutAct = QAction("&About", self,
                statusTip="Show the application's About box",
                triggered=self.about)

        self.aboutQtAct = QAction("About &Qt", self,
                statusTip="Show the Qt library's About box",
                triggered=QApplication.instance().aboutQt)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newLetterAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.printAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.quitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.undoAct)

        self.viewMenu = self.menuBar().addMenu("&View")

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newLetterAct)
        self.fileToolBar.addAction(self.saveAct)
        self.fileToolBar.addAction(self.printAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.undoAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def createDockWindows(self):
        dock = QDockWidget("Customers", self)
        dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
        self.customerList = QListWidget(dock)
        self.customerList.addItems((
            "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton",
            "Jane Doe, Memorabilia, 23 Watersedge, Beaton",
            "Tammy Shea, Tiblanka, 38 Sea Views, Carlton",
            "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal",
            "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston",
            "Sally Hobart, Tiroli Tea, 67 Long River, Fedula"))
        dock.setWidget(self.customerList)
        self.addDockWidget(Qt.RightDockWidgetArea, dock)
        self.viewMenu.addAction(dock.toggleViewAction())

        dock = QDockWidget("Paragraphs", self)
        self.paragraphsList = QListWidget(dock)
        self.paragraphsList.addItems((
            "Thank you for your payment which we have received today.",
            "Your order has been dispatched and should be with you within "
                "28 days.",
            "We have dispatched those items that were in stock. The rest of "
                "your order will be dispatched once all the remaining items "
                "have arrived at our warehouse. No additional shipping "
                "charges will be made.",
            "You made a small overpayment (less than $5) which we will keep "
                "on account for you, or return at your request.",
            "You made a small underpayment (less than $1), but we have sent "
                "your order anyway. We'll add this underpayment to your next "
                "bill.",
            "Unfortunately you did not send enough money. Please remit an "
                "additional $. Your order will be dispatched as soon as the "
                "complete amount has been received.",
            "You made an overpayment (more than $5). Do you wish to buy more "
                "items, or should we return the excess to you?"))
        dock.setWidget(self.paragraphsList)
        self.addDockWidget(Qt.RightDockWidgetArea, dock)
        self.viewMenu.addAction(dock.toggleViewAction())

        self.customerList.currentTextChanged.connect(self.insertCustomer)
        self.paragraphsList.currentTextChanged.connect(self.addParagraph)
Esempio n. 28
0
class DebugTool(QMainWindow):
    '''
    含有状态栏的窗口
    '''

    def __init__(self):
        super().__init__()

        # 创建CommandHandler
        self.handler = HandlerManager()

        # CommandHandler的输出结果通过outSignal信号返回给DebugTool
        self.handler.outSignal.connect(self.writeOutput)

        # 启动CommandHandler的后台线程
        self.handler.start()

        self.initUI()

        # QTextCodec.setCodecForCStrings(QTextCodec.codecForName("UTF-8"))

    def initMenuAndToolbar(self):
        '''
        初始化菜单和工具栏

        菜单:
            File
                -- Open File
                -- 分隔符
                -- Exit
            Command
                -- SendFile

        工具栏:
            |Connect | SendFile

        '''

        # 打开文件
        iconpath = resource_path('openfile.png')
        sendAction = QAction(QIcon(iconpath), 'OpenFile', self)
        sendAction.triggered.connect(self.onOpenFile)

        # 退出
        iconpath = resource_path('exit.png')
        exitAction = QAction(QIcon(iconpath), 'Exit', self)
        exitAction.triggered.connect(self.close)

        iconpath = resource_path('help.png')
        helpAction = QAction(QIcon(iconpath), 'Help', self)
        helpAction.triggered.connect(self.onHelp)

        # 使能所有插件
        iconpath = resource_path('activate.png')
        activateAllAction = QAction(QIcon(iconpath), 'ActivateAll', self)
        activateAllAction.triggered.connect(self.onActivateAll)

        # 禁用所有插件
        iconpath = resource_path('deactivate.png')
        deactivateAllAction = QAction(QIcon(iconpath), 'DeactivateAll', self)
        deactivateAllAction.triggered.connect(self.onDeactivateAll)

        # File菜单
        fileMenu = self.menuBar().addMenu('&File')
        fileMenu.addAction(sendAction)
        fileMenu.addSeparator()
        fileMenu.addAction(exitAction)

        # Plugin菜单
        pluginMenu = self.menuBar().addMenu('&Plugin')
        pluginMenu.addAction(activateAllAction)
        pluginMenu.addAction(deactivateAllAction)
        pluginMenu.addSeparator()

        for plugin in self.handler.getAllPlugins():
            pluginSubMenu = pluginMenu.addMenu(plugin.plugin_object.name)

            iconpath = resource_path('activate.png')
            pluginActivateAction = QAction(QIcon(iconpath), "Activate", self)
            pluginActivateAction.triggered.connect(functools.partial(
                self.onPluginClicked, plugin.plugin_object.name, True))

            iconpath = resource_path('deactivate.png')
            pluginDeactivateAction = QAction(
                QIcon(iconpath), "Deactivate", self)
            pluginDeactivateAction.triggered.connect(functools.partial(
                self.onPluginClicked, plugin.plugin_object.name, False))

            pluginSubMenu.addAction(pluginActivateAction)
            pluginSubMenu.addAction(pluginDeactivateAction)

        # About菜单
        aboutMenu = self.menuBar().addMenu('&About')
        aboutMenu.addAction(helpAction)

        # 工具栏
        toolbar = self.addToolBar('MainToolBar')
        toolbar.setMovable(False)
        # toolbar.addAction(connectAction)
        toolbar.addAction(sendAction)
        # toolbar.addAction(helpAction)
        # toolbar.addAction(exitAction)

    def initMainUI(self):
        '''
        初始化主界面,一个TextEdit用来显示输出结果,一个LineEdit用来获取输入命令
        '''

        # 创建一个QWidget来包含其它所有控件
        centerWidget = QWidget(self)

        # CmdLine用来获取用户输入,响应 回车键 按下事件
        self.cmdline = CmdLineEdit(centerWidget)
        self.cmdline.returnPressed.connect(self.onCmdlineRerurnPressed)
        self.cmdline.setFocus()

        # 启动式,从文件加载历史命令
        self.cmdline.loadHistory(HISTORY_FILE)

        # LogOutput用来显示输出结果,只读
        self.logOutput = QTextEdit(centerWidget)
        self.logOutput.setReadOnly(True)
        self.logOutput.setAcceptRichText(True)

        # 用一个垂直Box将logOutput和cmdLine放在一起
        vbox = QVBoxLayout(centerWidget)
        vbox.addWidget(self.logOutput)
        vbox.addWidget(self.cmdline)

        # 设置主界面显示内容
        self.setCentralWidget(centerWidget)

    def initUI(self):
        '''
        初始化界面
        '''

        # 菜单和工具栏
        self.initMenuAndToolbar()

        # 主界面
        self.initMainUI()

        # 设置默认大小
        self.resize(WDW_WIDTH, WDW_HEIGHT)

        # 标题
        self.setWindowTitle('DebugTool')
        # self.show()

    def onConnect(self):
        print('onConnect!')

    def onOpenFile(self):
        '''
        打开窗口,选择命令文件,支持一次选择多个文件
        '''
        filepaths, _ = QFileDialog.getOpenFileNames(
            self, 'Open file', None, 'Command Files (*.cmd);;All Files (*)')

        if filepaths:
            for filepath in filepaths:
                filepath = os.path.normpath(filepath)
                self.handler.processFile(filepath)

    def onHelp(self):
        '''
        打印帮助命令
        '''
        self.processCommand(CMD_HELP)

    def onCmdlineRerurnPressed(self):
        '''
        当用户按下回车键时触发此函数
        获取用户输入,清空cmdline,然后将命令提交给处理函数
        '''
        userInput = str(self.cmdline.text()).strip()
        self.cmdline.clear()
        self.cmdline.addHistory(userInput)

        self.processCommand(userInput)

    def processCommand(self, userInput):
        '''
        判断命令类型,如果是基础命令,如exit和clear等,直接执行;
        否则,发送给CommandHandler执行
        '''
        # 如果时空命令或注释,直接返回
        if not len(userInput) or userInput.startswith(CMD_COMMENT):
            return

        # 获取用户输入的第一个单词作为命令
        command, *params = userInput.split()

        if command == CMD_EXIT:
            self.close()
        elif command == CMD_CLEAR:
            self.logOutput.clear()
        else:
            # 提交给CommandHandler处理
            self.handler.processInput(userInput)

    def writeOutput(self, textType, commandOutput):
        '''
        获取CommandHandler的输出,显示到logOutput

        0   -   普通内容
        1   -   命令输出
        2   -   错误输出
        3   -   自定义RichText
        '''
        if textType == 0:
            self.logOutput.insertPlainText(
                TextFormatter.fStdout(commandOutput))
        elif textType == 1:
            self.logOutput.insertHtml(TextFormatter.fCommand(commandOutput))
        elif textType == 2:
            self.logOutput.insertHtml(TextFormatter.fStderr(commandOutput))
        else:
            self.logOutput.insertHtml(commandOutput)

        # 滚动到最新的内容
        self.logOutput.moveCursor(QTextCursor.End)

    def onDeactivateAll(self):
        self.handler.deactivateAllPlugins()

    def onActivateAll(self):
        self.handler.activateAllPlugins()

    def onPluginClicked(self, name, activate):
        if activate:
            self.handler.activatePlugin(name)
        else:
            self.handler.deactivatePlugin(name)

    def closeEvent(self, event):
        '''
        关闭窗口前,将历史命令数据保存到文件
        '''
        self.cmdline.saveHistory(HISTORY_FILE)
        event.accept()
Esempio n. 29
0
class BookLog(QWidget):
    NavigationMode, AddingMode, EditingMode = range(3)

    def __init__(self, parent=None):
        super(BookLog, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldTitle = ''
        self.oldMemo = ''
        self.oldShoziflag = False
        self.oldIsbn = ''
        self.oldDokuryodate = QDate()
        self.currentMode = self.NavigationMode

        #ラベル
        titleLabel = QLabel("書名:")
        self.titleLine = QLineEdit()
        self.titleLine.setReadOnly(True)

        dokuryoLabel = QLabel("読了日:")
        self.dokuryodate = QDateEdit()
        self.dokuryodate.setReadOnly(True)


        memoLabel = QLabel("メモ:")
        self.memoText = QTextEdit()
        self.memoText.setReadOnly(True)

        isbnLabel = QLabel("ISBN:")
        self.isbnLine = QLineEdit()
        self.isbnLine.setReadOnly(True)

        shoziflag = QLabel("所持:")
        self.shoziflag = QCheckBox()

        self.addButton = QPushButton("&追加")
        self.addButton.show()
        self.editButton = QPushButton("&編集")
        self.editButton.setEnabled(False)
        self.removeButton = QPushButton("&削除")
        self.removeButton.setEnabled(False)
        self.findButton = QPushButton("&検索")
        self.findButton.setEnabled(False)
        self.submitButton = QPushButton("&挿入")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&キャンセル")
        self.cancelButton.hide()

        self.nextButton = QPushButton("&次")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("&前")
        self.previousButton.setEnabled(False)

        self.loadButton = QPushButton("&Load...")
        self.loadButton.setToolTip("Load contacts from a file")
        self.saveButton = QPushButton("Sa&ve...")
        self.saveButton.setToolTip("Save contacts to a file")
        self.saveButton.setEnabled(False)

        self.exportButton = QPushButton("Ex&port")
        self.exportButton.setToolTip("Export as vCard")
        self.exportButton.setEnabled(False)

        self.dialog = FindDialog()

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.editButton.clicked.connect(self.editContact)
        self.removeButton.clicked.connect(self.removeContact)
        #self.findButton.clicked.connect(self.findContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)
        self.loadButton.clicked.connect(self.loadFromFile)
        self.saveButton.clicked.connect(self.saveToFile)
        self.exportButton.clicked.connect(self.exportAsVCard)

        #self.createMenus()
        #topFiller = QWidget()
        #topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton)
        buttonLayout1.addWidget(self.editButton)
        buttonLayout1.addWidget(self.removeButton)
        buttonLayout1.addWidget(self.findButton)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addWidget(self.loadButton)
        buttonLayout1.addWidget(self.saveButton)
        buttonLayout1.addWidget(self.exportButton)
        buttonLayout1.addStretch()

        buttonLayout2 = QHBoxLayout()
        buttonLayout2.addWidget(self.previousButton)
        buttonLayout2.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(titleLabel, 0, 0)
        mainLayout.addWidget(self.titleLine, 0, 1)
        mainLayout.addWidget(memoLabel, 3, 0, Qt.AlignTop)
        mainLayout.addWidget(self.memoText, 3, 1)
        mainLayout.addWidget(dokuryoLabel, 2, 0)
        mainLayout.addWidget(self.dokuryodate, 2, 1)
        mainLayout.addWidget(isbnLabel, 1, 0)
        mainLayout.addWidget(self.isbnLine, 1, 1)
        mainLayout.addWidget(shoziflag, 4, 0)
        mainLayout.addWidget(self.shoziflag, 4, 1)
        mainLayout.addLayout(buttonLayout1, 6, 2)
        mainLayout.addLayout(buttonLayout2, 5, 1)
        #テーブル

        self.table = QTableWidget(100, 5,)
        self.table.setHorizontalHeaderLabels(["書名", "ISBN", "読了日", "メモ", "所持"])
        self.table.verticalHeader().setVisible(False)
        #for i, (title, memo) in enumerate(tableData):

        i = 0
        for title, obj in self.contacts.items():
            titleItem = QTableWidgetItem(title)
            memoItem = QTableWidgetItem()
            memoItem.setData(Qt.DisplayRole, memo)
            if obj['shoziflag'] == True:
                    maru = '○'
            else:
                    maru = ''
            self.table.setItem(i, 0, titleItem)
            self.table.setItem(i, 1, QTableWidgetItem(obj['isbn']))
            self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate']))
            self.table.setItem(i, 3, QTableWidgetItem(obj['memo']))
            self.table.setItem(i, 4, QTableWidgetItem(maru))
            i += 1
        #table.resize(150, 50)
        #self.table.resizeColumnToContents(0)
        self.table.horizontalHeader().setStretchLastSection(True)

        self.table.doubleClicked.connect(self.tableclick)
        mainLayout.addWidget(self.table, 6, 1)
        #mainLayout.addWidget(topFiller)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Book Log")
        #self.csvImport()
        self.loadFromFile('./a.bl')


    def createUI(self):
        self.setWindowTitle('Equipment Manager 0.3')
        #Menu Bar
        fileMenuBar = QMenuBar(self)
        menuFile = QMenu(fileMenuBar)
        actionChangePath = QAction(tr("Change Path"), self)
        fileMenuBar.addMenu(menuFile)
        menuFile.addAction(actionChangePath)



    def addContact(self):
        self.oldTitle = self.titleLine.text()
        self.oldMemo = self.memoText.toPlainText()
        self.oldIsbn = self.isbnLine.text()

        self.titleLine.clear()
        self.memoText.clear()
        self.isbnLine.clear()

        self.updateInterface(self.AddingMode)

    def editContact(self):
        self.oldTitle = self.titleLine.text()
        self.oldMemo = self.memoText.toPlainText()
        self.oldDokuryodate = self.dokuryodate.text()
        self.oldIsbn = self.isbnLine.text()
        self.oldShoziflag = self.shoziflag.isChecked()

        self.updateInterface(self.EditingMode)

    def submitContact(self):
        title = self.titleLine.text()
        memo = self.memoText.toPlainText()
        isbn = self.isbnLine.text()
        dokuryodate = self.dokuryodate.text()
        shoziflag = self.shoziflag.isChecked()

        if title == "" or memo == "":
            QMessageBox.information(self, "Empty Field",
                    "Please enter a title and memo.")
            return

        if self.currentMode == self.AddingMode:
            if title not in self.contacts:
                self.contacts[title] = {'memo':memo, 'dokuryodate':dokuryodate, 'isbn':isbn, 'shoziflag':shoziflag}
                QMessageBox.information(self, "追加しました",
                        "\"%s\" は追加されました。" % title)
            else:
                QMessageBox.information(self, "追加できませんでした",
                        "\"%s\" はすでに存在しています。" % title)
                return

        elif self.currentMode == self.EditingMode:
            if self.oldTitle != title:
                if title not in self.contacts:
                    QMessageBox.information(self, "編集しました",
                            "\"%s\" は編集されました。" % self.oldTitle)
                    del self.contacts[self.oldTitle]
                    self.contacts[title] = memo
                else:
                    QMessageBox.information(self, "編集できませんでした。",
                            "\"%s\"はすでに存在しています。" % title)
                    return
            elif self.oldMemo != memo:
                QMessageBox.information(self, "編集しました",
                        "\"%s\"は編集されました。" % title)
                self.contacts[title] = {memo:memo, dokuryodate:dokuryodate, shoziflag:shoziflag, isbn:isbn }

        self.updateInterface(self.NavigationMode)
    # ボタンの処理
    def cancel(self):
        self.titleLine.setText(self.oldTitle)
        self.memoText.setText(self.oldMemo)
        self.dokuryodate.setDate(self.oldDokuryodate)
        self.shoziflag.setChecked(self.oldShoziflag)
        self.isbnLine.setText(self.oldIsbn)
        self.updateInterface(self.NavigationMode)

    def removeContact(self):
        title = self.titleLine.text()
        memo = self.memoText.toPlainText()

        if title in self.contacts:
            button = QMessageBox.question(self, "Confirm Remove",
                    "Are you sure you want to remove \"%s\"?" % title,
                    QMessageBox.Yes | QMessageBox.No)

            if button == QMessageBox.Yes:
                self.previous()
                del self.contacts[title]

                QMessageBox.information(self, "Remove Successful",
                        "\"%s\" has been removed from your memo book." % title)

        self.updateInterface(self.NavigationMode)

    def next(self):
        title = self.titleLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_title, _ = it.next()

                if this_title == title:
                    next_title, next_memo, next_date = it.next()
                    break
        except StopIteration:
            next_title, next_memo = iter(self.contacts).next()

        self.titleLine.setText(next_title)
        self.memoText.setText(next_memo)

    def previous(self):
        title = self.titleLine.text()

        prev_title = prev_memo = None
        for this_title, this_memo in self.contacts:
            if this_title == title:
                break

            prev_title = this_title
            prev_memo = this_memo
        else:
            self.titleLine.clear()
            self.memoText.clear()
            return

        if prev_title is None:
            for prev_title, prev_memo in self.contacts:
                pass

        self.titleLine.setText(prev_title)
        self.memoText.setText(prev_memo)

    def Contact(self):
        self.dialog.show()

        if self.dialog.exec_() == QDialog.Accepted:
            contactTitle = self.dialog.getFindText()

            found = False
            for this_title, this_memo in self.contacts:
            #    if contactTitle in this_title:
                if re.search(contactTitle, this_title):
                    found = True
                    break



            if found:
                self.titleLine.setText(this_title)
                self.memoText.setText(self.contacts[this_title])
                self.isbnLine.setText(self.contacts[this_title])
                self.dokuryodate.setDate(self.contacts[this_title])
                self.shoziflag.setChecked(self.contacts[this_title])
            else:
                QMessageBox.information(self, "Contact Not Found",
                        "Sorry, \"%s\" is not in your address book." % contactTitle)
                return

        self.updateInterface(self.NavigationMode)
 # ボタンを押せるか押せないかの処理
    def updateInterface(self, mode):
        self.currentMode = mode

        if self.currentMode in (self.AddingMode, self.EditingMode):
            self.titleLine.setReadOnly(False)
            self.titleLine.setFocus(Qt.OtherFocusReason)
            self.isbnLine.setReadOnly(False)
            self.dokuryodate.setReadOnly(False)
            self.memoText.setReadOnly(False)

            self.addButton.setEnabled(False)
            self.editButton.setEnabled(False)
            self.removeButton.setEnabled(False)

            self.nextButton.setEnabled(False)
            self.previousButton.setEnabled(False)

            self.submitButton.show()
            self.cancelButton.show()

            self.loadButton.setEnabled(False)
            self.saveButton.setEnabled(False)
            self.exportButton.setEnabled(False)

        elif self.currentMode == self.NavigationMode:
            if not self.contacts:
                self.titleLine.clear()
                self.memoText.clear()
                self.dokuryodate.clear()
                self.isbnLine.clear()

            self.titleLine.setReadOnly(True)
            self.memoText.setReadOnly(True)
            self.dokuryodate.setReadOnly(True)
            self.shoziflag
            self.isbnLine.setReadOnly(True)
            self.addButton.setEnabled(True)

            number = len(self.contacts)
            self.editButton.setEnabled(number >= 1)
            self.removeButton.setEnabled(number >= 1)
            self.findButton.setEnabled(number > 2)
            self.nextButton.setEnabled(number > 1)
            self.previousButton.setEnabled(number >1 )

            self.submitButton.hide()
            self.cancelButton.hide()

            self.exportButton.setEnabled(number >= 1)

            self.loadButton.setEnabled(True)
            self.saveButton.setEnabled(number >= 1)
            #テーブルの更新
            i = 0
            for title, obj in self.contacts.items():
                titleItem = QTableWidgetItem(title)
                memoItem = QTableWidgetItem()
                memoItem.setData(Qt.DisplayRole, obj['memo'])
                if obj['shoziflag'] == True:
                    maru = '○'
                else:
                    maru = ''

                self.table.setItem(i, 0, titleItem)
                self.table.setItem(i, 1, QTableWidgetItem(obj['isbn']))
                self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate']))
                self.table.setItem(i, 3, QTableWidgetItem(obj['memo']))
                self.table.setItem(i, 4, QTableWidgetItem(maru))

                i += 1


    def saveToFile(self):
        fileTitle, _ = QFileDialog.getSaveFileName(self, "Save book log",
                '', "Book Log (*.bl);;All Files (*)")

        if not fileTitle:
            return

        try:
            out_file = open(str(fileTitle), 'wb')
        except IOError:
            QMessageBox.information(self, "Unable to open file",
                    "There was an error opening \"%s\"" % fileTitle)
            return
        pickle.dump(self.contacts, out_file)
        out_file.close()

    def loadFromFile(self, fileName= None):


        if not fileName:
            fileName, _ = QFileDialog.getOpenFileName(self, "Open Address Book",
                '', "Address Book (*.bl);;All Files (*)")

        try:
            in_file = open(str(fileName), 'rb')
        except IOError:
            QMessageBox.information(self, "Unable to open file",
                    "There was an error opening \"%s\"" % fileName)
            return

        self.contacts = pickle.load(in_file)
        in_file.close()

        if len(self.contacts) == 0:
            QMessageBox.information(self, "No contacts in file",
                    "The file you are attempting to open contains no "
                    "contacts.")
        else:
            for title, obj in self.contacts:
                date = QDate.fromString(obj['dokuryodate'])
                self.titleLine.setText(title)
                self.memoText.setText(obj['memo'])
                self.shoziflag.setChecked(obj['shoziflag'])
                self.isbnLine.setText(obj['isbn'])
                self.dokuryodate.setDate(date)

        self.updateInterface(self.NavigationMode)

    def exportAsVCard(self):
        title = str(self.titleLine.text())
        memo = self.memoText.toPlainText()

        titleList = title.split()

        if len(titleList) > 1:
            firstName = nameList[0]
            lastName = nameList[-1]
        else:
            firstName = name
            lastName = ''

        fileName, _ = QFileDialog.getSaveFileName(self, "Export Contact", '',
                "vCard Files (*.vcf);;All Files (*)")

        if not fileName:
            return

        out_file = QFile(fileName)

        if not out_file.open(QIODevice.WriteOnly):
            QMessageBox.information(self, "Unable to open file",
                    out_file.errorString())
            return

        out_s = QTextStream(out_file)

        out_s << 'BEGIN:VCARD' << '\n'
        out_s << 'VERSION:2.1' << '\n'
        out_s << 'N:' << lastName << ';' << firstName << '\n'
        out_s << 'FN:' << ' '.join(nameList) << '\n'

        address.replace(';', '\\;')
        address.replace('\n', ';')
        address.replace(',', ' ')

        out_s << 'ADR;HOME:;' << address << '\n'
        out_s << 'END:VCARD' << '\n'

        QMessageBox.information(self, "Export Successful",
                "\"%s\" has been exported as a vCard." % name)
    def csvImport(self):
        with open('MediaMarkerExport.csv', newline='', encoding='utf-8') as f:
            reader = csv.reader(f)
            for r in reader:
                if r[2] == 1:
                    flag = True
                else:
                    flag = False
                self.contacts[r[0]] = {'isbn':r[1], 'dokuryodate':r[3].replace('-', '/'), 'shoziflag':flag, 'memo':''}
        aa = 0


    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        #self.fileMenu.addAction(self.newAct)
        #self.fileMenu.addAction(self.openAct)
        #self.fileMenu.addAction(self.saveAct)
        #self.fileMenu.addAction(self.printAct)
        #self.fileMenu.addSeparator()
        #self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.undoAct)
        self.editMenu.addAction(self.redoAct)
        self.editMenu.addSeparator()
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)
        self.editMenu.addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

        self.formatMenu = self.editMenu.addMenu("&Format")
        self.formatMenu.addAction(self.boldAct)
        self.formatMenu.addAction(self.italicAct)
        self.formatMenu.addSeparator().setText("Alignment")
        self.formatMenu.addAction(self.leftAlignAct)
        self.formatMenu.addAction(self.rightAlignAct)
        self.formatMenu.addAction(self.justifyAct)
        self.formatMenu.addAction(self.centerAct)
        self.formatMenu.addSeparator()
        self.formatMenu.addAction(self.setLineSpacingAct)
        self.formatMenu.addAction(self.setParagraphSpacingAct)

    def tableclick(self, mi):
        row = mi.row()
        column = mi.column()
        #QMessageBox.information(self, "Export Successful",
        #        "%d x %d" % (row, column))
        title = self.titleLine.text()
        it = iter(self.contacts)

        try:
            n = 0
            while True:

                next_title, next_obj = it.next()
                if row == n:

                    break
                n += 1
        except StopIteration:
            next_title, next_obj = iter(self.contacts).next()

        self.titleLine.setText(next_title)
        self.memoText.setText(next_obj['memo'])
        self.isbnLine.setText(next_obj['isbn'])
        self.dokuryodate.setDate(next_obj['dokuryodate'])
        self.shoziflag.setChecked(next_obj['shoziflag'])
Esempio n. 30
0
class GCL(QDialog):
    _signal_check_config = QtCore.pyqtSignal(dict)

    def __init__(self, parent=None):
        super(GCL, self).__init__(parent)
        self._signal_check_config.connect(self.check_config_and_init)
        self.init_ui()
        self.init_data()

    def init_ui(self):
        self.create_cmd_input()
        self.create_info_show()
        self.create_po_progressbar_show()

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.gridGroupBox)
        mainLayout.addWidget(self.QGroupBox_info_show)
        mainLayout.addWidget(self.QGridLayout_po_progress)

        mainLayout.setStretchFactor(self.gridGroupBox, 30)
        mainLayout.setStretchFactor(self.QGroupBox_info_show, 65)
        mainLayout.setStretchFactor(self.QGridLayout_po_progress, 5)
        self.setLayout(mainLayout)

    def init_data(self):
        self.net = network()
        self.GCLID_RUNNING_MODEL = None
        self.GET_WEIGHT_THREAD = False
        self.gcl_array = []
        self.weighter = Weighter()
        self.parser_config()
        self.gcl_printer = printer()
        self.check_configuration()

    def create_cmd_input(self):
        self.gridGroupBox = QGroupBox("命令输入区")
        layout = QGridLayout()

        self.station_info = QLabel("工站: GCLID封箱")
        self.station_info.setFont(QFont("Microsoft YaHei", 20))
        layout.addWidget(self.station_info, 0, 0)
        self.station_info.setAlignment(QtCore.Qt.AlignCenter)

        self.po_info = QLabel("订单:")
        self.po_info.setFont(QFont("Microsoft YaHei", 20))
        layout.addWidget(self.po_info, 1, 0)
        self.po_info.setAlignment(QtCore.Qt.AlignCenter)

        self.cmd_input = QLineEdit(self)
        self.cmd_input.setFont(QFont("Microsoft YaHei", 20))
        self.cmd_input.setStyleSheet("color:black")
        self.cmd_input.installEventFilter(self)
        layout.addWidget(self.cmd_input, 2, 0)
        self.cmd_input.returnPressed.connect(self.handle_cmd)

        self.table = QTableWidget(5, 4)
        # auto adapt the width
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # set canot edit the table data
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)

        self.table.setHorizontalHeaderLabels(['类型', '数据', '类型', '数据'])
        font = QFont("Microsoft YaHei", 10)
        self.table.setFont(font)

        newItem = QTableWidgetItem("服务器IP地址")
        self.table.setItem(0, 0, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(0, 1, newItem)
        newItem = QTableWidgetItem("支持的称重机")
        self.table.setItem(0, 2, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(0, 3, newItem)

        newItem = QTableWidgetItem("打印机配置")
        self.table.setItem(1, 0, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(1, 1, newItem)
        newItem = QTableWidgetItem("称重机串口")
        self.table.setItem(1, 2, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(1, 3, newItem)

        newItem = QTableWidgetItem("订单总数")
        self.table.setItem(2, 0, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(2, 1, newItem)
        newItem = QTableWidgetItem("称重机波特率")
        self.table.setItem(2, 2, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(2, 3, newItem)

        newItem = QTableWidgetItem("每箱数量")
        self.table.setItem(3, 0, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(3, 1, newItem)
        newItem = QTableWidgetItem("最大值(单位/克)")
        self.table.setItem(3, 2, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(3, 3, newItem)

        newItem = QTableWidgetItem("已入箱数量")
        self.table.setItem(4, 0, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(4, 1, newItem)
        newItem = QTableWidgetItem("最小值(单位/克)")
        self.table.setItem(4, 2, newItem)
        newItem = QTableWidgetItem("0")
        self.table.setItem(4, 3, newItem)

        layout.addWidget(self.table, 0, 1, 3, 1)
        layout.setColumnStretch(0, 70)
        layout.setColumnStretch(1, 30)
        self.table.setFocusPolicy(QtCore.Qt.NoFocus)
        self.gridGroupBox.setLayout(layout)

    def create_info_show(self):
        self.QGroupBox_info_show = QGroupBox("提示信息")
        layout = QGridLayout()
        print("info show")

        # weight info
        self.weight_info = QLabel(self)
        self.weight_info.setText("感应器重量检测信息")
        self.weight_info.setFont(QFont("Microsoft YaHei", 15))
        self.weight_info.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(self.weight_info, 0, 0, 1, 1)
        self.weight_info.setStyleSheet("border: 1px solid black")

        # info show
        self.info_show = QTextEdit()
        self.info_show.setPlainText("提示信息显示...")
        self.info_show.setFont(QFont("Microsoft YaHei", 20))
        cursor = self.info_show.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.info_show.setTextCursor(cursor)
        self.info_show.setReadOnly(True)
        layout.addWidget(self.info_show, 1, 0, 1, 1)
        self.info_show.setFocusPolicy(QtCore.Qt.NoFocus)

        # QR code name
        self.qr_cmd_name = QLabel(self)
        self.qr_cmd_name.setText("命令码名称")
        self.qr_cmd_name.setFont(QFont("Microsoft YaHei", 15))
        self.qr_cmd_name.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(self.qr_cmd_name, 0, 1, 1, 1)
        self.qr_cmd_name.setStyleSheet("border: 1px solid black")

        # QR code show
        self.qr_cmd = QLabel(self)
        self.qr_cmd.setText("命令码")
        self.qr_cmd.setFont(QFont("Microsoft YaHei", 15))
        self.qr_cmd.setAlignment(QtCore.Qt.AlignCenter)
        self.qr_cmd.setStyleSheet("border: 1px solid black")
        layout.addWidget(self.qr_cmd, 1, 1, 1, 1)

        # QR code name
        self.qr_cmd_name2 = QLabel(self)
        self.qr_cmd_name2.setText("命令码")
        self.qr_cmd_name2.setFont(QFont("Microsoft YaHei", 15))
        self.qr_cmd_name2.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(self.qr_cmd_name2, 0, 2, 1, 1)
        self.qr_cmd_name2.setStyleSheet("border: 1px solid black")

        # QR code show
        self.qr_cmd2 = QLabel(self)
        self.qr_cmd2.setText("命令码")
        self.qr_cmd2.setFont(QFont("Microsoft YaHei", 15))
        self.qr_cmd2.setAlignment(QtCore.Qt.AlignCenter)
        self.qr_cmd2.setStyleSheet("border: 1px solid black")
        layout.addWidget(self.qr_cmd2, 1, 2, 1, 1)

        layout.setColumnStretch(0, 70)
        layout.setColumnStretch(1, 15)
        layout.setColumnStretch(2, 15)
        layout.setRowStretch(0, 10)
        layout.setRowStretch(1, 90)
        self.QGroupBox_info_show.setLayout(layout)

    def create_po_progressbar_show(self):
        self.QGridLayout_po_progress = QGroupBox("订单进度")
        layout = QGridLayout()
        self.procgressbar = QProgressBar(self)
        layout.addWidget(self.procgressbar, 1, 0)
        self.procgressbar.setFont(QFont("Microsoft YaHei", 10))
        self.QGridLayout_po_progress.setLayout(layout)

    def parser_config(self):
        config = "config.ini"
        cur_dir = os.getcwd()
        config_path = os.path.join(cur_dir, config)
        if os.path.exists(config_path):
            conf = configparser.ConfigParser()
            conf.read(config)
            self.tn4cioip = conf.get('Corelight', 'tn4cioip')
            self.gcl_printer_name = conf.get('Printer', 'gcl_printer')
            self.pokey = conf.get('PoInfo', 'pokey')
            self.countrycode = conf.get('PoInfo', 'countrycode')
            self.hwversion = conf.get('PoInfo', 'hwversion')
            self.count_per_carton = conf.get('GclInfo', 'count_one_package')
            self.serialport = conf.get('Weighter', 'serialport')
            self.baudrate = conf.get('Weighter', 'baudrate')
            self.max_weight = conf.get('Weighter', 'max')
            self.min_weight = conf.get('Weighter', 'min')
        else:
            self.info_show.setText(config_path + " 不存在!!!")

    def check_configuration(self):
        t = threading.Thread(target=self.check_configs)
        t.start()

    def check_configs(self):
        msg = "checking configuration"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)

        # 1.check the tn4c.io ip address
        msg = "checking corelight"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)
        ret = self.net.check_tn4cio()
        if ret == True:
            msg = "corelight ip check success"
            data = {"message": msg}
            self._signal_check_config.emit(data)
        elif ret == False:
            msg = "corelight ip check fail"
            data = {"message": msg}
            self._signal_check_config.emit(data)
            return

        # 2.check the po info
        msg = "checking poinfo"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)
        ret = self.net.get_po_info()
        try:
            text = json.loads(ret)
            result = text['result']
            if result == "ok":
                msg = "check poinfo success"
                data = {"message": msg}
                self._signal_check_config.emit(data)
            elif result == "fail":
                msg = "check poinfo fail"
                data = {"message": msg}
                self._signal_check_config.emit(data)
                return
        except Exception:
            msg = "check poinfo fail"
            data = {"message": msg}
            self._signal_check_config.emit(data)
            return
        finally:
            sleep(0.1)

        # 3.check the gcl printer
        msg = "checking printer"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)
        printer_list = self.gcl_printer.list()
        if self.gcl_printer_name in printer_list:
            msg = "check printer success"
            data = {"message": msg}
            self._signal_check_config.emit(data)
        else:
            msg = "check printer fail"
            data = {"message": msg}
            self._signal_check_config.emit(data)
            return

        # 4.check the Serial port
        msg = "checking serial port"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)
        system_port_list = self.weighter.port_list()
        print("port check list:", system_port_list)
        if self.serialport in system_port_list:
            msg = "check serial port success"
            data = {"message": msg}
            self._signal_check_config.emit(data)
        else:
            msg = "check serial port fail"
            data = {"message": msg}
            self._signal_check_config.emit(data)
            return

        # 5.check baudrate
        msg = "checking baudrate"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)
        if self.baudrate == "9600":
            msg = "checking baudrate success"
            data = {"message": msg}
            self._signal_check_config.emit(data)
        else:
            msg = "checking baudrate fail"
            data = {"message": msg}
            self._signal_check_config.emit(data)

        # 6.check the weighter
        msg = "checking weighter"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(0.1)
        weight = self.weighter.get_weight()
        if weight == None:
            msg = "check weighter fail"
            data = {"message": msg}
            self._signal_check_config.emit(data)
            return
        else:
            msg = "check weighter success"
            data = {"message": msg}
            self._signal_check_config.emit(data)

        # 7.check configuration done
        msg = "check configuration done"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(2)

        # 8.init station
        msg = "init station"
        data = {"message": msg}
        self._signal_check_config.emit(data)
        sleep(1)

    def check_config_and_init(self, data):
        text = data
        print("check_config_and_init-----------------------text:", text)
        msg = text['message']

        self.show_po_info()
        if msg == "checking configuration":
            self.info_show.setText("正在检查您的配置信息,请稍等...")
        elif msg == "checking corelight":
            self.info_show.append("\n检查Corelight服务器: " + self.tn4cioip)
        elif msg == "corelight ip check success":
            self.info_show.append("通过")
            self.show_tn4cio_ip()
        elif msg == "corelight ip check fail":
            self.info_show.append("错误:")
            self.info_show.append("Corelight服务器无法连接...")
            self.info_show.append("\n提示:")
            self.info_show.append("1.请检查网络连接状态")
            self.info_show.append("2.找到程序的配置文件config.ini")
            self.info_show.append("3.设置正确的Corelight服务器IP地址并保存")
            self.info_show.append("4.重新启动程序")
        elif msg == "checking poinfo":
            self.info_show.append("\n检查订单信息: " + self.pokey + "-" +
                                  self.countrycode + "-" + self.hwversion)
        elif msg == "check poinfo success":
            self.info_show.append("通过")
        elif msg == "check poinfo fail":
            self.info_show.append("错误:")
            self.info_show.append("订单信息设置错误,请检查确认...")
        elif msg == "checking printer":
            self.info_show.append("\n检查打印机: " + self.gcl_printer_name)
        elif msg == "check printer success":
            self.info_show.append("通过")
            self.show_printer_name()
        elif msg == "check printer fail":
            self.info_show.append("错误:")
            self.info_show.append("1.GCL打印机设置错误,请检查确认...")
            self.info_show.append("2.当前打印机设置: " + self.gcl_printer_name)
            self.info_show.append("\n提示:")
            self.info_show.append("1.请使用USB线连接打印机到本电脑")
            self.info_show.append("2.打开Windows控制面板,找到您的打印机名称")
            self.info_show.append("3.找到程序的配置文件config.ini")
            self.info_show.append("4.设置您的打印机到配置文件中的gcl_printer项并保存")
            self.info_show.append("5.重新启动本程序")
            self.info_show.append("\n当前系统打印机列表:")
            printer_list = self.gcl_printer.list()
            for item in printer_list:
                self.info_show.append(str(item))
        elif msg == "checking serial port":
            self.info_show.append("\n检查串口: " + self.serialport)
        elif msg == "check serial port success":
            self.info_show.append("通过")
            self.show_weighter_port()
        elif msg == "check serial port fail":
            self.info_show.append("错误:")
            self.info_show.append("1.当前称重机串口设置错误,请检查确认...")
            self.info_show.append("2.当前串口设置: " + self.serialport)
            self.info_show.append("\n提示:")
            self.info_show.append("1.请使用称重机ES-6KCC串口线连接到本电脑")
            self.info_show.append("2.打开Windows控制面板,找到您当前称重机串口号")
            self.info_show.append("3.找到程序的配置文件config.ini")
            self.info_show.append("4.设置到配置文件中的serialport项并保存")
            self.info_show.append("5.重新启动本程序")
            self.info_show.append("\n当前系统中的串口:")
            port_list = self.weighter.serial_list()
            for item in port_list:
                self.info_show.append(str(item))
                print("port: ", item)
        elif msg == "checking baudrate":
            self.info_show.append("\n检查波特率: " + self.baudrate)
        elif msg == "checking baudrate success":
            self.info_show.append("通过")
            self.show_weighter_baudrate()
        elif msg == "checking baudrate fail":
            self.info_show.append("错误:")
            self.info_show.append("1.当前称重机串口波特率设置错误,请检查确认...")
            self.info_show.append("2.当前波特率设置: " + self.baudrate)
            self.info_show.append("\n提示:")
            self.info_show.append("1.仅支持称重机型号: ES-6KCC")
            self.info_show.append("2.ES-6KCC 波特率应设置为: 9600")
            self.info_show.append("3.找到程序的配置文件config.ini")
            self.info_show.append("4.设置到配置文件中的baudrate项设置并保存")
            self.info_show.append("5.重新启动本程序")
        elif msg == "checking weighter":
            self.info_show.append("\n检查电子秤: ES-6KCC")
        elif msg == "check weighter success":
            self.info_show.append("通过")
            self.show_weighter_name()
        elif msg == "check weighter fail":
            self.info_show.append("错误:")
            self.info_show.append("无法获取称重机数据")
            self.info_show.append("\n提示:")
            self.info_show.append("1.请使用称重机ES-6KCC串口线连接到本电脑")
            self.info_show.append("2.打开称重机电源开关")
            self.info_show.append("3.重新启动本程序")
        elif msg == "check configuration done":
            self.info_show.append("\n检查完成")
        elif msg == "init station":
            self.init_status()

    def init_status(self):
        self.GCLID_RUNNING_MODEL = None
        # show po info
        self.show_po_info()

        # show tn4c.io ip
        self.show_tn4cio_ip()

        # show GCL printer name
        self.show_printer_name()

        # show number per carton
        self.show_total_one_carton()

        # show the count already in gcl
        self.show_num_already_in_gcl()

        # show the po total
        self.show_po_total()

        self.show_weighter_name()
        self.show_weighter_port()
        self.show_weighter_baudrate()
        self.show_weighter_max()
        self.show_weighter_min()
        self.show_qr_cmd_GCL_START()
        self.qr_GCLID_cancel_show()
        self.show_initiation_msg()

    def handle_cmd(self):
        tmp = self.cmd_input.text()
        cmd = tmp.upper()
        log = "gcl station get cmd:" + cmd
        print(log)
        logging.debug(log)
        self.cmd_input.clear()

        if cmd == "GCLID_START":
            self.GCLID_RUNNING_MODEL = "GCLID_START"
            self.info_show.clear()
            self.cartoning = None
            self.cartoning = Cartoning()
            self.cartoning._signal_cartoning.connect(
                self.update_ui_and_info_show)
            self.qr_CMD_init_show()
            self.qr_GCLID_cancel_show()
            self.gcl_array.clear()
        elif cmd == "GCLID_END":
            self.GCLID_RUNNING_MODEL = "GCLID_END"
            self.cartoning.cartoning_end()
        elif cmd == "GCLID_CANCEL":
            self.cartoning.cartoning_cancel()
        elif cmd == "RESET_GCLID":
            self.GCLID_RUNNING_MODEL = "RESET_GCLID"
            self.info_show.setText("重置整箱模式")
            self.info_show.append("\n提示:")
            self.info_show.append("1.请扫描箱号")
            self.info_show.append("2.或者扫描箱中任意一个感应器MAC地址")
            self.info_show.append("\n如果您需要结束当前操作,请扫描结束命令码...")
            self.gclid_reset_all = gclid_reset_all()
            self.qr_GCLID_END_show()
        elif cmd == "RESET_PARTIAL_SENSOR":
            self.GCLID_RUNNING_MODEL = "RESET_PARTIAL_SENSOR"
            self.info_show.setText("部分重置入箱模式")
            self.info_show.append("\n作业提示:")
            self.info_show.append("请扫描需要重置入箱的感应器MAC地址")
            self.gclid_reset_part = gclid_reset_part()
            self.qr_GCLID_RESET_PART_confirm_show()
            self.qr_GCLID_RESET_PART_cancel_show()
        elif cmd == "GCLID_REPACKAGE":
            self.GCLID_RUNNING_MODEL = "GCLID_REPACKAGE"
            self.info_show.setText("重新入箱模式")
            self.info_show.append("\n提示:")
            self.info_show.append("1.请扫描需要重入箱中的任意一个感应器的MAC地址")
            self.info_show.append("\n如果您需要结束当前操作,请扫描结束命令码...")
            self.qr_GCLID_END_show()
            self.gcl_array.clear()
        elif cmd == "REPRINT_GCLID":
            self.GCLID_RUNNING_MODEL = "REPRINT_GCLID"
            self.gclid_reprint = gclid_reprint()
            self.info_show.setText("重打印GCL模式")
            self.info_show.append("\n提示:")
            self.info_show.append("1.请扫描需要重新打印箱号条码")
            self.info_show.append("2.或者扫描GCL中任意一个感应器MAC地址")
            self.info_show.append("\n如果您需要结束当前操作,请扫描结束命令码...")
            self.qr_GCLID_END_show()
        elif self.GCLID_RUNNING_MODEL == "GCLID_START":
            mac = cmd
            self.cartoning.cartoning_start(mac)
        elif self.GCLID_RUNNING_MODEL == "RESET_GCLID":
            self.gcl_reset_all(cmd)
        elif self.GCLID_RUNNING_MODEL == "RESET_PARTIAL_SENSOR":
            if cmd == "GCLID_RESET_PART_CONFIRM":
                self.gclid_reset_part_start()
            elif cmd == "GCLID_RESET_PART_CANCEL":
                self.gclid_reset_part_cancel()
            else:
                mac = cmd
                self.add_mac_for_gclid_reset_part(mac)
        elif self.GCLID_RUNNING_MODEL == "GCLID_REPACKAGE":
            mac = cmd
            self.gcl_repackage(mac)
        elif self.GCLID_RUNNING_MODEL == "REPRINT_GCLID":
            self.reprint_gclid(cmd)
        else:
            log = "not supported cmd:" + cmd
            print(log)
            logging.debug(log)
            self.info_show.setText("错误:")
            self.info_show.append("无效的命令码:" + cmd)
            self.timer = QTimer()
            self.timer.setInterval(1000)
            self.timer.start()
            self.timer.timeout.connect(self.onTimerOut)

    def gclid_label_preview(self, img):
        file = img
        img = QImage(file, 'PNG')
        width = self.info_show.width()
        preview = img.scaledToWidth(width)
        cursor = self.info_show.textCursor()
        cursor.movePosition(QTextCursor.End)
        cursor.insertImage(preview)

    def onTimerOut(self):
        self.timer.stop()
        self.init_status()

    def check_mac_in_current_gcllist(self, mac):
        if mac in self.gcl_array:
            print("already exist in the gcl list")
            self.info_show.setText("MAC:" + mac + " 已经存在当前的列表中")
            return True
        else:
            return False

    def mac_check(self, addr):
        valid = re.compile(
            r''' 
            (^([0-9A-F]{1,2}[-]){5}([0-9A-F]{1,2})$ 
            |^([0-9A-F]{1,2}[:]){5}([0-9A-F]{1,2})$ 
            |^([0-9A-F]{1,2}[.]){5}([0-9A-F]{1,2})$
            |^([0-9A-F]{1,2}){5}([0-9A-F]{1,2})$
            |^([0-9A-F]{1,2}[-]){7}([0-9A-F]{1,2})$
            |^([0-9A-F]{1,2}[:]){7}([0-9A-F]{1,2})$
            |^([0-9A-F]{1,2}[.]){7}([0-9A-F]{1,2})$
            |^([0-9A-F]{1,2}){7}([0-9A-F]{1,2})$) 
            ''', re.VERBOSE | re.IGNORECASE)
        return valid.match(addr) is not None

    def gcl_reset_all(self, cmd):
        ret = self.gclid_reset_all.reset_all(cmd)
        if ret is None:
            self.info_show.setText("重置箱号网络错误")
        elif ret == False:
            self.info_show.setText("重置箱号网络错误")
        elif ret == "corelight return data error":
            self.info_show.setText("重置箱号网络错误")
        elif ret == "no sensor in current gclid":
            self.info_show.setText("当前的箱号中不存在感应器")
        elif ret == "find mac fail":
            self.info_show.setText("当前感应器MAC: " + cmd + " 不存在数据库中")
        elif ret == "sensor not in gcl":
            self.info_show.setText("当前感应器MAC: " + cmd + " 还没有入箱")
        elif ret == "gcl reset all fail":
            self.info_show.setText("重置箱号错误")
        else:
            reset_gcl_id = ret['reset_gcl_id']
            reset_gcl_count = ret['reset_gcl_count']
            self.info_show.setText("重置箱号完成:")
            self.info_show.append("重置箱号: " + reset_gcl_id)
            self.info_show.append("重置数量: " + reset_gcl_count)

        self.show_num_already_in_gcl()
        self.info_show.append("\n即将5秒后自动回到初始状态...")
        self.timer = QTimer()
        self.timer.setInterval(5000)
        self.timer.start()
        self.timer.timeout.connect(self.onTimerOut)

    def add_mac_for_gclid_reset_part(self, macaddress):
        mac = macaddress
        log = "gclid reset part sensor mac:" + mac
        print(log)
        logging.debug(log)

        ret = self.gclid_reset_part.set_gcl_reset_part_list(mac)
        if ret == "already in list":
            self.info_show.setText("当前MAC: " + mac + " 已经扫描\n")
        elif ret == "not exist":
            self.info_show.setText("当前MAC: " + mac + " 数据库中不存在\n")
        elif ret == "not in gcl":
            self.info_show.setText("当前MAC: " + mac + " 还未入箱\n")
        elif ret == True:
            self.info_show.setText("确认重置请扫描确认命令码,取消操作请扫描取消命令码\n")

        mac_list = self.gclid_reset_part.get_gcl_reset_part_list()
        count = len(mac_list)
        self.info_show.append("重置感应器,数量: " + str(count) + " 详细列表:")
        for item in mac_list:
            self.info_show.append(item)

    def gclid_reset_part_start(self):
        ret = self.gclid_reset_part.do_gclid_reset_part()
        if ret == False:
            pass
        else:
            gclid = ret['gclid']
            reset_count = ret['reset_count']
            gcl_count = ret['gcl_count']

            self.info_show.setText("重置感应器完成:\n")
            self.info_show.append("重置箱号: " + str(gclid))
            self.info_show.append("重置数量: " + str(reset_count))
            self.info_show.append("剩余数量: " + str(gcl_count))

        self.info_show.append("即将5秒后自动回到初始状态")
        self.show_num_already_in_gcl()
        self.timer = QTimer()
        self.timer.setInterval(5000)
        self.timer.start()
        self.timer.timeout.connect(self.onTimerOut)

    def gclid_reset_part_cancel(self):
        self.info_show.setText("取消重置GCL:")
        self.gclid_reset_part.clear_gcl_reset_part_list()
        self.show_num_already_in_gcl()
        self.timer = QTimer()
        self.timer.setInterval(1000)
        self.timer.start()
        self.timer.timeout.connect(self.onTimerOut)

    def gcl_repackage(self, macaddress):
        mac = macaddress
        log = "start gcl_repackage mac:" + mac
        print(log)
        logging.debug(log)

        gcl_count = len(self.gcl_array)
        # first time get the mac list info by macaddress
        if gcl_count == 0:
            ret = self.net.get_gcl_info_by_mac(mac)
            if ret != None:
                print(ret)
                text = json.loads(ret)
                result = text['result']
                msg_type = text['messages'][0]['type']
                msg = text['messages'][0]['message']
                if result == "ok":
                    gcl_id = text['messages'][0]['gcl_id']
                    mac_list = text['messages'][0]['gcl_mac_list']
                    count = len(mac_list)
                    self.info_show.setText("重入箱模式,当前GCL箱号: " + gcl_id +
                                           " 数量: " + str(count) + " 个")
                    print("get mac list:------", mac_list)

                    for mac in mac_list:
                        self.gcl_array.append(mac)
                    self.show_num_already_in_gcl()
                elif result == "fail":
                    if msg == "find mac fail":
                        self.info_show.setText("当前感应器MAC: " + mac + " 不在数据库中")
                    elif msg == "sensor not in gcl":
                        self.info_show.setText("当前感应器MAC: " + mac + " 还没有入箱")
            else:
                self.info_show.setText("重入箱网络错误")
            self.info_show.append("\n提示:")
            self.info_show.append("1.继续尝试扫描其他感应器的MAC地址...")
            self.info_show.append("2.如果您需要结束当前操作,请扫描以下命令码...")
            self.qr_GCLID_END_show()
        # this time, we add new sensor mac into the self.gcl_array
        elif gcl_count >= 1:
            print("gcl repackage mode add mac")
            check = self.mac_check(mac)
            if check is False:
                self.info_show.setText("重入箱模式,无效的MAC地址: " + mac)
                self.info_show.append("\n提示:")
                self.info_show.append("继续尝试扫描其他感应器的MAC地址...")
                return False
            else:
                if self.check_mac_in_current_gcllist(mac) == False:
                    self.gcl_array.append(mac)
                    count = len(self.gcl_array)
                    self.info_show.setText("重入箱模式,添加MAC地址: " + mac + " 数量: " +
                                           str(count))
                    self.show_num_already_in_gcl()
            self.info_show.append("\n提示:")
            self.info_show.append("如果您需要结束当前入箱,重新生成GCL然后打印,请扫描以下命令码...")
            self.qr_GCLID_END_show()

    def reprint_gclid(self, cmd):
        ret = self.gclid_reprint.get_file(cmd)
        print("------------------reprint_gclid------------------ret:", ret)

        if ret == None or ret == False:
            self.info_show.setText("错误:")
            self.info_show.append("网络错误")
        elif ret == "corelight return data is none":
            self.info_show.setText("错误:")
            self.info_show.append("服务器返回错误")
        elif ret == "not valid macaddress":
            self.info_show.setText("错误:")
            self.info_show.append("无效的MAC地址: " + cmd)
        elif ret == "gclid not valid":
            self.info_show.setText("错误:")
            self.info_show.append("无效的箱号: " + cmd)
        elif ret == "find mac fail":
            self.info_show.setText("错误:")
            self.info_show.append("当前MAC: " + cmd + " 不在订单中")
        elif ret == "sensor not in gcl":
            self.info_show.setText("错误:")
            self.info_show.append("当前MAC: " + cmd + " 还未入箱")
        elif ret == "gcl file not fond":
            self.info_show.setText("错误:")
            self.info_show.append("当前MAC: " + cmd + " 对应的GCL文件找不到")
        else:
            filepath_list = ret
            count = len(filepath_list)
            self.info_show.setText("重打印GCL成功")
            self.info_show.append("\nGCL数量: " + str(count))
            for filepath in filepath_list:
                filename = os.path.basename(filepath)
                self.info_show.append(filename)
            self.info_show.append("\n")

            for filepath in filepath_list:
                self.gclid_label_preview(filepath)
                self.gclid_reprint.print(filepath)

        self.info_show.append("\n5秒后自动回到初始界面")
        self.timer = QTimer()
        self.timer.setInterval(5000)
        self.timer.start()
        self.timer.timeout.connect(self.onTimerOut)

    def clear_show_weight_intime(self):
        self.weight_info.setText("感应器重量检测信息")
        self.weight_info.setStyleSheet("border: 1px solid black; color:black")

    def check_weight_valid(self, sensor_weight):
        weight = sensor_weight
        weight = float(weight)

        if weight < 0:
            self.info_show.setText("错误:")
            self.info_show.append("1.当前称重: " + str(weight))
            self.info_show.append("2.请将移除电子称上物品,然后设置归零")
            self.info_show.append("3.重新称重")
            return False

        if weight < 0.5:
            self.info_show.setText("提示:")
            self.info_show.append("1.当前称重: " + str(weight))
            self.info_show.append("2.请将感应器放置电子称上称重")
            return False

        if weight >= float(self.min_weight) and weight <= float(
                self.max_weight):
            self.info_show.setText("提示:")
            self.info_show.append("当前称重: " + str(weight))
            count = len(self.gcl_array)
            self.info_show.append("当前入箱数量: " + str(count))
            self.info_show.append("\n如果您需要结束当前操作,请扫描以下命令码...")
            self.qr_GCLID_END_show()
            return True
        else:
            self.info_show.setText("错误:")
            self.info_show.append("该感应器重量异常,请检查包装是否缺件")
            self.info_show.append("\n当前称重: " + str(weight))
            self.info_show.append("最小值: " + str(self.min_weight))
            self.info_show.append("最大值: " + str(self.max_weight))
            self.info_show.append("\n如果您需要结束当前操作,请扫描以下命令码...")
            self.qr_GCLID_END_show()
            return False

    def show_initiation_msg(self):
        self.info_show.setText("作业提示:")
        self.info_show.append("请扫描右侧命令码开始入箱")

    def show_po_info(self):
        info = "订单: " + self.pokey + "-" + self.countrycode + "-" + self.hwversion
        self.po_info.setText(info)

    def show_tn4cio_ip(self):
        val = QTableWidgetItem(self.tn4cioip)
        self.table.setItem(0, 1, val)

    def show_printer_name(self):
        val = QTableWidgetItem(self.gcl_printer_name)
        self.table.setItem(1, 1, val)

    def show_po_total(self):
        obj = self.net.get_po_info()
        if obj == None:
            self.info_show.setText("GCL获取PO信息,解析JSON数据错误!")
            return
        text = json.loads(obj)
        result = text['result']
        msg_type = text['messages'][0]['type']

        if result == "fail":
            self.info_show.setText("错误:当前的订单不存在,请检查您的设置信息")
        elif result == "ok":
            total = text['messages'][0]['total']
            desc = text['messages'][0]['description']
            # show the total number
            tmp = QTableWidgetItem(str(total))
            self.table.setItem(2, 1, tmp)

    def show_total_one_carton(self):
        val = QTableWidgetItem(str(self.count_per_carton))
        self.table.setItem(3, 1, val)

    def show_num_already_in_gcl(self):
        ret = self.net.get_count_already_in_gcl()
        if ret != None:
            text = json.loads(ret)
            result = text['result']
            msg_type = text['messages'][0]['type']
            msg = text['messages'][0]['message']
            if result == "ok":
                total = text['messages'][0]['total']
                count = text['messages'][0]['count_gcl']
                tmp = QTableWidgetItem(str(count))
                self.table.setItem(4, 1, tmp)

                process = int(count) * 100 // int(total)
                self.show_po_process(process)
        else:
            pass

    def show_weighter_name(self):
        name = "ES-6KCC"
        item = QTableWidgetItem(name)
        self.table.setItem(0, 3, item)

    def show_weighter_port(self):
        port = self.serialport
        item = QTableWidgetItem(port)
        self.table.setItem(1, 3, item)

    def show_weighter_baudrate(self):
        baudrate = self.baudrate
        item = QTableWidgetItem(baudrate)
        self.table.setItem(2, 3, item)

    def show_weighter_max(self):
        val = self.max_weight
        item = QTableWidgetItem(val)
        self.table.setItem(3, 3, item)

    def show_weighter_min(self):
        val = self.min_weight
        item = QTableWidgetItem(val)
        self.table.setItem(4, 3, item)

    def show_qr_cmd_GCL_START(self):
        self.qr_cmd_name.setText("开始封箱命令码")
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=6,
            border=1,
        )
        qr.add_data('GCLID_START')
        qr.make(fit=True)
        img = qr.make_image()
        img_path = os.path.join(os.getcwd(), "GCLID_START.png")
        img.save(img_path)

        if os.path.exists(img_path):
            qr_cmd = QPixmap(img_path)
            self.qr_cmd.setPixmap(qr_cmd)
            os.remove(img_path)

    def qr_GCLID_END_show(self):
        self.qr_cmd_name.setText("确认封箱命令码")
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=6,
            border=1,
        )
        qr.add_data('GCLID_END')
        qr.make(fit=True)
        img = qr.make_image()
        img_path = os.path.join(os.getcwd(), "GCLID_END.png")
        img.save(img_path)

        if os.path.exists(img_path):
            qr_cmd = QPixmap(img_path)
            self.qr_cmd.setPixmap(qr_cmd)
            os.remove(img_path)

    def qr_CMD_init_show(self):
        self.qr_cmd_name.setText("命令码名称")
        self.qr_cmd.setText("无")

    def qr_GCLID_RESET_PART_confirm_show(self):
        self.qr_cmd_name.setText("确认重置命令码")
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=6,
            border=1,
        )
        qr.add_data('GCLID_RESET_PART_CONFIRM')
        qr.make(fit=True)
        img = qr.make_image()
        img_path = os.path.join(os.getcwd(), "GCLID_RESET_PART_CONFIRM.png")
        img.save(img_path)

        if os.path.exists(img_path):
            qr_cmd = QPixmap(img_path)
            self.qr_cmd.setPixmap(qr_cmd)
            os.remove(img_path)

    def qr_GCLID_RESET_PART_cancel_show(self):
        self.qr_cmd_name2.setText("取消重置命令码")
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=6,
            border=1,
        )
        qr.add_data('GCLID_RESET_PART_CANCEL')
        qr.make(fit=True)
        img = qr.make_image()
        img_path = os.path.join(os.getcwd(), "GCLID_RESET_PART_CANCEL.png")
        img.save(img_path)

        if os.path.exists(img_path):
            tmp = QPixmap(img_path)
            self.qr_cmd2.setPixmap(tmp)
            os.remove(img_path)

    def qr_GCLID_cancel_show(self):
        self.qr_cmd_name2.setText("取消封箱命令码")
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=6,
            border=1,
        )
        qr.add_data('GCLID_CANCEL')
        qr.make(fit=True)
        img = qr.make_image()
        img_path = os.path.join(os.getcwd(), "GCLID_CANCEL.png")
        img.save(img_path)

        if os.path.exists(img_path):
            tmp = QPixmap(img_path)
            self.qr_cmd2.setPixmap(tmp)
            os.remove(img_path)

    def show_po_process(self, value):
        val = int(value)
        if val <= 0:
            val = 0

        if val >= 100:
            val = 100
        self.procgressbar.setValue(val)

    def check_and_show_weight_intime(self, value):
        weight = value
        weight = float(weight)

        if weight < 0:
            info = "当前称重: " + str(weight) + " 请将移除电子称上物品,然后设置归零"
        elif weight < 0.5:
            info = "当前感应器重量: " + str(weight) + " ,请将感应器放置电子称上称重"
            self.weight_info.setStyleSheet(
                "border: 1px solid black; color:red")
        elif weight >= float(self.min_weight) and weight <= float(
                self.max_weight):
            info = "当前感应器重量: " + str(weight) + " ,该感应器重量正常,请扫描MAC地址"
            self.weight_info.setStyleSheet(
                "border: 1px solid black; color:green")
        else:
            info = "当前感应器重量: " + str(weight) + " 不符合设定范围, 该感应器重量异常,请检查包装是否缺件"
            self.weight_info.setStyleSheet(
                "border: 1px solid black; color:red")
        self.weight_info.setText(info)

    def update_ui_and_info_show(self, data: dict):
        text = data
        print(text)
        logging.debug(text)

        try:
            msg = text['message']

            if msg == "macaddress check is not valid":
                macaddress = text['macaddress']
                self.info_show.setText("错误:")
                self.info_show.append("MAC: " + macaddress + " 不是有效的MAC地址")
            elif msg == "macaddress already in cartoning list":
                macaddress = text['macaddress']
                self.info_show.setText("MAC: " + macaddress + "已经存在当前的列表中")
            elif msg == "pre station done check success":
                self.info_show.append("整机FTS测试检查通过")
            elif msg == "pre station done check fail":
                macaddress = text['macaddress']
                self.info_show.setText("错误:")
                self.info_show.append("MAC: " + macaddress +
                                      " 整机FTS测试未完成,请检查确认")
            elif msg == "macaddress is already cartoned":
                macaddress = text['macaddress']
                self.info_show.setText("MAC: " + macaddress + " 已经入箱")
            elif msg == "macaddress is not found in current po":
                macaddress = text['macaddress']
                self.info_show.setText("MAC: " + macaddress + "不在当前的订单中")
            elif msg == "macaddress added in cartoning list success":
                macaddress = text['macaddress']
                total = text['total']
                maclist = text['maclist']
                self.info_show.setText("入箱MAC: " + macaddress + " 数量: " +
                                       total)

                cursor = self.info_show.textCursor()
                cursor.movePosition(QTextCursor.End)
                cursor.insertText("\n\n")
                # self.info_show.setFont(QFont("Microsoft YaHei", 15))
                data_str = None
                for mac in maclist:
                    if data_str is None:
                        data_str = mac
                    else:
                        data_str = data_str + " - " + mac
                cursor.insertText(data_str)
            elif msg == "download carton label success":
                filename = text['filename']
                self.info_show.setText(filename)
                self.info_show.append("打印包箱条码完成,请将该感应器按要求放入大包箱")
                self.info_show.append("并按要求将包箱条码粘贴到大包箱上")
                self.gclid_label_preview(filename)
            elif msg == "update sensor weight intime":
                weight = text['weight']
                self.check_and_show_weight_intime(weight)
            elif msg == "thread get sensor weight already stoped":
                self.clear_show_weight_intime()
            elif msg == "cartoning end":
                self.info_show.setText("正在结束入箱,请等待完成")
            elif msg == "carton is full catroning auto end":
                total = text['total']
                self.info_show.setText("该箱已满,正在结束入箱,请等待自动完成,数量: " + total)
            elif msg == "cartoning end done":
                self.timer = QTimer()
                self.timer.setInterval(5000)
                self.timer.start()
                self.timer.timeout.connect(self.onTimerOut)
            elif msg == "cartoning cancel done":
                self.info_show.setText("取消入箱操作")
                self.timer = QTimer()
                self.timer.setInterval(2000)
                self.timer.start()
                self.timer.timeout.connect(self.onTimerOut)
            else:
                print("message not support:", msg)
        except Exception as e:
            print(e)
            logging.debug(e)

    def stop_all_thread(self):
        try:
            self.cartoning.cartoning_cancel()
        except Exception:
            pass
Esempio n. 31
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.curFile = ''

        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()

        self.readSettings()

        self.textEdit.document().contentsChanged.connect(self.documentWasModified)

        self.setCurrentFile('')

    def closeEvent(self, event):
        if self.maybeSave():
            self.writeSettings()
            event.accept()
        else:
            event.ignore()

    def newFile(self):
        if self.maybeSave():
            self.textEdit.clear()
            self.setCurrentFile('')

    def open(self):
        if self.maybeSave():
            fileName, _ = QFileDialog.getOpenFileName(self)
            if fileName:
                self.loadFile(fileName)

    def save(self):
        if self.curFile:
            return self.saveFile(self.curFile)

        return self.saveAs()

    def saveAs(self):
        fileName, _ = QFileDialog.getSaveFileName(self)
        if fileName:
            return self.saveFile(fileName)

        return False

    def about(self):
        QMessageBox.about(self, "About Application",
                "The <b>Application</b> example demonstrates how to write "
                "modern GUI applications using Qt, with a menu bar, "
                "toolbars, and a status bar.")

    def documentWasModified(self):
        self.setWindowModified(self.textEdit.document().isModified())

    def createActions(self):
        root = QFileInfo(__file__).absolutePath()

        self.newAct = QAction(QIcon(root + '/images/new.png'), "&New", self,
                shortcut=QKeySequence.New, statusTip="Create a new file",
                triggered=self.newFile)

        self.openAct = QAction(QIcon(root + '/images/open.png'), "&Open...",
                self, shortcut=QKeySequence.Open,
                statusTip="Open an existing file", triggered=self.open)

        self.saveAct = QAction(QIcon(root + '/images/save.png'), "&Save", self,
                shortcut=QKeySequence.Save,
                statusTip="Save the document to disk", triggered=self.save)

        self.saveAsAct = QAction("Save &As...", self,
                shortcut=QKeySequence.SaveAs,
                statusTip="Save the document under a new name",
                triggered=self.saveAs)

        self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
                statusTip="Exit the application", triggered=self.close)

        self.cutAct = QAction(QIcon(root + '/images/cut.png'), "Cu&t", self,
                shortcut=QKeySequence.Cut,
                statusTip="Cut the current selection's contents to the clipboard",
                triggered=self.textEdit.cut)

        self.copyAct = QAction(QIcon(root + '/images/copy.png'), "&Copy", self,
                shortcut=QKeySequence.Copy,
                statusTip="Copy the current selection's contents to the clipboard",
                triggered=self.textEdit.copy)

        self.pasteAct = QAction(QIcon(root + '/images/paste.png'), "&Paste",
                self, shortcut=QKeySequence.Paste,
                statusTip="Paste the clipboard's contents into the current selection",
                triggered=self.textEdit.paste)

        self.aboutAct = QAction("&About", self,
                statusTip="Show the application's About box",
                triggered=self.about)

        self.aboutQtAct = QAction("About &Qt", self,
                statusTip="Show the Qt library's About box",
                triggered=QApplication.instance().aboutQt)

        self.cutAct.setEnabled(False)
        self.copyAct.setEnabled(False)
        self.textEdit.copyAvailable.connect(self.cutAct.setEnabled)
        self.textEdit.copyAvailable.connect(self.copyAct.setEnabled)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator();
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.saveAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings("Trolltech", "Application Example")
        pos = settings.value("pos", QPoint(200, 200))
        size = settings.value("size", QSize(400, 400))
        self.resize(size)
        self.move(pos)

    def writeSettings(self):
        settings = QSettings("Trolltech", "Application Example")
        settings.setValue("pos", self.pos())
        settings.setValue("size", self.size())

    def maybeSave(self):
        if self.textEdit.document().isModified():
            ret = QMessageBox.warning(self, "Application",
                    "The document has been modified.\nDo you want to save "
                    "your changes?",
                    QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)

            if ret == QMessageBox.Save:
                return self.save()

            if ret == QMessageBox.Cancel:
                return False

        return True

    def loadFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.ReadOnly | QFile.Text):
            QMessageBox.warning(self, "Application",
                    "Cannot read file %s:\n%s." % (fileName, file.errorString()))
            return

        inf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        self.textEdit.setPlainText(inf.readAll())
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName)
        self.statusBar().showMessage("File loaded", 2000)

    def saveFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.WriteOnly | QFile.Text):
            QMessageBox.warning(self, "Application",
                    "Cannot write file %s:\n%s." % (fileName, file.errorString()))
            return False

        outf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        outf << self.textEdit.toPlainText()
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName);
        self.statusBar().showMessage("File saved", 2000)
        return True

    def setCurrentFile(self, fileName):
        self.curFile = fileName
        self.textEdit.document().setModified(False)
        self.setWindowModified(False)

        if self.curFile:
            shownName = self.strippedName(self.curFile)
        else:
            shownName = 'untitled.txt'

        self.setWindowTitle("%s[*] - Application" % shownName)

    def strippedName(self, fullFileName):
        return QFileInfo(fullFileName).fileName()
Esempio n. 32
0
class MainWindow(QMainWindow):
    receiveUpdateSignal = pyqtSignal(str)
    errorSignal = pyqtSignal(str)
    showSerialComboboxSignal = pyqtSignal()
    setDisableSettingsSignal = pyqtSignal(bool)
    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()

    def __del__(self):
        pass

    def initTool(self):
        self.com = serial.Serial()

    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)
        settingLayout.setStretch(2, 2)

        # right functional layout
        self.filePathWidget = QLineEdit()
        self.openFileButton = QPushButton("Open File")
        self.sendFileButton = QPushButton("Send File")
        self.clearHistoryButton = QPushButton("Clear History")
        self.addButton = QPushButton(parameters.strAdd)
        fileSendGroupBox = QGroupBox(parameters.strSendFile)
        fileSendGridLayout = QGridLayout()
        fileSendGridLayout.addWidget(self.filePathWidget, 0, 0, 1, 1)
        fileSendGridLayout.addWidget(self.openFileButton, 0, 1, 1, 1)
        fileSendGridLayout.addWidget(self.sendFileButton, 1, 0, 1, 2)
        fileSendGroupBox.setLayout(fileSendGridLayout)
        sendFunctionalLayout.addWidget(fileSendGroupBox)
        sendFunctionalLayout.addWidget(self.clearHistoryButton)
        sendFunctionalLayout.addWidget(self.addButton)
        sendFunctionalLayout.addStretch(1)
        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()
        print("config file path:", parameters.configFilePath)

    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.showSerialComboboxSignal.connect(self.showCombobox)
        # self.showBaudComboboxSignal.connect(self.showBaudCombobox)
        self.setDisableSettingsSignal.connect(self.setDisableSettings)
        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.openFileButton.clicked.connect(self.selectFile)
        self.sendFileButton.clicked.connect(self.sendFile)
        self.clearHistoryButton.clicked.connect(self.clearHistory)
        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)

        self.myObject = MyClass(self)
        slotLambda = lambda: self.indexChanged_lambda(self.myObject)
        self.serialPortCombobox.currentIndexChanged.connect(slotLambda)

    # @QtCore.pyqtSlot(str)
    def indexChanged_lambda(self, obj):
        mainObj = obj.arg
        # print("item changed:",mainObj.serialPortCombobox.currentText())
        self.serialPortCombobox.setToolTip(
            mainObj.serialPortCombobox.currentText())

    def openCloseSerialProcess(self):
        try:
            if self.com.is_open:
                self.receiveProgressStop = True
                self.com.close()
                self.setDisableSettingsSignal.emit(False)
            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
                    self.com.open()
                    # print("open success")
                    # print(self.com)
                    self.setDisableSettingsSignal.emit(True)
                    self.receiveProcess = threading.Thread(
                        target=self.receiveData)
                    self.receiveProcess.setDaemon(True)
                    self.receiveProcess.start()
                except Exception as e:
                    self.com.close()
                    self.receiveProgressStop = True
                    self.errorSignal.emit(parameters.strOpenFailed + "\n" +
                                          str(e))
                    self.setDisableSettingsSignal.emit(False)
        except Exception as e:
            print(e)

    def setDisableSettings(self, disable):
        if disable:
            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)
        else:
            self.serialOpenCloseButton.setText(parameters.strOpen)
            self.statusBarStauts.setText("<font color=%s>%s</font>" %
                                         ("#f31414", parameters.strClosed))
            self.serialPortCombobox.setDisabled(False)
            self.serailBaudrateCombobox.setDisabled(False)
            self.serailParityCombobox.setDisabled(False)
            self.serailStopbitsCombobox.setDisabled(False)
            self.serailBytesCombobox.setDisabled(False)
            self.programExitSaveParameters()

    def openCloseSerial(self):
        t = threading.Thread(target=self.openCloseSerialProcess)
        t.setDaemon(True)
        t.start()

    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()

    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)

    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

    def receiveData(self):
        self.receiveProgressStop = False
        self.timeLastReceive = 0
        while (not self.receiveProgressStop):
            try:
                # length = self.com.in_waiting
                length = max(1, min(2048, self.com.in_waiting))
                bytes = self.com.read(length)
                if bytes != None:

                    # if self.isWaveOpen:
                    #     self.wave.displayData(bytes)
                    self.receiveCount += len(bytes)
                    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()
                    if self.receiveSettingsHex.isChecked():
                        strReceived = self.asciiB2HexString(bytes)
                        self.receiveUpdateSignal.emit(strReceived)
                    else:
                        self.receiveUpdateSignal.emit(
                            bytes.decode(self.encodingCombobox.currentText(),
                                         "ignore"))
            except Exception as e:
                # print("receiveData error")
                # if self.com.is_open and not self.serialPortCombobox.isEnabled():
                #     self.openCloseSerial()
                #     self.serialPortCombobox.clear()
                #     self.detectSerialPort()
                if 'multiple access' in str(e):
                    self.errorSignal.emit(
                        "device disconnected or multiple access on port?")
                break
            # time.sleep(0.009)

    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))

    def onSendSettingsHexClicked(self):

        data = self.sendArea.toPlainText().replace("\n", "\r\n")
        data = self.asciiB2HexString(data.encode())
        self.sendArea.clear()
        self.sendArea.insertPlainText(data)

    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")

    def sendHistoryIndexChanged(self):
        self.sendArea.clear()
        self.sendArea.insertPlainText(self.sendHistory.currentText())

    def clearReceiveBuffer(self):
        self.receiveArea.clear()
        self.receiveCount = 0
        self.sendCount = 0
        self.receiveUpdateSignal.emit(None)

    def MoveToCenter(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def errorHint(self, str):
        QMessageBox.information(self, str, str)

    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 showCombobox(self):
        self.serialPortCombobox.showPopup()

    def detectSerialPortProcess(self):
        while (1):
            portList = self.findSerialPort()
            if len(portList) > 0:
                currText = self.serialPortCombobox.currentText()
                self.serialPortCombobox.clear()
                for i in portList:
                    showStr = str(i[0]) + " " + str(i[1])
                    if i[0].startswith("/dev/cu.Bluetooth-Incoming-Port"):
                        continue
                    self.serialPortCombobox.addItem(showStr)
                index = self.serialPortCombobox.findText(currText)
                if index >= 0:
                    self.serialPortCombobox.setCurrentIndex(index)
                else:
                    self.serialPortCombobox.setCurrentIndex(0)
                break
            time.sleep(1)
        self.showSerialComboboxSignal.emit()
        self.isDetectSerialPort = False

    def sendHistoryFindDelete(self, str):
        self.sendHistory.removeItem(self.sendHistory.findText(str))

    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(parameters.configFilePath, "wb")
        f.truncate()
        pickle.dump(paramObj, f)
        pickle.dump(paramObj.sendHistoryList, f)
        f.close()

    def programStartGetSavedParameters(self):
        paramObj = parameters.ParametersToSave()
        try:
            f = open(parameters.configFilePath, "rb")
            paramObj = pickle.load(f)
            paramObj.sendHistoryList = pickle.load(f)
            f.close()
        except Exception as e:
            f = open(parameters.configFilePath, "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

    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()

    def keyReleaseEvent(self, event):
        if event.key() == Qt.Key_Control:
            self.keyControlPressed = False

    def sendAreaFontChanged(self, font):
        print("font changed")

    def functionAdd(self):
        QMessageBox.information(self, "On the way", "On the way")

    def showHideSettings(self):
        if self.isHideSettings:
            self.showSettings()
            self.isHideSettings = False
        else:
            self.hideSettings()
            self.isHideSettings = True

    def showSettings(self):
        self.settingWidget.show()
        self.settingsButton.setStyleSheet(
            parameters.strStyleShowHideButtonLeft.replace(
                "$DataPath", self.DataPath))

    def hideSettings(self):
        self.settingWidget.hide()
        self.settingsButton.setStyleSheet(
            parameters.strStyleShowHideButtonRight.replace(
                "$DataPath", self.DataPath))

    def showHideFunctional(self):
        if self.isHideFunctinal:
            self.showFunctional()
            self.isHideFunctinal = False
        else:
            self.hideFunctional()
            self.isHideFunctinal = True

    def showFunctional(self):
        self.functionalWiget.show()
        self.functionalButton.setStyleSheet(
            parameters.strStyleShowHideButtonRight.replace(
                "$DataPath", self.DataPath))

    def hideFunctional(self):
        self.functionalWiget.hide()
        self.functionalButton.setStyleSheet(
            parameters.strStyleShowHideButtonLeft.replace(
                "$DataPath", self.DataPath))

    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))

    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())

    def selectFile(self):
        oldPath = self.filePathWidget.text()
        if oldPath == "":
            oldPath = os.getcwd()
        fileName_choose, filetype = QFileDialog.getOpenFileName(
            self, "SelectFile", oldPath, "All Files (*);;")

        if fileName_choose == "":
            return
        self.filePathWidget.setText(fileName_choose)

    def sendFile(self):
        filename = self.filePathWidget.text()
        if not os.path.exists(filename):
            self.errorSignal.emit("File path error\npath:%s" % (filename))
            return
        try:
            f = open(filename, "rb")
        except Exception as e:
            self.errorSignal.emit("Open file %s failed! \n %s" %
                                  (filename, str(e)))
            return
        self.com.write(f.read())  #TODO: optimize send in new thread
        f.close()

    def clearHistory(self):
        self.param.sendHistoryList.clear()
        self.sendHistory.clear()
        self.errorSignal.emit("History cleared!")

    def autoUpdateDetect(self):
        auto = autoUpdate.AutoUpdate()
        if auto.detectNewVersion():
            auto.OpenBrowser()

    def openDevManagement(self):
        os.system('start devmgmt.msc')
Esempio n. 33
0
class AddressBook(QWidget):
    def __init__(self, parent=None):
        super(AddressBook, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldName = ''
        self.oldAddress = ''

        nameLabel = QLabel("Name:")
        self.nameLine = QLineEdit()
        self.nameLine.setReadOnly(True)

        addressLabel = QLabel("Address:")
        self.addressText = QTextEdit()
        self.addressText.setReadOnly(True)

        self.addButton = QPushButton("&Add")
        self.addButton.show()
        self.submitButton = QPushButton("&Submit")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&Cancel")
        self.cancelButton.hide()

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.cancelButton.clicked.connect(self.cancel)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton, Qt.AlignTop)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addStretch()

        mainLayout = QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addLayout(buttonLayout1, 1, 2)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Address Book")

    def addContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.nameLine.clear()
        self.addressText.clear()

        self.nameLine.setReadOnly(False)
        self.nameLine.setFocus(Qt.OtherFocusReason)
        self.addressText.setReadOnly(False)

        self.addButton.setEnabled(False)
        self.submitButton.show()
        self.cancelButton.show()

    def submitContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name == "" or address == "":
            QMessageBox.information(self, "Empty Field",
                    "Please enter a name and address.")
            return

        if name not in self.contacts:
            self.contacts[name] = address
            QMessageBox.information(self, "Add Successful",
                    "\"%s\" has been added to your address book." % name)
        else:
            QMessageBox.information(self, "Add Unsuccessful",
                    "Sorry, \"%s\" is already in your address book." % name)
            return

        if not self.contacts:
            self.nameLine.clear()
            self.addressText.clear()

        self.nameLine.setReadOnly(True)
        self.addressText.setReadOnly(True)
        self.addButton.setEnabled(True)
        self.submitButton.hide()
        self.cancelButton.hide()

    def cancel(self):
        self.nameLine.setText(self.oldName)
        self.nameLine.setReadOnly(True)

        self.addressText.setText(self.oldAddress)
        self.addressText.setReadOnly(True)

        self.addButton.setEnabled(True)
        self.submitButton.hide()
        self.cancelButton.hide()
Esempio n. 34
0
class TWBackTime(QWidget):
    def __init__(self):
        super().__init__()

        self.style = StyleSheet

        self.calculator = TWCalculator

        size_policy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        lbl_font = QFont('Verdana', 10, QFont.Bold)
        le_font = QFont('Verdana', 9)

        # World Input
        self.world_lbl = QLabel("World:")
        self.world_lbl.setFont(lbl_font)
        self.world_lbl.setStyleSheet(self.style.qlabel_style)
        self.world_le = QLineEdit()
        self.world_le.setSizePolicy(size_policy)
        self.world_le.setMaximumSize(QSize(40, 24))
        self.world_le.setFont(le_font)
        self.world_le.setStyleSheet(self.style.qlineedit_style)

        # Attacking village Input
        self.vill1_lbl = QLabel("Attacking village\ncoordinates:")
        self.vill1_lbl.setFont(lbl_font)
        self.vill1_lbl.setStyleSheet(self.style.qlabel_style)
        self.vill1_le = QLineEdit()
        self.vill1_le.setInputMask('000|000')
        self.vill1_le.setSizePolicy(size_policy)
        self.vill1_le.setMaximumSize(QSize(60, 24))
        self.vill1_le.setAlignment(Qt.AlignCenter)
        self.vill1_le.setFont(le_font)
        self.vill1_le.setStyleSheet(self.style.qlineedit_style)

        # Defending village Input
        self.vill2_lbl = QLabel("Defending village\ncoordinates:")
        self.vill2_lbl.setFont(lbl_font)
        self.vill2_lbl.setStyleSheet(self.style.qlabel_style)
        self.vill2_le = QLineEdit()
        self.vill2_le.inputMask()
        self.vill2_le.setInputMask('000|000')
        self.vill2_le.setSizePolicy(size_policy)
        self.vill2_le.setMaximumSize(QSize(60, 24))
        self.vill2_le.setAlignment(Qt.AlignCenter)
        self.vill2_le.setFont(le_font)
        self.vill2_le.setStyleSheet(self.style.qlineedit_style)

        # Backtiming village Input
        self.vill3_lbl = QLabel("Backtime village\ncoordinates:")
        self.vill3_lbl.setFont(lbl_font)
        self.vill3_lbl.setStyleSheet(self.style.qlabel_style)
        self.vill3_le = QLineEdit()
        self.vill3_le.inputMask()
        self.vill3_le.setInputMask('000|000')
        self.vill3_le.setSizePolicy(size_policy)
        self.vill3_le.setMaximumSize(QSize(60, 24))
        self.vill3_le.setAlignment(Qt.AlignCenter)
        self.vill3_le.setFont(le_font)
        self.vill3_le.setStyleSheet(self.style.qlineedit_style)
        self.vill3_opt_lbl = QLabel("(optional)")

        # Unit Input for attacking village
        self.unit1_lbl = QLabel("Attacking village\nslowest unit:")
        self.unit1_lbl.setFont(lbl_font)
        self.unit1_lbl.setStyleSheet(self.style.qlabel_style)
        self.unit1_combo = QComboBox(self)
        self.unit1_combo.addItem("Spearman")
        self.unit1_combo.addItem("Swordsman")
        self.unit1_combo.addItem("Axeman")
        self.unit1_combo.addItem("Archer")
        self.unit1_combo.addItem("Scout")
        self.unit1_combo.addItem("Light Cavalry")
        self.unit1_combo.addItem("Mounted Archer")
        self.unit1_combo.addItem("Heavy Cavalry")
        self.unit1_combo.addItem("Ram")
        self.unit1_combo.addItem("Catapult")
        self.unit1_combo.addItem("Paladin")
        self.unit1_combo.addItem("Nobleman")
        self.unit1_combo.setSizePolicy(size_policy)
        self.unit1_combo.setFont(le_font)
        self.unit1_combo.setMaxVisibleItems(12)
        self.unit1_combo.setStyleSheet(self.style.qcombobox_style)

        # Unit Input for backtiming village
        self.unit2_lbl = QLabel("Backtime village\nslowest unit:")
        self.unit2_lbl.setFont(lbl_font)
        self.unit2_lbl.setStyleSheet(self.style.qlabel_style)
        self.unit2_combo = QComboBox(self)
        self.unit2_combo.addItem("Spearman")
        self.unit2_combo.addItem("Swordsman")
        self.unit2_combo.addItem("Axeman")
        self.unit2_combo.addItem("Archer")
        self.unit2_combo.addItem("Scout")
        self.unit2_combo.addItem("Light Cavalry")
        self.unit2_combo.addItem("Mounted Archer")
        self.unit2_combo.addItem("Heavy Cavalry")
        self.unit2_combo.addItem("Ram")
        self.unit2_combo.addItem("Catapult")
        self.unit2_combo.addItem("Paladin")
        self.unit2_combo.addItem("Nobleman")
        self.unit2_combo.setSizePolicy(size_policy)
        self.unit2_combo.setFont(le_font)
        self.unit2_combo.setMaxVisibleItems(12)
        self.unit2_combo.setStyleSheet(self.style.qcombobox_style)

        # Arrival date Input
        self.arrival_date_lbl = QLabel("Arrival date:")
        self.arrival_date_lbl.setStyleSheet(self.style.qlabel_style)
        self.arrival_date_lbl.setFont(lbl_font)
        self.arrival_date_le = QLineEdit()
        self.arrival_date_le.setSizePolicy(size_policy)
        self.arrival_date_le.setMaximumSize(QSize(100, 24))
        self.arrival_date_le.setInputMask('0000-00-00')
        self.arrival_date_le.setText(str(date.today()))
        self.arrival_date_le.setFont(le_font)
        self.arrival_date_le.setStyleSheet(self.style.qlineedit_style)

        # Arrival time Input
        self.arrival_time_lbl = QLabel("Incoming attack\narrival time:")
        self.arrival_time_lbl.setStyleSheet(self.style.qlabel_style)
        self.arrival_time_lbl.setFont(lbl_font)
        self.arrival_time_le = QLineEdit()
        self.arrival_time_le.setSizePolicy(size_policy)
        self.arrival_time_le.setMaximumSize(QSize(100, 24))
        self.arrival_time_le.setInputMask('00:00:00.000')
        self.arrival_time_le.setText(
            ((datetime.utcnow()).strftime("%H:%M:%S.%f")).rstrip('0'))
        self.arrival_time_le.setFont(le_font)
        self.arrival_time_le.setStyleSheet(self.style.qlineedit_style)

        # Output for distance and duration
        self.calc_te = QTextEdit()
        self.calc_te.setReadOnly(1)
        self.calc_te.setFont(le_font)
        self.calc_te.setStyleSheet(self.style.qtextedit_style)

        # Buttons for calculating, resetting, and cancelling.
        self.calc_btn = QPushButton("Calculate")
        self.calc_btn.setStyleSheet(self.style.qbutton_style)
        self.calc_btn.clicked.connect(self.text_output)
        self.reset_btn = QPushButton("Reset")
        self.reset_btn.setStyleSheet(self.style.qbutton_style)
        self.reset_btn.clicked.connect(self.reset)
        self.cancel_btn = QPushButton("Cancel")
        self.cancel_btn.setStyleSheet(self.style.qbutton_style)
        self.bbcode_btn = QPushButton("BB-Code Format")
        self.bbcode_btn.clicked.connect(self.show_dialog)
        self.bbcode_btn.setStyleSheet(self.style.qbutton_style)

        grid = QGridLayout()
        grid.addWidget(self.world_lbl, 1, 0)
        grid.addWidget(self.world_le, 1, 1)
        grid.addWidget(self.vill1_lbl, 2, 0)
        grid.addWidget(self.vill1_le, 2, 1)
        grid.addWidget(self.vill2_lbl, 3, 0)
        grid.addWidget(self.vill2_le, 3, 1)
        grid.addWidget(self.vill3_lbl, 4, 0)
        grid.addWidget(self.vill3_le, 4, 1)
        grid.addWidget(self.unit1_lbl, 5, 0)
        grid.addWidget(self.unit1_combo, 5, 1)
        grid.addWidget(self.unit2_lbl, 6, 0)
        grid.addWidget(self.unit2_combo, 6, 1)
        grid.addWidget(self.arrival_date_lbl, 7, 0)
        grid.addWidget(self.arrival_date_le, 7, 1)
        grid.addWidget(self.arrival_time_lbl, 8, 0)
        grid.addWidget(self.arrival_time_le, 8, 1)

        btn_hbox = QHBoxLayout()
        btn_hbox.addWidget(self.calc_btn)
        btn_hbox.addWidget(self.reset_btn)
        btn_hbox.addWidget(self.cancel_btn)

        vbox = QVBoxLayout()
        vbox.addLayout(grid)
        vbox.addLayout(btn_hbox)
        vbox.addWidget(self.calc_te)
        vbox.addWidget(self.bbcode_btn)

        self.setLayout(vbox)

        QWidget.setTabOrder(self.world_le, self.vill1_le)
        QWidget.setTabOrder(self.vill1_le, self.vill2_le)
        QWidget.setTabOrder(self.vill2_le, self.vill3_le)
        QWidget.setTabOrder(self.vill3_le, self.unit1_combo)
        QWidget.setTabOrder(self.unit1_combo, self.unit2_combo)
        QWidget.setTabOrder(self.unit2_combo, self.arrival_date_le)
        QWidget.setTabOrder(self.arrival_date_le, self.arrival_time_le)
        QWidget.setTabOrder(self.arrival_time_le, self.calc_btn)
        QWidget.setTabOrder(self.calc_btn, self.reset_btn)
        QWidget.setTabOrder(self.reset_btn, self.cancel_btn)
        QWidget.setTabOrder(self.cancel_btn, self.bbcode_btn)

        self.setMaximumSize(275, 400)
        self.setStyleSheet(self.style.qwidget_style)

    def text_output(self):

        vill1 = self.vill1_le.text()
        vill2 = self.vill2_le.text()
        if self.vill3_le.text() == "|":
            vill3 = self.vill2_le.text()
        else:
            vill3 = self.vill3_le.text()
        world = self.world_le.text()
        unit1 = self.unit1_combo.currentText()
        unit2 = self.unit2_combo.currentText()
        arrival_date = self.arrival_date_le.text()
        arrival_time = self.arrival_time_le.text()

        distance1 = str(round(self.calculator.distance(vill1, vill2), 2))
        duration1 = str(self.calculator.duration(vill1, vill2, world, unit1))
        distance2 = str(round(self.calculator.distance(vill1, vill3), 2))
        duration2 = str(self.calculator.duration(vill1, vill3, world, unit2))
        return_time = str(
            self.calculator.return_time(arrival_time, arrival_date, vill1,
                                        vill2, world, unit1))
        backtime_time = str(
            self.calculator.backtime(vill1, vill2, vill3, world, unit1, unit2,
                                     arrival_time, arrival_date)).rstrip('0')
        self.calc_te.setPlainText("""Distance to defending village: %s
Duration to defending village: %s
Distance from backtiming village: %s
Duration from backtiming village: %s
Attacker's troops return at: %s
Send backtime at: %s
""" % (distance1, duration1, distance2, duration2, return_time, backtime_time))

    def show_dialog(self):

        vill1 = self.vill1_le.text()
        vill2 = self.vill2_le.text()
        if self.vill3_le.text() != "|":
            vill3 = self.vill3_le.text()
        else:
            vill3 = self.vill2_le.text()
        world = self.world_le.text()
        unit1 = self.unit1_combo.currentText()
        unit2 = self.unit2_combo.currentText()
        arrival_date = self.arrival_date_le.text()
        arrival_time = self.arrival_time_le.text()

        duration2 = str(self.calculator.duration(vill1, vill3, world, unit2))

        return_time = str(
            self.calculator.return_time(arrival_time, arrival_date, vill1,
                                        vill2, world, unit1))
        backtime_time = str(
            self.calculator.backtime(vill1, vill2, vill3, world, unit1, unit2,
                                     arrival_time, arrival_date)).rstrip('0')

        dialog = BBCodePopUp()

        dialog.output.setText(
            "Launch %s from [coord]%s[/coord] to \
[coord]%s[/coord] at [b]%s[/b] ([i]arriving at %s after %s travel time[/i])" %
            (unit2, vill3, vill1, backtime_time, return_time, duration2))
        dialog.exec()

    def reset(self):

        self.vill1_le.clear()
        self.vill2_le.clear()
        self.vill3_le.clear()
        self.unit2_combo.setCurrentIndex(0)
        self.arrival_time_le.setText(
            ((datetime.utcnow()).strftime("%H:%M:%S.%f")).rstrip('0'))
        self.calc_te.clear()
Esempio n. 35
0
class AvailableSizes(QDialog):
    def __init__(self):
        super(AvailableSizes, self).__init__()
        
        self.createCombos()
        self.createHeader()
        #self.createMenuBar()
        
        self.printOut = QTextEdit()
        self.printOut.setFont(QFont('Helvetica', 11, QFont.Bold))
        self.printOut.setReadOnly(True)
        
        mainLayout = QVBoxLayout()
        #mainLayout.setMenuBar(self.menuBar)
        mainLayout.addWidget(self.frmHeader)
        mainLayout.addWidget(self.grpBox)
        mainLayout.addWidget(self.printOut)
        #mainLayout.setAlignment(self.frmHeader, Qt.AlignRight)
        self.setLayout(mainLayout)
        
        #self.setWindowTitle("Available Sizes")
        self.setWindowFlags(Qt.FramelessWindowHint)
        bgColor = QPalette()
        bgColor.setColor(self.backgroundRole(), Qt.gray)
        self.setPalette(bgColor)
        self.setWindowIcon(QIcon('icon/PS_Icon.png'))
        self.cbSku.setFocus()
        
    def createHeader(self):
        blk = QPalette()
        blk.setColor(blk.Foreground, Qt.white)
        
        lblTitle = QLabel("Availability Checker")
        lblTitle.setFont(QFont("Times", 12, QFont.Bold ))
        lblTitle.setPalette(blk) 
         
        btnClose = QToolButton()
        btnClose.setIcon(QIcon("icon\size_exit.png"))
        btnClose.setAutoRaise(True)
        btnClose.setIconSize(QSize(25,25))
        btnClose.clicked.connect(lambda: self.close())
        
        hbHeader = QHBoxLayout()
        hbHeader.addWidget(lblTitle)
        hbHeader.addWidget(btnClose)
        hbHeader.setContentsMargins(0, 0, 0, 0)
        
        self.frmHeader = QFrame()
        self.frmHeader.setLayout(hbHeader)
        
    def createCombos(self):
        cbFont = QFont("Times", 8, QFont.Bold)
        designs = self.getDesigns()
        
        self.grpBox = QGroupBox()
        self.grpBox.setFont(QFont('Times', 10, QFont.Bold))
        layout = QFormLayout()
        
        self.cbSku = QComboBox()
        self.cbSku.addItem("Designs")
        self.cbSku.addItems(designs)
        self.cbSku.setFont(cbFont)
        self.cbSku.currentIndexChanged.connect(self.skuChanged)
        
        self.cbStyle = QComboBox()
        self.cbStyle.addItem("Styles")
        self.cbStyle.setFont(cbFont)
        self.cbStyle.currentIndexChanged.connect(self.styleChanged)
        
        layout.addRow(QLabel("Design:"), self.cbSku)
        layout.addRow(QLabel("Style:"), self.cbStyle)
        
        self.grpBox.setLayout(layout)
    
    def skuChanged(self):
        
        if self.cbStyle.count() > 0:
            self.cbStyle.clear()
            self.cbStyle.addItem("Style")
            self.cbStyle.setCurrentIndex(0)
            styles = self.getStyles(self.cbSku.currentText())
        else: 
            styles = self.getStyles(self.cbSku.currentText())
        self.cbStyle.addItems(styles)
        
    def styleChanged(self):
        self.printOut.clear()
        sizes = self.getSizes(self.cbSku.currentText(), self.cbStyle.currentText())
        if self.cbStyle.currentText() != "Styles":
            for i in sizes:
                self.printOut.insertPlainText(i + '\n')
                    
       
    def createMenuBar(self):
        self.menuBar = QMenuBar()

        self.fileMenu = QMenu("&File", self)
        self.exitAction = self.fileMenu.addAction("E&xit")
        self.menuBar.addMenu(self.fileMenu)

        self.exitAction.triggered.connect(self.accept)
        
    def getDesigns(self):
        sd = mysql_db.mysql_connect(self)
        sd.execute("""SELECT 
                            DISTINCT CONCAT(d.sku_code, " - ", d.name) design
                        FROM
                            designs d
                        JOIN packages p on p.design_id = d.id
                        ORDER BY RIGHT(d.sku_code, 3), LEFT(d.sku_code,1)""")
        ds = sd.fetchall()
        lsDesigns = []
        for i in ds:
            lsDesigns.append(i[0])
        return lsDesigns    
    
    def getStyles(self, sku):
        sd = mysql_db.mysql_connect(self)
        sd.execute("""SELECT
                            DISTINCT g.name
                        FROM 
                            garment_styles_ages g
                        JOIN packages p ON p.garment_styles_age_id = g.id
                        JOIN designs d ON d.id = p.design_id
                        WHERE d.sku_code = '""" + sku[:4] + """'
                        ORDER BY g.name""")
        ds = sd.fetchall()
        lsStyles = []
        for i in ds:
            lsStyles.append(i[0])
        return lsStyles
    
    def getSizes(self, sku, style):
        style = style.replace("'", "\\'")
        sd = mysql_db.mysql_connect(self)
        sd.execute("""
                        SELECT
                            DISTINCT CONCAT(s.name, ' - ', c.name) size
                        FROM 
                            sizes s
                        JOIN packages p ON p.size_id = s.id
                        JOIN designs d ON d.id = p.design_id
                        JOIN colors c ON c.id = p.color_id
                        JOIN garment_styles_ages g ON g.id = p.garment_styles_age_id
                        WHERE 
                            d.sku_code = '""" + sku[:4] + """'
                        AND
                            g.name = '""" + style + """'""")
        ds = sd.fetchall()
        lsSizes = []
        for i in ds:
            lsSizes.append(i[0])
        return lsSizes

    
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.leftClick = True
            self.offset = event.pos()

    def mouseMoveEvent(self, event):
        if self.leftClick == True:
            x=event.globalX()
            y=event.globalY()
            x_w = self.offset.x()
            y_w = self.offset.y()
            self.move(x-x_w, y-y_w)
            
    def mouseReleaseEvent(self, event):
        self.leftClick = False       
Esempio n. 36
0
class MainWindow(QMainWindow):
    """Main application window"""
    def __init__(self):
        super().__init__()

        self.universal_font = QFont('Calibri', 13)

        self.set_UI()

        self.set_welcome_layout()

        self.db = Database()

        self.description_dict = {}

        self.code_dict = {}

        self.picture_dict = {}

        self.title = ""

        self.language = ""

        self.record_or_play = True  # record is True, play is False

        self.about_dict = {
            1:
            'LearningStep\n\nThis application is named LearningStep. The purpose is to learn and repeat self made text-lessons in intervals of time.',
            2:
            'Record New Task\n\nConstruct your own lesson in steps.\nProvide title as short description, choose language (field of interests) and by clicking next move forward lessons.'
            '\nOne step consists of description (upper text field) and code (lower text field).\nYou can also attach an image to every step.'
            '\nTo proceed next step, click Next button.\nWhen all steps are written, click Finish button to save the lesson.',
            3:
            'Play The Task\n\nPlay previously recorded task (choose from the table of available tasks).\nGo through all tasks by clicking Next button.\nAt first you see description and then code field.\n'
            'When you will walk through all steps you can decide whether this approach was satisfying. Only if so, task will be completed,\n updated to database '
            'and reminded after certain interval of time.',
            4:
            'Delete Task\n\nDelete task according to provided task ID.\nBe aware that images stored in database will also be deleted.',
            5:
            'Time intervals are:\n\n1 day, 3 days, 7 days, 10 days, 14 days, 28 days, 60 days, 90 days, 180 days...',
            6:
            'Credits:\n\nDariusz Giemza, 2019',
            7:
            ''
        }

    def set_UI(self):
        """Set main window properties and create stacked layouts"""
        self.setWindowTitle("LearningStep")

        self.setGeometry(230, 100, 900, 500)

        self.set_upper_menu()

        self.create_main_layout()

        self.stacked_layout = QStackedLayout()
        self.stacked_layout.addWidget(self.main_widget)

        ##############

        self.create_record_task_menu_layout()
        self.stacked_layout.addWidget(self.record_task_widget)

        #######

        self.create_play_task_menu_layout()
        self.stacked_layout.addWidget(self.play_task_widget)

        ########

        self.create_delete_task_menu_layout()
        self.stacked_layout.addWidget(self.delete_task_widget)

        ########

        self.create_about_menu_layout()
        self.stacked_layout.addWidget(self.about_widget)

        self.central_widget = QWidget()
        self.central_widget.setLayout(self.stacked_layout)
        self.setCentralWidget(self.central_widget)

    def create_main_layout(self):
        """Create startin layouy"""
        ### WIDGETS

        self.display_description = QLineEdit()
        self.display_code = QTextEdit()
        self.display_title = QLabel('Title')
        self.display_step = QLabel('Steps')
        self.picture_button = QPushButton()
        self.finish_button = QPushButton('Finish')
        self.next_button = QPushButton('Next')

        self.alpha_button = QPushButton('α')
        self.beta_button = QPushButton('β')
        self.pi_button = QPushButton('π')
        self.omega_button = QPushButton('Ω')
        self.lambda_button = QPushButton('λ')
        self.mi_button = QPushButton('µ')
        self.sigma_button = QPushButton('σ')
        self.sum_button = QPushButton('Σ')
        self.delta_button = QPushButton('Δ')
        self.gamma_button = QPushButton('Γ')
        self.not_equal_button = QPushButton('≠')
        self.approx_equal_button = QPushButton('≈')
        self.sqrt_button = QPushButton('√')
        self.gt_button = QPushButton('≥')
        self.lt_button = QPushButton('≤')
        self.degree_button = QPushButton('°')

        self.icon_black = QIcon(os.path.join('imgs', 'picture.png'))
        self.icon_red = QIcon(os.path.join('imgs', 'picture_red.png'))
        self.picture_button.setIcon(self.icon_black)

        ### GRIDS

        self.main_grid = QGridLayout()
        self.right_grid = QGridLayout()
        self.symbols_grid = QGridLayout()

        ### ADD WIDGETS

        self.symbols_grid.addWidget(self.alpha_button, 0, 0)
        self.symbols_grid.addWidget(self.beta_button, 0, 1)
        self.symbols_grid.addWidget(self.pi_button, 0, 2)
        self.symbols_grid.addWidget(self.omega_button, 0, 3)
        self.symbols_grid.addWidget(self.lambda_button, 0, 4)
        self.symbols_grid.addWidget(self.mi_button, 0, 5)
        self.symbols_grid.addWidget(self.sigma_button, 0, 6)
        self.symbols_grid.addWidget(self.sum_button, 0, 7)
        self.symbols_grid.addWidget(self.delta_button, 1, 0)
        self.symbols_grid.addWidget(self.gamma_button, 1, 1)
        self.symbols_grid.addWidget(self.not_equal_button, 1, 2)
        self.symbols_grid.addWidget(self.approx_equal_button, 1, 3)
        self.symbols_grid.addWidget(self.sqrt_button, 1, 4)
        self.symbols_grid.addWidget(self.gt_button, 1, 5)
        self.symbols_grid.addWidget(self.lt_button, 1, 6)
        self.symbols_grid.addWidget(self.degree_button, 1, 7)

        self.right_grid.addWidget(self.display_step, 0, 0)
        self.right_grid.addWidget(self.picture_button, 1, 0)
        self.right_grid.addWidget(self.finish_button, 2, 0)
        self.right_grid.addWidget(self.next_button, 3, 0)

        self.main_grid.addItem(self.symbols_grid, 2, 0)
        self.main_grid.addWidget(self.display_description, 0, 0)
        self.main_grid.addWidget(self.display_code, 1, 0)
        self.main_grid.addWidget(self.display_title, 0, 1)
        self.main_grid.addItem(self.right_grid, 1, 1)

        ### LAYOUT FORMATION
        font = QFont('Calibri', 15)
        font.setBold(True)

        self.display_description.setMaximumWidth(600)
        self.display_description.setAlignment(Qt.AlignHCenter)

        self.display_code.setMaximumWidth(600)
        self.display_code.setMinimumWidth(600)
        self.display_code.setMaximumHeight(500)

        self.display_title.setFont(font)
        self.display_title.setAlignment(Qt.AlignHCenter)

        self.display_step.setAlignment(Qt.AlignCenter)
        self.display_step.setFont(font)

        self.finish_button.setMinimumHeight(60)
        self.next_button.setMinimumHeight(60)

        self.main_widget = QWidget()
        self.main_widget.setLayout(self.main_grid)

        #### BEHAVIOURS ####

        self.finish_button.clicked.connect(self.finish_button_method)
        self.next_button.clicked.connect(self.next_button_method)
        self.picture_button.clicked.connect(self.picture_button_method)

        self.alpha_button.clicked.connect(self.alpha_button_method)
        self.beta_button.clicked.connect(self.beta_button_method)
        self.pi_button.clicked.connect(self.pi_button_method)
        self.omega_button.clicked.connect(self.omega_button_method)
        self.lambda_button.clicked.connect(self.lambda_button_method)
        self.mi_button.clicked.connect(self.mi_button_method)
        self.sigma_button.clicked.connect(self.sigma_button_method)
        self.sum_button.clicked.connect(self.sum_button_method)
        self.delta_button.clicked.connect(self.delta_button_method)
        self.gamma_button.clicked.connect(self.gamma_button_method)
        self.not_equal_button.clicked.connect(self.not_equal_button_method)
        self.approx_equal_button.clicked.connect(
            self.approx_equal_button_method)
        self.sqrt_button.clicked.connect(self.sqrt_button_method)
        self.gt_button.clicked.connect(self.gt_button_method)
        self.lt_button.clicked.connect(self.lt_button_method)
        self.degree_button.clicked.connect(self.degree_button_method)

    #### SPECIAL SYMBOLS METHODS ####

    def alpha_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'α')

    def beta_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'β')

    def pi_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'π')

    def omega_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'Ω')

    def lambda_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'λ')

    def mi_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'µ')

    def sigma_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'σ')

    def sum_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'Σ')

    def delta_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'Δ')

    def gamma_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + 'Γ')

    def not_equal_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + '≠')

    def approx_equal_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + '≈')

    def sqrt_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + '√')

    def gt_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + '≥')

    def lt_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + '≤')

    def degree_button_method(self):

        text = self.display_code.toPlainText()
        self.display_code.setText(text + '°')

    def create_record_task_menu_layout(self):
        """Create layout for recording new taks"""

        self.record_task_grid = QVBoxLayout()

        self.record_task_grid_h = QHBoxLayout()

        self.record_label_1 = QLabel('TITLE OF THE TASK:')
        self.record_label_2 = QLabel('LANGUAGE (FIELD):')

        self.record_label_1.setAlignment(Qt.AlignCenter)

        self.record_text_title = QLineEdit()
        self.record_text_title.setAlignment(Qt.AlignHCenter)

        self.record_combo_box = QComboBox()
        self.record_combo_box.addItem("---")
        self.record_combo_box.addItem("Python")
        self.record_combo_box.addItem("R")
        self.record_combo_box.addItem("Machine Learning")
        self.record_combo_box.addItem("Deep Learning")
        self.record_combo_box.addItem("Statistics")
        self.record_combo_box.addItem("English")

        self.record_button_cancel = QPushButton('Cancel')
        self.record_button_start = QPushButton('Start')

        #### ALIGNMENT, SHAPES AND FONT####

        self.record_label_1.setFont(self.universal_font)
        self.record_label_2.setFont(self.universal_font)

        self.record_label_1.setAlignment(Qt.AlignCenter)
        self.record_text_title.setMaximumWidth(250)
        self.record_text_title.setMinimumWidth(350)

        self.record_label_2.setAlignment(Qt.AlignCenter)
        self.record_combo_box.setMaximumWidth(350)
        self.record_combo_box.setMinimumWidth(200)

        self.record_combo_box.setMinimumHeight(30)

        self.record_button_cancel.setMinimumHeight(40)
        self.record_button_start.setMinimumHeight(40)

        #### GRIDS ####

        self.record_task_grid.addWidget(self.record_label_1)
        self.record_task_grid.addWidget(self.record_text_title,
                                        alignment=Qt.AlignHCenter)
        self.record_task_grid.addWidget(self.record_label_2)
        self.record_task_grid.addWidget(self.record_combo_box,
                                        alignment=Qt.AlignCenter | Qt.AlignTop)

        self.record_task_grid_h.addWidget(self.record_button_cancel)
        self.record_task_grid_h.addWidget(self.record_button_start)

        self.record_task_grid.addItem(self.record_task_grid_h)

        self.record_task_widget = QWidget()
        self.record_task_widget.setLayout(self.record_task_grid)

        #### BEHAVIOUR ####

        self.record_button_cancel.clicked.connect(self.cancel_task_method)

        self.record_button_start.clicked.connect(self.start_record_task_method)

    def create_play_task_menu_layout(self):
        """Create play task layout"""

        #### WIDGETS ####

        self.play_label_1 = QLabel('CHOOSE ONE OF AVAILABLE TASKS:')

        self.play_task_button = QPushButton('Play Selected Task')

        self.play_task_cancel_button = QPushButton('Cancel')

        # Table

        self.play_table = QTableWidget()

        #### GRIDS ####

        self.play_task_grid = QVBoxLayout()

        self.play_task_grid.addWidget(self.play_label_1)

        self.play_task_grid.addWidget(self.play_table)

        self.play_task_grid.addWidget(self.play_task_button)

        self.play_task_grid.addWidget(self.play_task_cancel_button)

        #### ALIGNMENT, FONTS AND SHAPES ####

        self.play_label_1.setFont(self.universal_font)

        self.play_task_button.setMinimumHeight(40)

        self.play_task_cancel_button.setMinimumHeight(40)

        ####

        self.play_task_widget = QWidget()

        self.play_task_widget.setLayout(self.play_task_grid)

        #### BEHAVIOUR ####

        self.play_task_cancel_button.clicked.connect(self.cancel_task_method)

        self.play_task_button.clicked.connect(self.play_task_method)

    def create_delete_task_menu_layout(self):
        """Create delete layout"""

        #### WIDGETS ####

        self.delete_task_label = QLabel('PROVIDE TASK ID TO DELETE TASK:')

        self.delete_task_text_box = QLineEdit()

        self.delete_task_delete_button = QPushButton('DELETE')

        self.delete_task_cancel_button = QPushButton('Cancel')

        #### GRIDS ####

        self.delete_task_grid = QVBoxLayout()

        self.delete_task_grid_h = QHBoxLayout()

        self.delete_task_grid_h.addWidget(self.delete_task_cancel_button)

        self.delete_task_grid_h.addWidget(self.delete_task_delete_button)

        self.delete_task_grid.addWidget(self.delete_task_label,
                                        alignment=Qt.AlignCenter)

        self.delete_task_grid.addWidget(self.delete_task_text_box,
                                        alignment=Qt.AlignTop | Qt.AlignCenter)

        self.delete_task_grid.addItem(self.delete_task_grid_h)

        #### ALIGNMENT, FONT AND SHAPES ####

        self.delete_task_text_box.setAlignment(Qt.AlignHCenter)

        self.delete_task_label.setFont(self.universal_font)

        self.delete_task_text_box.setMaximumWidth(200)

        self.delete_task_cancel_button.setMinimumHeight(40)

        self.delete_task_delete_button.setMinimumHeight(40)

        #####

        self.delete_task_widget = QWidget()

        self.delete_task_widget.setLayout(self.delete_task_grid)

        #### BEHAVIOUR ####

        self.delete_task_cancel_button.clicked.connect(self.cancel_task_method)

        self.delete_task_delete_button.clicked.connect(self.delete_task)

    def create_about_menu_layout(self):
        """Create about layout"""

        self.about_label = QLabel('Sample')

        self.about_next_button = QPushButton('Next')

        self.about_cancel_button = QPushButton('Cancel')

        #### GRID ####

        self.about_grid_H = QHBoxLayout()

        self.about_grid_H.addWidget(self.about_cancel_button)

        self.about_grid_H.addWidget(self.about_next_button)

        self.about_grid_V = QVBoxLayout()

        self.about_grid_V.addWidget(self.about_label)

        self.about_grid_V.addItem(self.about_grid_H)

        self.about_widget = QWidget()

        self.about_widget.setLayout(self.about_grid_V)

        self.about_label.setFont(self.universal_font)

        self.about_label.setAlignment(Qt.AlignHCenter)

        self.about_cancel_button.setMinimumHeight(40)

        self.about_next_button.setMinimumHeight(40)

        #### BEHAVIOUR ####

        self.about_cancel_button.clicked.connect(self.cancel_task_method)

        self.about_next_button.clicked.connect(self.about_next_method)

    def set_upper_menu(self):
        """Create rolling  Menu"""

        self.statusBar()

        mainMenu = self.menuBar()

        optionsMenu = mainMenu.addMenu('&Menu')

        menuRecord = QAction('&Record New Task', self)
        menuRecord.setStatusTip('Record New Task and save it into database...')
        menuRecord.triggered.connect(self.menuRecord_method)

        menuPlay = QAction('&Play The Task', self)
        menuPlay.setStatusTip('Play one of the tasks from the available...')
        menuPlay.triggered.connect(self.menuPlay_method)

        menuDelete = QAction('&Delete task', self)
        menuDelete.setStatusTip('Delete one task for given task ID...')
        menuDelete.triggered.connect(self.menuDelete_method)

        menuAbout = QAction('&About', self)
        menuAbout.setStatusTip('About the LearningStep app...')
        menuAbout.triggered.connect(self.menuAbout_method)

        menuExit = QAction("&Exit", self)
        menuExit.setStatusTip('Exit the application...')
        menuExit.triggered.connect(self.menuExit_method)

        optionsMenu.addAction(menuRecord)
        optionsMenu.addAction(menuPlay)
        optionsMenu.addAction(menuDelete)
        optionsMenu.addAction(menuAbout)
        optionsMenu.addAction(menuExit)

    def about_next_method(self):
        """About layout, Next button"""

        if self.about_step < 7:
            self.about_step += 1
        else:
            self.about_step = 1

        self.about_label.setText(self.about_dict[self.about_step])

    def delete_task(self):
        """Delete layout, Delete button"""

        try:
            task_id = int(self.delete_task_text_box.text())

        except:

            task_id = self.delete_task_text_box.text()

        if self.delete_task_text_box.text() == "":

            QMessageBox.information(
                self, 'Empty text box',
                'In order to delete task, please provide a valid task ID!')

            return

        if not self.delete_task_text_box.text().isnumeric():

            QMessageBox.information(
                self, 'Invalid input',
                'In order to delete task, please provide numeric value that corresponds to task ID!'
            )

            return

        if not self.db.check_if_task_id_exists(task_id):

            QMessageBox.information(
                self, 'No such task ID',
                'There is no task ID in database: {0}'.format(task_id))

            return

        choice = QMessageBox.question(
            self, "Delete task",
            'Are you sure to delete task and all dependend images?\nYou will not be able to restore deleted data. Task ID: {0}'
            .format(task_id), QMessageBox.Yes | QMessageBox.No)

        if choice == QMessageBox.Yes:

            self.title, self.description_dict, self.code_dict, self.picture_dict, self.pass_count = self.db.get_selected_task(
                task_id)

            self.db.delete_images(self.picture_dict)

            self.db.delete_task(task_id)

            QMessageBox.information(
                self, 'Task deleted',
                'Task with ID {0} has been successfully deleted from database!'
                .format(task_id))

            self.stacked_layout.setCurrentIndex(0)

            self.set_welcome_layout()

        elif choice == QMessageBox.No:

            return

    def load_to_play_table(self):
        """Load table with available tasks"""

        rows = self.db.load_available_tasks()

        self.play_table.setRowCount(len(rows))

        self.play_table.setColumnCount(6)

        self.play_table.setHorizontalHeaderLabels([
            'Task title (short description)', 'Language (Field)',
            'Creation Date', 'Last Pass Date', 'Pass Count', 'ID'
        ])

        self.play_table.verticalHeader().hide()

        self.play_table.setEditTriggers(QAbstractItemView.NoEditTriggers)

        self.play_table.setSelectionBehavior(QAbstractItemView.SelectRows)

        self.play_table.setColumnWidth(0, 280)

        self.play_table.setColumnWidth(1, 180)

        self.play_table.setColumnWidth(2, 110)

        self.play_table.setColumnWidth(3, 110)

        for i, row in enumerate(rows):

            item = QTableWidgetItem(row[0])
            item.setTextAlignment(Qt.AlignCenter)
            self.play_table.setItem(i, 0, item)

            item = QTableWidgetItem(row[1])
            item.setTextAlignment(Qt.AlignCenter)
            self.play_table.setItem(i, 1, item)

            item = QTableWidgetItem(row[2])
            item.setTextAlignment(Qt.AlignCenter)
            self.play_table.setItem(i, 2, item)

            item = QTableWidgetItem(row[3])
            item.setTextAlignment(Qt.AlignCenter)
            self.play_table.setItem(i, 3, item)

            item = QTableWidgetItem(str(row[4]))
            item.setTextAlignment(Qt.AlignCenter)
            self.play_table.setItem(i, 4, item)

            item = QTableWidgetItem(str(row[5]))
            item.setTextAlignment(Qt.AlignCenter)
            self.play_table.setItem(i, 5, item)

    def picture_button_method(self):
        """Picture button to load or display picture"""

        if self.record_or_play:

            #### RECORD TASK ####

            path = QFileDialog.getOpenFileName(
                self, 'Load picture to database', 'c:\\',
                "Image files (*.jpg *.gif, *.png)")

            # if path is empty
            if path[0] == '':

                return

            try:

                extension = path[0][-3:].lower()

                now = datetime.datetime.now()

                image_name = self.title + "_STEP_" + str(
                    self.step) + "_" + str(now.year) + "_" + str(
                        now.month) + "_" + str(now.day)

                filename_ext = "{0}.{1}".format(image_name, extension)

                shutil.copy(path[0], os.path.join('temp_pic', filename_ext))

                self.picture_dict[self.step] = image_name

                self.picture_button.setIcon(self.icon_red)

            except:

                QMessageBox.information(
                    self, 'Error',
                    'Something has gone wrong during copying picture to the album. Please try once again.'
                )

        else:

            #### PLAY TASK ####

            if self.picture_dict[self.step] != "":

                image_path = self.db.readBlobData(self.picture_dict[self.step])

                self.picture_window = ImageWindow(image_path)

                self.picture_window.show()

                self.remove_temp_pictures()

            else:

                QMessageBox.information(
                    self, 'Error',
                    'Application could not find attached picture. It might have been deleted or moved.'
                )

    def finish_button_method(self):
        """Finish record and play button"""

        if self.record_or_play:

            #### RECORD TASK ####

            if self.step == 1 and self.display_description.text(
            ) == "" and self.display_code.toPlainText() == "":

                self.remove_temp_pictures()

                self.set_welcome_layout()

                return

            choice = QMessageBox.question(
                self, "Finish",
                '[Yes] - Finish and save task to the database\n[No] - Finish and don\'t save task\n[Cancel] - back to the recording',
                QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)

            if choice == QMessageBox.Yes:

                if self.display_description.text(
                ) == "" or self.display_code.toPlainText() == "":

                    pass

                else:

                    self.description_dict[
                        self.step] = self.display_description.text()

                    self.code_dict[self.step] = self.display_code.toPlainText()

                self.db.add_task(self.description_dict, self.code_dict,
                                 self.picture_dict, self.title, self.language)

                self.images_to_database()

                self.remove_temp_pictures()

                self.set_welcome_layout()

            elif choice == QMessageBox.No:

                self.remove_temp_pictures()

                self.set_welcome_layout()

            elif choice == QMessageBox.Cancel:

                return

        else:

            #### PLAY TASK ####

            choice = QMessageBox.question(
                self, "Task completed",
                'Are you satisfied with the level of task accomplishment? If [Yes], it will be available in next interval of time.',
                QMessageBox.Yes | QMessageBox.No)

            if choice == QMessageBox.Yes:

                next_pass_date = self.db.update_task(self.task_id,
                                                     self.pass_count)

                QMessageBox.information(
                    self, 'Task accomplished',
                    'Task has been accomplished. Expect it on the list on {0}'.
                    format(next_pass_date))

                self.set_welcome_layout()

            elif choice == QMessageBox.No:

                QMessageBox.information(self, 'Task unaccomplished',
                                        'Well... Try next time!')

                self.set_welcome_layout()

    def next_button_method(self):
        """Next record and play button"""

        #### RECORD TASK ####

        if self.record_or_play:

            # check if fields are not empty

            if self.display_description.text() == "":

                QMessageBox.information(
                    self, 'Empty field!',
                    'There is empty description field. Please write something to proceed.'
                )

                return

            if self.display_code.toPlainText() == "":

                QMessageBox.information(
                    self, 'Empty field!',
                    'There is empty code field. Please write something to proceed.'
                )

                return

            choice = QMessageBox.question(
                self, 'Next step', 'Do you want to proceed to the next step?',
                QMessageBox.Yes | QMessageBox.No)

            if choice == QMessageBox.Yes:

                # add to dictionaries

                self.description_dict[
                    self.step] = self.display_description.text()

                self.code_dict[self.step] = self.display_code.toPlainText()

                self.step += 1

                self.picture_dict[self.step] = ""

                self.display_step.setText("Step\n{0}".format(self.step))

                self.display_description.clear()

                self.display_code.clear()

                self.picture_button.setIcon(self.icon_black)

            else:

                return

        else:
            #### PLAY ####

            if self.description_or_code:

                self.display_code_play_layout()

            else:

                self.next_step_play_layout()

    def play_task_method(self):
        """Play task starting method"""

        if self.play_table.selectedIndexes() == []:

            return

        row = self.play_table.selectedIndexes()[0].row()

        self.task_id = self.play_table.item(row, 5).text()

        self.title, self.description_dict, self.code_dict, self.picture_dict, self.pass_count = self.db.get_selected_task(
            self.task_id)

        self.step = 1

        self.stacked_layout.setCurrentIndex(0)

        self.set_play_layout()

    def cancel_task_method(self):
        """Cancel button method"""

        self.clear_record_menu()

        self.stacked_layout.setCurrentIndex(0)

    def start_record_task_method(self):
        """Start recording method"""

        if self.record_text_title.text(
        ) == "" or self.record_combo_box.currentText() == "---":

            QMessageBox.information(self, 'Warning!',
                                    'Title and field has to be fulfilled!')

        else:

            self.title = self.record_text_title.text()

            self.language = self.record_combo_box.currentText()

            self.set_record_layout()

            self.stacked_layout.setCurrentIndex(0)

    def remove_temp_pictures(self):
        """Removes all pictures from temp_pic folder"""

        folder = 'temp_pic'

        for filename in os.listdir(folder):

            file_path = os.path.join(folder, filename)

            try:
                if os.path.isfile(file_path) or os.path.islink(file_path):
                    os.unlink(file_path)
                elif os.path.isdir(file_path):
                    shutil.rmtree(file_path)

            except Exception as e:
                print(e)

    def clear_record_menu(self):
        """Clear Record menu"""
        self.record_text_title.setText('')

        self.record_combo_box.setCurrentIndex(0)

    def set_welcome_layout(self):
        """Set startin layout"""
        self.display_description.setDisabled(True)

        self.display_code.setDisabled(True)

        self.display_description.clear()

        self.display_code.clear()

        self.display_title.setText('Title')

        self.display_step.setText('Step\n/')

        self.picture_button.setDisabled(True)

        self.finish_button.setDisabled(True)

        self.next_button.setDisabled(True)

        self.alpha_button.setDisabled(True)
        self.beta_button.setDisabled(True)
        self.pi_button.setDisabled(True)
        self.omega_button.setDisabled(True)
        self.lambda_button.setDisabled(True)
        self.mi_button.setDisabled(True)
        self.sigma_button.setDisabled(True)
        self.sum_button.setDisabled(True)
        self.delta_button.setDisabled(True)
        self.gamma_button.setDisabled(True)
        self.not_equal_button.setDisabled(True)
        self.approx_equal_button.setDisabled(True)
        self.sqrt_button.setDisabled(True)
        self.gt_button.setDisabled(True)
        self.lt_button.setDisabled(True)
        self.degree_button.setDisabled(True)

        self.description_dict = {}

        self.code_dict = {}

        self.picture_dict = {}

        self.title = ""

        self.language = ""

        self.picture_button.setIcon(self.icon_black)

    def set_record_layout(self):
        """Set layout while Record"""

        self.step = 1

        self.picture_dict[1] = ""

        self.display_description.setReadOnly(False)

        self.display_code.setReadOnly(False)

        self.display_description.setEnabled(True)

        self.display_code.setEnabled(True)

        self.display_title.setText(self.record_text_title.text())

        self.display_step.setText('Step\n{0}'.format(self.step))

        self.display_description.clear()

        self.display_code.clear()

        self.picture_button.setEnabled(True)

        self.finish_button.setEnabled(True)

        self.next_button.setEnabled(True)

        self.alpha_button.setDisabled(False)
        self.beta_button.setDisabled(False)
        self.pi_button.setDisabled(False)
        self.omega_button.setDisabled(False)
        self.lambda_button.setDisabled(False)
        self.mi_button.setDisabled(False)
        self.sigma_button.setDisabled(False)
        self.sum_button.setDisabled(False)
        self.delta_button.setDisabled(False)
        self.gamma_button.setDisabled(False)
        self.not_equal_button.setDisabled(False)
        self.approx_equal_button.setDisabled(False)
        self.sqrt_button.setDisabled(False)
        self.gt_button.setDisabled(False)
        self.lt_button.setDisabled(False)
        self.degree_button.setDisabled(False)

    def get_dict_highest_value(self):
        """Get highest value of step from dictionary"""

        self.key_list = self.description_dict.keys()
        return str(max(self.key_list))

    def set_play_layout(self):
        """Set layout while play"""

        self.finish_button.setDisabled(True)

        self.next_button.setEnabled(False)

        self.alpha_button.setDisabled(True)
        self.beta_button.setDisabled(True)
        self.pi_button.setDisabled(True)
        self.omega_button.setDisabled(True)
        self.lambda_button.setDisabled(True)
        self.mi_button.setDisabled(True)
        self.sigma_button.setDisabled(True)
        self.sum_button.setDisabled(True)
        self.delta_button.setDisabled(True)
        self.gamma_button.setDisabled(True)
        self.not_equal_button.setDisabled(True)
        self.approx_equal_button.setDisabled(True)
        self.sqrt_button.setDisabled(True)
        self.gt_button.setDisabled(True)
        self.lt_button.setDisabled(True)
        self.degree_button.setDisabled(True)

        QTimer.singleShot(3000, partial(self.next_button.setEnabled, True))

        self.display_description.setReadOnly(True)

        self.display_code.setReadOnly(True)

        self.display_description.setEnabled(True)

        self.display_code.setEnabled(True)

        self.display_title.setText(self.title)

        self.display_step.setText('Step\n1/{0}'.format(
            self.get_dict_highest_value()))

        self.display_description.setText(self.description_dict[self.step])

        self.description_or_code = True

        self.remove_temp_pictures()

    def display_code_play_layout(self):
        """Displays code while Play"""

        self.description_or_code = False

        self.display_code.setText(self.code_dict[self.step])

        if self.picture_dict[self.step] != "":

            self.picture_button.setEnabled(True)

            self.picture_button.setIcon(self.icon_red)

        else:

            self.picture_button.setIcon(self.icon_black)

        if self.step == int(self.get_dict_highest_value()):

            self.finish_button.setEnabled(True)
            self.next_button.setDisabled(True)

        else:
            self.next_button.setEnabled(False)
            QTimer.singleShot(1500, partial(self.next_button.setEnabled, True))

    def next_step_play_layout(self):
        """Click Next during Play"""

        self.step += 1

        self.description_or_code = True

        self.picture_button.setEnabled(False)

        self.next_button.setEnabled(False)
        QTimer.singleShot(3000, partial(self.next_button.setEnabled, True))

        self.display_code.clear()
        self.display_description.setText(self.description_dict[self.step])
        self.display_step.setText('Step\n{0}/{1}'.format(
            str(self.step), self.get_dict_highest_value()))

    def images_to_database(self):

        for filename in os.listdir('temp_pic'):

            if filename.endswith(('.jpg', '.png', '.gif')):

                image_name = filename[:-4]

                image_path = os.path.join('temp_pic', filename)

                image_ext = filename[-3:]

                self.db.insertBLOB(image_name, image_path, image_ext)

    def menuRecord_method(self):
        """Upper Menu option"""

        self.remove_temp_pictures()

        self.clear_record_menu()

        self.record_or_play = True

        self.stacked_layout.setCurrentIndex(1)

        self.display_description.setText('')

        self.display_code.setText('')

    def menuPlay_method(self):
        """Upper Menu option"""
        self.play_table.clear()

        self.load_to_play_table()

        self.record_or_play = False

        self.stacked_layout.setCurrentIndex(2)

        self.display_description.setText('')

        self.display_code.setText('')

    def menuDelete_method(self):
        """Upper Menu option"""
        self.delete_task_text_box.clear()

        self.stacked_layout.setCurrentIndex(3)

    def menuAbout_method(self):
        """Upper Menu option"""
        self.about_step = 1

        self.about_label.setText(self.about_dict[self.about_step])

        self.stacked_layout.setCurrentIndex(4)

    def menuExit_method(self):
        """Upper Menu option"""
        sys.exit()
Esempio n. 37
0
class QChatWidget(QWidget):

    def __init__(self, chat_window, nick, parent=None):
        QWidget.__init__(self, parent)

        self.chat_window = chat_window
        self.nick = nick

        self.disabled = False
        self.cleared = False

        self.url_regex = re.compile(URL_REGEX)

        self.chat_log = QTextBrowser()
        self.chat_log.setOpenExternalLinks(True)

        self.chat_input = QTextEdit()
        self.chat_input.textChanged.connect(self.chatInputTextChanged)

        self.send_button = QPushButton("Send")
        self.send_button.clicked.connect(self.sendMessage)

        # Set the min height for the chatlog and a matching fixed height for the send button
        chat_input_font_metrics = QFontMetrics(self.chat_input.font())
        self.chat_input.setMinimumHeight(chat_input_font_metrics.lineSpacing() * 3)
        self.send_button.setFixedHeight(chat_input_font_metrics.lineSpacing() * 3)

        hbox = QHBoxLayout()
        hbox.addWidget(self.chat_input)
        hbox.addWidget(self.send_button)

        # Put the chatinput and send button in a wrapper widget so they may be added to the splitter
        chat_input_wrapper = QWidget()
        chat_input_wrapper.setLayout(hbox)
        chat_input_wrapper.setMinimumHeight(chat_input_font_metrics.lineSpacing() * 3.7)

        # Put the chat log and chat input into a splitter so the user can resize them at will
        splitter = QSplitter(Qt.Vertical)
        splitter.addWidget(self.chat_log)
        splitter.addWidget(chat_input_wrapper)
        splitter.setSizes([int(parent.height()), 1])

        hbox = QHBoxLayout()
        hbox.addWidget(splitter)
        self.setLayout(hbox)

        self.typing_timer = QTimer()
        self.typing_timer.setSingleShot(True)
        self.typing_timer.timeout.connect(self.stoppedTyping)

    def setRemoteNick(self, nick):
        self.nick = nick

    def chatInputTextChanged(self):
        # Check if the text changed was the text box being cleared to avoid sending an invalid typing status
        if self.cleared:
            self.cleared = False
            return

        if str(self.chat_input.toPlainText())[-1:] == '\n':
            self.sendMessage()
        else:
            # Start a timer to check for the user stopping typing
            self.typing_timer.start(TYPING_TIMEOUT)
            self.sendTypingStatus(TYPING_START)

    def stoppedTyping(self):
        self.typing_timer.stop()
        if str(self.chat_input.toPlainText()) == '':
            self.sendTypingStatus(TYPING_STOP_WITHOUT_TEXT)
        else:
            self.sendTypingStatus(TYPING_STOP_WITH_TEXT)

    def sendMessage(self):
        if self.disabled:
            return
        else:
            pass

        self.typing_timer.stop()

        text = str(self.chat_input.toPlainText())[:-1]

        # Don't send empty messages
        if text == '':
            return

        # Convert URLs into clickable links
        text = self.__linkify(text)

        # Add the message to the message queue to be sent
        self.chat_window.client.getSession(self.remote_id).sendChatMessage(text)

        # Clear the chat input
        self.wasCleared = True
        self.chat_input.clear()

        self.appendMessage(text, MSG_SENDER)

    def sendTypingStatus(self, status):
        self.chat_window.client.getSession(self.remote_id).sendTypingMessage(status)

    def showNowChattingMessage(self, nick):
        self.nick = nick
        self.remote_id = self.chat_window.client.getClientId(self.nick)
        self.appendMessage("You are now securely chatting with " + self.nick + " :)",
                           MSG_SERVICE, show_timestamp_and_nick=False)

        self.appendMessage("It's a good idea to verify the communcation is secure by selecting "
                           "\"authenticate buddy\" in the options menu.", MSG_SERVICE, show_timestamp_and_nick=False)

        self.addNickButton = QPushButton('Add', self)
        self.addNickButton.setGeometry(584, 8, 31, 23)
        self.addNickButton.clicked.connect(self.addNickScreen)
        self.addNickButton.show()

    def addUser(self, user):
        nick = str(user.text()).lower()

        # Validate the given nick
        nickStatus = utils.isValidNick(nick)
        if nickStatus == errors.VALID_NICK:
            # TODO: Group chats
            pass
        elif nickStatus == errors.INVALID_NICK_CONTENT:
            QMessageBox.warning(self, errors.TITLE_INVALID_NICK, errors.INVALID_NICK_CONTENT)
        elif nickStatus == errors.INVALID_NICK_LENGTH:
            QMessageBox.warning(self, errors.TITLE_INVALID_NICK, errors.INVALID_NICK_LENGTH)
        elif nickStatus == errors.INVALID_EMPTY_NICK:
            QMessageBox.warning(self, errors.TITLE_EMPTY_NICK, errors.EMPTY_NICK)

    def addNickScreen(self):
        self.chat_log.setEnabled(False)
        self.chat_input.setEnabled(False)
        self.send_button.setEnabled(False)
        self.addNickButton.hide()
        self.addUserText = QLabel("Enter a username to add a user to the group chat.", self)
        self.addUserText.setGeometry(200, 20, 300, 100)
        self.addUserText.show()
        self.user = QLineEdit(self)
        self.user.setGeometry(200, 120, 240, 20)
        self.user.returnPressed.connect(self.addUser)
        self.user.show()
        self.addUserButton = QPushButton('Add User', self)
        self.addUserButton.setGeometry(250, 150, 150, 25)
        self.addUserButton.clicked.connect(lambda: self.addUser(self.user))
        self.addUserButton.show()
        self.cancel = QPushButton('Cancel', self)
        self.cancel.setGeometry(298, 210, 51, 23)
        self.cancel.clicked.connect(lambda: self.chat_log.setEnabled(True))
        self.cancel.clicked.connect(lambda: self.chat_input.setEnabled(True))
        self.cancel.clicked.connect(lambda: self.send_button.setEnabled(True))
        self.cancel.clicked.connect(self.addUserText.hide)
        self.cancel.clicked.connect(self.user.hide)
        self.cancel.clicked.connect(self.addUserButton.hide)
        self.cancel.clicked.connect(self.addNickButton.show)
        self.cancel.clicked.connect(self.cancel.hide)
        self.cancel.show()

    def appendMessage(self, message, source, show_timestamp_and_nick=True):
        color = self.__getColor(source)

        if show_timestamp_and_nick:
            timestamp = '<font color="' + color + '">(' + getTimestamp() + ') <strong>' + \
                        (self.chat_window.client.nick if source == MSG_SENDER else self.nick) + \
                        ':</strong></font> '
        else:
            timestamp = ''

        # If the user has scrolled up (current value != maximum), do not move the scrollbar
        # to the bottom after appending the message
        shouldScroll = True
        scrollbar = self.chat_log.verticalScrollBar()
        if scrollbar.value() != scrollbar.maximum() and source != constants.SENDER:
            shouldScroll = False

        self.chat_log.append(timestamp + message)

        # Move the vertical scrollbar to the bottom of the chat log
        if shouldScroll:
            scrollbar.setValue(scrollbar.maximum())

    def __linkify(self, text):
        matches = self.url_regex.findall(text)
        for match in matches:
            text = text.replace(match[0], '<a href="%s">%s</a>' % (match[0], match[0]))
        return text

    def __getColor(self, source):
        if source == MSG_SENDER:
            if qtUtils.is_light_theme:
                return '#0000CC'
            else:
                return '#6666FF'
        elif source == MSG_RECEIVER:
            if qtUtils.is_light_theme:
                return '#CC0000'
            else:
                return '#CC3333'
        else:
            if qtUtils.is_light_theme:
                return '#000000'
            else:
                return '#FFFFFF'

    def disable(self):
        self.disabled = True
        self.chat_input.setReadOnly(True)

    def enable(self):
        self.disabled = False
        self.chat_input.setReadOnly(False)
Esempio n. 38
0
class Window(QWidget):
    finished = pyqtSignal(int)

    def __init__(self):
        QWidget.__init__(self)
        layout = QVBoxLayout(self)
        self.button = QPushButton('Get Messages')
        self.edit = QTextEdit()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)
        self.button.clicked.connect(self.handleTest)

        log('About to setup the EMailServer')
        self.email_server = EMailServer(EmailAccount)

        self.setGeometry(100, 100, 900, 600)
        self.setWindowTitle('Mail Headers')
        self.show()

        self.update_headers(self.email_server.headers)
#        self.start_worker()

    def handleTest(self):
        self.edit.setReadOnly(False)
        self.edit.clear()
        self.refresh()
        self.edit.setReadOnly(True)

    def refresh(self, latest=None):
        """Get all headers after given ID.

        latest  ID of last received email
        """

        if latest is None:
            headers = self.email_server.get_headers(EmailBox)
        else:
            headers = self.email_server.get_headers(EmailBox)
        log('refresh: headers=%s' % str(headers))
        self.email_server.put_saved_headers(headers)
        self.update_headers(headers)

    def update_headers(self, headers):
        for (id, header, frm, datetime) in headers:
            self.edit.append(header + ' ' + frm)

    def start_worker(self):
        log('start_worker: starting')
        self.thread = QThread()
        self.finished[int].connect(self.refresh_box)
        self.thread.started.connect(self.get_all_headers)
        self.thread.start()

    @pyqtSlot(int)
    def refresh_box(self, i):
        log("refresh_box: Base caught finished, {}".format(i))

    def get_all_headers(self, result=42):
        log("Worker work")
        self.refresh()
        self.finished.emit(result)
Esempio n. 39
0
class CentralWidget(QWidget):

    l = logging.getLogger('CentralWidget')

    updateWindowTitle = pyqtSignal(str)

    def __init__(self, parentWidget, settings):
        QWidget.__init__(self, parentWidget)

        self.settings = settings
        self.theLayout = QHBoxLayout()
        self.splitter = QSplitter(self)
        self.theLayout.addWidget(self.splitter)

        self.browserWidget = BrowserWidget(self, self.settings)
        self.browserWidget.itemSelected.connect(self.itemSelected)

        self.tabWidget = QTabWidget(self)

        tab = QWidget()

        tabLayout = QVBoxLayout(tab)
        tab.setLayout(tabLayout)

        self.editorWidget = EditorWidget(tab)

        self.editorWidget.setObjectName("EditorWidget1")
        self.editorWidget.message.connect(self.showMessage)
        self.editorWidget.titleChanged.connect(self.updateWindowTitle)
        self.editorWidget.navigate.connect(self.navigate)

        tabLayout.addWidget(self.editorWidget)
        self.editTabIdx = self.tabWidget.addTab(tab, "Edit")
#############################

        self.browser = QWebView(self.tabWidget)
        self.browser.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
        self.browser.linkClicked.connect(self.navigateWeb)
        self.webTabIdx = self.tabWidget.addTab(self.browser, "View web")

        self.pdfTabIdx = self.tabWidget.addTab(QWidget(self.tabWidget), "View pdf")

        self.textView = QTextEdit(self.tabWidget)
        self.textView.setReadOnly(True)
        self.textView.setFontFamily('Courier')
        self.textView.setFontPointSize(8)
        self.structureTabIdx = self.tabWidget.addTab(self.textView, "View document structure")

        self.customView = QTextEdit(self.tabWidget)
        self.customView.setReadOnly(True)
        self.customView.setFontFamily('Courier')
        self.customView.setFontPointSize(10)
        self.xmlTabIdx = self.tabWidget.addTab(self.customView, "View XML")

        self.htmlView = QTextEdit(self.tabWidget)
        self.htmlView.setReadOnly(True)
        self.htmlView.setFontFamily('Courier')
        self.htmlView.setFontPointSize(10)
        self.htmlTabIdx = self.tabWidget.addTab(self.htmlView, "View Html")

        self.tabWidget.currentChanged.connect(self.tabSelected)

# Search/Links widget in lower left corner ####################################
        self.searchWidget = SearchWidget(self)
        self.searchWidget.resultSelected.connect(self.navigateDirect)

        self.toLinksWidget = LinklistWidget(self)
        self.toLinksWidget.resultSelected.connect(self.navigateDirect)

        self.fromLinksWidget = LinklistWidget(self)
        self.fromLinksWidget.resultSelected.connect(self.navigateDirect)

        self.listsWidget = QTabWidget(self)
        self.listsWidget.addTab(self.searchWidget, 'Search')
        self.listsWidget.addTab(self.toLinksWidget, 'Links to')
        self.listsWidget.addTab(self.fromLinksWidget, 'Links from')
###############################################################################

        leftWidget = QSplitter(Qt.Vertical, self)
        leftWidget.addWidget(self.browserWidget)
        leftWidget.addWidget(self.listsWidget)

        self.splitter.addWidget(leftWidget)
        self.splitter.addWidget(self.tabWidget)
        leftWidget.setSizes([400, 100])             # TODO

        self.setLayout(self.theLayout)
        self.splitter.setSizes([100, 400])          # TODO
        # self.splitter.setChildrenCollapsible(False)
        self.editorWidget.setEnabled(False)


    def navigateWeb(self, url):
        if url.scheme() == 'file':
            pageId = url.fileName()
            self.navigate(pageId)
            self.tabSelected(1)
        elif url.scheme() == 'http' or url.scheme() == 'https':
            self.browser.setUrl(url)


    def showMessage(self, message):
        self.parent().statusBar.showMessage(message, 3000)


    def navigate(self, pageId):
        """Assumption: pageId is sub page of current page"""
        self.l.debug('Navigating to sub page "{}"'.format(pageId))

        self.editorWidget.save()
        self.browserWidget.navigate(pageId)        # Will implicitly load the page


    def navigateDirect(self, pageId):
        """Assumption: pageId is NOT sub page of current page. 
        Hence we need to let the browser point to the first occurrence of the page."""
        self.l.debug('Navigating directly to "{}"'.format(pageId))

        self.editorWidget.save()
        self.browserWidget.navigateDirect(pageId)   # Will implicitly load the page


    def itemSelected(self):
        treeNode = self.browserWidget.currentItem
        self.l.debug('Selected tree node: {}'.format(treeNode))

        pageId = treeNode.getPageId()
        notepad = treeNode.getNotepad()

        self.editorWidget.setEnabled(True)
        self.editorWidget.save()
        self.editorWidget.load(notepad, pageId)

        self.updateLinkLists(notepad, pageId)


    def updateLinkLists(self, notepad, pageId):
        
        linksTo = notepad.getChildPages(pageId)
        linksFrom = notepad.getParentPages(pageId)

        self.toLinksWidget.setContents(linksTo)
        self.fromLinksWidget.setContents(linksFrom)


    def tabSelected(self, index):
        if index == self.editTabIdx:
            pass
        elif index == self.webTabIdx:
            self.activateWebView()
        elif index == self.pdfTabIdx:
            pass
        elif index == self.structureTabIdx:
            self.activateStructureView()
        elif index == self.xmlTabIdx:
            self.activateXMLView()
        elif index == self.htmlTabIdx:
            self.activateHTMLView()


    def activateWebView(self):
        exporter = HTMLExporter(self.editorWidget.page.getPageDir())
        self.htmlView.setPlainText(exporter.getHtmlString(self.editorWidget.editView.document()))

        ########### get URL for the stylesheet and for the base URL

        webpageCSS = pkg_resources.resource_string(data.__name__, 'webpage.css')
        print("webpage.css file: {} - {}".format(webpageCSS, type(webpageCSS)))

        mypath = os.getcwd()
        mypath = mypath.replace('\\', '/')
        baseURL = QUrl('file:///{}/'.format(mypath))

        # The location must be either a path on the local filesystem, or a 
        # data URL with UTF-8 and Base64 encoded data, such as:
        # "data:text/css;charset=utf-8;base64,cCB7IGJhY2tncm91bmQtY29sb3I6IHJlZCB9Ow=="
        # BASE64 works on bytes!!
        import base64
        cssData = base64.b64encode(webpageCSS)
        cssData = cssData.decode('utf-8')
        cssDataUrl = 'data:text/css;charset=utf-8;base64,{}'.format(cssData)
        print("webpage.css base64: {}".format(cssDataUrl ))
        # cssDataUrl = QUrl('data:text/css;charset=utf-8;base64,{}'.format(cssData)) # 'file:///{}/webpage.css'.format(mypath))

        ###########

        self.browser.settings().setUserStyleSheetUrl(QUrl(cssDataUrl))

        self.browser.setHtml(self.htmlView.toPlainText(), baseURL)


    def activateStructureView(self):
        self.textView.clear()

        doc = self.editorWidget.editView.document()
        traversal = TextDocumentTraversal()
        tree = traversal.traverse(doc)
        
        sp = StructurePrinter(tree, self.textView.insertPlainText)
        sp.traverse()


    def activateXMLView(self):
        exporter = XMLExporter(self.editorWidget.page.getPageDir(), None)
        self.customView.setPlainText(exporter.getXmlString(self.editorWidget.editView.document()))


    def activateHTMLView(self):
        exporter = HTMLExporter(self.editorWidget.page.getPageDir())
        self.htmlView.setPlainText(exporter.getHtmlString(self.editorWidget.editView.document()))
Esempio n. 40
0
class ChatWindow(QWidget):
    # 聊天显示框发消息信号
    msgsig = pyqtSignal(str)
    # 给主窗口传递的关闭信号
    clssig = pyqtSignal(str)

    # 发送套接字
    sendsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 主线程运行标志
    isrunning = True

    # 连接检查周期
    terms = 5

    # 是否提示过连接正常标志
    lastok = False

    def __init__(
        self,
        friend_id,
        uid,
    ):
        super().__init__()
        self.friend_id = friend_id
        self.uid = uid
        # 发送和接受的套接字
        self.recvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 是否能够通信的标志,双重验证
        # imok = True 表示本人作为c,对方作为s已建立
        # urok = True 表示本人作为s,对方作为c已建立
        self.imok = False
        self.urok = False
        # 基本信息
        self.w = 450
        self.h = 450
        self.setFixedSize(self.w, self.h)
        self.setWindowTitle('Chatting with{}'.format(self.friend_id))
        # 好友头像及学号信息
        self.friend_icon = QLabel()
        self.friend_idshow = QLabel()
        # 聊天显示框
        self.msgbrowser = QTextBrowser()
        # 信号连接到显示框
        self.msgsig.connect(self.msgappend)
        # 聊天输入框
        self.msginputer = QTextEdit()
        # 聊天发送按钮
        self.sendmsg = QPushButton()
        # 文件发送按钮
        self.sendfile = QPushButton()
        # 总体网格布局
        self.layout = QGridLayout()
        # 界面初始化
        self.initlabel()
        self.inittexter()
        self.initbtw()
        self.setLayout(self.layout)
        # 建立通信的线程
        self.tcThread = td.Thread(target=self.isclear)
        self.tcThread.setDaemon(True)
        self.tcThread.start()
        # 接受信息的线程
        self.gmThread = td.Thread(target=self.getmsg)
        self.gmThread.setDaemon(True)
        self.gmThread.start()
        # 发送按钮功能连接
        self.sendmsg.clicked.connect(lambda: self.sendmessage())
        # 选择文件并发送按钮功能连接
        self.sendfile.clicked.connect(lambda: self.sendFile())

    # 头像及ID初始化
    def initlabel(self):
        # 创建头像并添加至个人布局
        faceinfo = getInfo('ICON', self.friend_id)
        faceimg = QPixmap('../data/lib/{}.jpg'.format(faceinfo))
        self.friend_icon.setPixmap(faceimg)
        self.friend_icon.setFixedSize(60, 60)
        self.layout.addWidget(self.friend_icon, 1, 6, 2, 3, Qt.AlignCenter)
        font = QFont('Roman Times', 12, QFont.DemiBold)
        self.friend_idshow.setFont(font)
        self.friend_idshow.setText('ID:{}'.format(self.friend_id))
        self.friend_idshow.setAlignment(Qt.AlignCenter)
        self.friend_idshow.setFixedSize(120, 20)
        self.layout.addWidget(self.friend_idshow, 3, 6, 1, 3, Qt.AlignCenter)

    # 文本框初始化
    def inittexter(self):
        self.msgbrowser.setFixedSize(300, 300)
        self.layout.addWidget(self.msgbrowser, 0, 0, 6, 6, Qt.AlignCenter)
        self.msginputer.setFixedSize(300, 100)
        self.layout.addWidget(self.msginputer, 6, 0, 1, 6, Qt.AlignCenter)

    # 按钮初始化
    def initbtw(self):
        self.sendmsg.setText('发送(Enter)')
        self.sendmsg.setShortcut('return')
        self.sendmsg.setFixedSize(100, 30)
        self.layout.addWidget(self.sendmsg, 6, 6, 1, 3, Qt.AlignCenter)
        self.sendfile.setText('文件传输')
        self.sendfile.setFixedSize(100, 30)
        self.layout.addWidget(self.sendfile, 8, 6, 1, 3, Qt.AlignCenter)

    # 接受套接字初始化
    def getrecvsock(self, sock):
        self.recvsock = sock
        # 如果接收套接字被成功初始化,说明已成功建立连接
        self.urok = True

    # 接受关闭聊天的动作
    def endchat(self):
        self.recvsock.close()
        self.sendsock.close()
        self.imok = False
        self.urok = False
        self.msgsig.emit('系统' + gettime() + ':\n')
        self.msgsig.emit('对方已断开连接,请关闭该窗口\n')
        # self.msgbrowser.append('系统' + gettime() + ':\n')
        # self.msgbrowser.append('连接已断开,请关闭窗口\n')

    # 尝试进行聊天的动作
    def trychat(self):
        self.msgsig.emit('系统' + gettime() + ':\n')
        self.msgsig.emit('等待对方建立连接...\n')
        response = self.buildconnection()
        if response == 0:
            # self.msgsig.emit('系统' + gettime() + ':\n')
            # self.msgsig.emit('对方成功连接\n')
            self.imok = True
        else:
            self.msgsig.emit('系统' + gettime() + ':\n')
            self.msgsig.emit('连接超时,将重试\n')

    # 检查连接的线程
    def isclear(self):
        while self.isrunning:
            if not self.imok:
                self.terms = 5
                self.trychat()
            elif not self.urok:
                self.terms = 5
                self.msgsig.emit('系统' + gettime() + ':\n')
                self.msgsig.emit('对方连接建立失败,尝试关闭窗口后重试\n')
            else:
                if not self.lastok:
                    self.msgsig.emit('系统' + gettime() + ':\n')
                    self.msgsig.emit('连接正常\n')
                    self.lastok = True
                self.terms = self.terms * 2
            time.sleep(self.terms)

    # 接受消息的线程
    def getmsg(self):
        while self.isrunning:
            # print('getting message')
            # urok能收到对方的信息
            while self.urok:
                try:
                    coded_msg = self.recvsock.recv(1024)
                except socket.error:
                    continue
                # 接收对方已退出的信号
                if coded_msg.decode('utf-8') is 'e':
                    self.endchat()
                    return
                # 接收传文件的信号
                elif coded_msg.decode('utf-8')[0] is 'f':
                    self.msgsig.emit('系统' + ',' + gettime() + '\n')
                    self.msgsig.emit('对方正在向你传输文件...\n')
                    whole = coded_msg.decode('utf-8')
                    filename, unused, length = whole.partition('&len&')
                    filename = filename.lstrip('f')
                    length = int(length)
                    newfile = open('../data/files/' + filename, 'wb+')
                    time = 0
                    while True:
                        mes = self.recvsock.recv(1024)
                        if mes:
                            newfile.write(mes)
                            time += len(mes)
                            if time == length:
                                self.msgsig.emit('系统,' + gettime() + '\n')
                                self.msgsig.emit('文件{}传输完成\n'.format(filename))
                                # 提示对方已接受到文件
                                cmd = 'o'
                                cmd = cmd.encode('utf-8')
                                self.sendsock.send(cmd)
                                break
                elif coded_msg.decode('utf-8') is 'o':
                    self.msgsig.emit('系统,' + gettime() + '\n')
                    self.msgsig.emit('文件传输完毕\n')
                    continue
                # 接收普通聊天内容
                else:
                    t, msg = getmsg(coded_msg)
                    print(coded_msg.decode('utf-8'))
                    self.msgsig.emit(self.friend_id + ',' + t + ':\n')
                    self.msgsig.emit(msg + '\n')

    # 发送消息
    def sendmessage(self):
        if self.imok:
            message = self.msginputer.toPlainText()
            print(message)
            self.msgsig.emit(self.uid + ',' + gettime() + ':\n')
            self.msgsig.emit(message + '\n')
            self.msginputer.clear()
            coded_msg = tomsg(message)
            self.sendsock.send(coded_msg)

    # 消息显示框附加显示消息
    def msgappend(self, connect):
        self.msgbrowser.append(connect)

    # 发送文件
    def sendFile(self):
        fileName, fileType = QFileDialog.getOpenFileName(
            self, '选择文件', os.getcwd())
        # print(fileName)
        if fileName:
            fileSize = str(os.path.getsize(fileName))
            print(fileSize)
            pathName, pureName = os.path.split(fileName)
            print(pureName)
            # 依据本人的简单协议来提示对面将传输文件
            info = 'f{}&len&{}'.format(pureName, fileSize).encode('utf-8')
            self.sendsock.send(info)
            f = open(fileName, 'rb')
            self.msgsig.emit('系统,' + gettime() + ':\n')
            self.msgsig.emit('正在向对方发送文件,请不要发送信息\n')
            for line in f:
                self.sendsock.send(line)

    """
    尝试建立连接
    返回值定义:
    0.成功建立连接
    1.未能建立连接
    """

    def buildconnection(self):
        # 向服务器请求好友的IP地址
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(4.0)
        try:
            sock.connect((serverIP, serverport))
        except socket.error:
            return 1
        request = 'q{}'.format(self.friend_id)
        sock.send(request.encode('utf-8'))
        try:
            response = sock.recv(1024)
        except socket.error:
            return 1
        response = response.decode('utf-8')
        print(response)
        if response is 'n':
            return 1
        # 开始与好友建立连接
        tempsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # self.sendsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            print('yes')
            tempsock.connect((response, chatport))
            # self.sendsock.connect((response, chatport))
        except socket.error:
            print('error')
            return 1
        cmd = 'c' + self.uid
        print(cmd)
        tempsock.send(cmd.encode('utf-8'))
        # self.sendsock.send(cmd.encode('utf-8'))
        try:
            response = tempsock.recv(1024)
            # response = self.sendsock.recv(1024)
        except socket.error:
            return 1
        response = response.decode('utf-8')
        if response == 'y':
            print('get response from server.')
            self.sendsock = tempsock
            return 0
        else:
            tempsock.close()
            # self.sendsock.close()
            return 1

    # 重写关闭窗体事件,以确保不会对已关闭的套接字重复操作并确保关闭所有不用套接字
    def closeEvent(self, QCloseEvent):
        reply = QMessageBox.question(self, '退出聊天', "确认要关闭该聊天?",
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if reply == QMessageBox.Yes:
            # 通知对方退出连接
            # tempsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            if self.urok and self.imok:
                cmd = 'e'
                cmd = cmd.encode('utf-8')
                # tempsock.connect((serverIP, serverport))
                # tempsock.send(cmd)
                self.sendsock.send(cmd)
                # 清理套接字
                self.sendsock.close()
                self.recvsock.close()
                self.urok = False
                self.imok = False
            # 关闭线程
            self.isrunning = False
            # 给主窗口发送信号已关闭该窗口,唯一辨识标志为friend_id
            self.clssig.emit(self.friend_id)
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            QCloseEvent.accept()
        else:
            QCloseEvent.ignore()
Esempio n. 41
0
class AddressBook(QWidget):
    NavigationMode, AddingMode, EditingMode = range(3)

    def __init__(self, parent=None):
        super(AddressBook, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldName = ''
        self.oldAddress = ''
        self.currentMode = self.NavigationMode

        nameLabel = QLabel("Name:")
        self.nameLine = QLineEdit()
        self.nameLine.setReadOnly(True)

        addressLabel = QLabel("Address:")
        self.addressText = QTextEdit()
        self.addressText.setReadOnly(True)

        self.addButton = QPushButton("&Add")
        self.addButton.show()
        self.editButton = QPushButton("&Edit")
        self.editButton.setEnabled(False)
        self.removeButton = QPushButton("&Remove")
        self.removeButton.setEnabled(False)
        self.submitButton = QPushButton("&Submit")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&Cancel")
        self.cancelButton.hide()

        self.nextButton = QPushButton("&Next")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("&Previous")
        self.previousButton.setEnabled(False)

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.editButton.clicked.connect(self.editContact)
        self.removeButton.clicked.connect(self.removeContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton)
        buttonLayout1.addWidget(self.editButton)
        buttonLayout1.addWidget(self.removeButton)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addStretch()

        buttonLayout2 = QHBoxLayout()
        buttonLayout2.addWidget(self.previousButton)
        buttonLayout2.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addLayout(buttonLayout1, 1, 2)
        mainLayout.addLayout(buttonLayout2, 3, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Address Book")

    def addContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.nameLine.clear()
        self.addressText.clear()

        self.updateInterface(self.AddingMode)

    def editContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.updateInterface(self.EditingMode)

    def submitContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name == "" or address == "":
            QMessageBox.information(self, "Empty Field",
                    "Please enter a name and address.")
            return

        if self.currentMode == self.AddingMode:
            if name not in self.contacts:
                self.contacts[name] = address
                QMessageBox.information(self, "Add Successful",
                        "\"%s\" has been added to your address book." % name)
            else:
                QMessageBox.information(self, "Add Unsuccessful",
                        "Sorry, \"%s\" is already in your address book." % name)
                return

        elif self.currentMode == self.EditingMode:
            if self.oldName != name:
                if name not in self.contacts:
                    QMessageBox.information(self, "Edit Successful",
                            "\"%s\" has been edited in your address book." % self.oldName)
                    del self.contacts[self.oldName]
                    self.contacts[name] = address
                else:
                    QMessageBox.information(self, "Edit Unsuccessful",
                            "Sorry, \"%s\" is already in your address book." % name)
                    return
            elif self.oldAddress != address:
                QMessageBox.information(self, "Edit Successful",
                        "\"%s\" has been edited in your address book." % name)
                self.contacts[name] = address

        self.updateInterface(self.NavigationMode)

    def cancel(self):
        self.nameLine.setText(self.oldName)
        self.addressText.setText(self.oldAddress)
        self.updateInterface(self.NavigationMode)

    def removeContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name in self.contacts:
            button = QMessageBox.question(self, "Confirm Remove",
                    "Are you sure you want to remove \"%s\"?" % name,
                    QMessageBox.Yes | QMessageBox.No)

            if button == QMessageBox.Yes:
                self.previous()
                del self.contacts[name]

                QMessageBox.information(self, "Remove Successful",
                        "\"%s\" has been removed from your address book." % name)

        self.updateInterface(self.NavigationMode)

    def next(self):
        name = self.nameLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_name, _ = it.next()

                if this_name == name:
                    next_name, next_address = it.next()
                    break
        except StopIteration:
            next_name, next_address = iter(self.contacts).next()

        self.nameLine.setText(next_name)
        self.addressText.setText(next_address)

    def previous(self):
        name = self.nameLine.text()

        prev_name = prev_address = None
        for this_name, this_address in self.contacts:
            if this_name == name:
                break

            prev_name = this_name
            prev_address = this_address
        else:
            self.nameLine.clear()
            self.addressText.clear()
            return

        if prev_name is None:
            for prev_name, prev_address in self.contacts:
                pass

        self.nameLine.setText(prev_name)
        self.addressText.setText(prev_address)

    def updateInterface(self, mode):
        self.currentMode = mode

        if self.currentMode in (self.AddingMode, self.EditingMode):
            self.nameLine.setReadOnly(False)
            self.nameLine.setFocus(Qt.OtherFocusReason)
            self.addressText.setReadOnly(False)

            self.addButton.setEnabled(False)
            self.editButton.setEnabled(False)
            self.removeButton.setEnabled(False)

            self.nextButton.setEnabled(False)
            self.previousButton.setEnabled(False)

            self.submitButton.show()
            self.cancelButton.show()

        elif self.currentMode == self.NavigationMode:
            if not self.contacts:
                self.nameLine.clear()
                self.addressText.clear()

            self.nameLine.setReadOnly(True)
            self.addressText.setReadOnly(True)
            self.addButton.setEnabled(True)

            number = len(self.contacts)
            self.editButton.setEnabled(number >= 1)
            self.removeButton.setEnabled(number >= 1)
            self.nextButton.setEnabled(number > 1)
            self.previousButton.setEnabled(number >1 )

            self.submitButton.hide()
            self.cancelButton.hide()
Esempio n. 42
0
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()

        self.is_saved = True
        self.is_saved_first = True  # 1
        self.path = ''  # 2

        self.textedit = QTextEdit(self)
        self.textedit.textChanged.connect(self.on_textchanged_func)

        self.button = QPushButton('Save', self)
        self.button.clicked.connect(self.on_clicked_func)
        self.button_2 = QPushButton('Open', self)  # 3
        self.button_2.clicked.connect(self.open_file_func)

        self.h_layout = QHBoxLayout()
        self.h_layout.addWidget(self.button)
        self.h_layout.addWidget(self.button_2)
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.textedit)
        self.v_layout.addLayout(self.h_layout)
        self.setLayout(self.v_layout)

    def on_textchanged_func(self):
        if self.textedit.toPlainText():
            self.is_saved = False
        else:
            self.is_saved = True

    def on_clicked_func(self):  # 4
        if self.is_saved_first:
            self.save_as_func(self.textedit.toPlainText())
        else:
            self.save_func(self.textedit.toPlainText())

    def save_func(self, text):
        with open(self.path, 'w') as f:
            f.write(text)
        self.is_saved = True

    def save_as_func(self, text):
        self.path, _ = QFileDialog.getSaveFileName(self, 'Save File', './',
                                                   'Files (*.txt *.log)')
        if self.path:
            with open(self.path, 'w') as f:
                f.write(text)
            self.is_saved = True
            self.is_saved_first = False

    def open_file_func(self):  # 5
        file, _ = QFileDialog.getOpenFileName(self, 'Open File', './',
                                              'Files (*.txt *.log)')
        if file:
            with open(file, 'r') as f:
                self.textedit.clear()
                self.textedit.setText(f.read())
                self.is_saved = True

    def closeEvent(self, QCloseEvent):
        if not self.is_saved:
            choice = QMessageBox.question(
                self, '', 'Do you want to save the text?',
                QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if choice == QMessageBox.Yes:  # 6
                self.on_clicked_func()
                QCloseEvent.accept()
            elif choice == QMessageBox.No:
                QCloseEvent.accept()
            else:
                QCloseEvent.ignore()
class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.Title_list = [
            "PW", " PA ", "Signal\nCategory", "PRI", "PRI \n Min",
            "PRI \n Max", "Scan \n Type", "Scan \n Rate"
        ]
        title = "Radar Pulse Analyser"
        left = 500
        top = 300
        width = 800
        height = 600
        iconName = "icon.png"
        self.ServerStopFlag = False
        self.ClearDispCount = 0
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(iconName))
        self.setGeometry(left, top, width, height)
        self.UiComponents()
        self.show()
        #  self.Text.append("Server Started")
        self.Server_Start()

    ###################################################################################################################
    def UiComponents(self):
        self.toolbar = QToolBar(self)
        self.toolbar.setMovable(False)
        self.toolbar.setStyleSheet("background-color : white")
        self.toolbar.setGeometry(QRect(0, 0, 800, 60))
        self.Text = QTextEdit(self)
        self.Text.move(0, 500)
        self.Text.resize(800, 100)
        self.button = QPushButton("Start Pulse Analysis", self)
        self.button.move(150, 150)
        self.button.setGeometry(QRect(10, 455, 180, 40))
        self.button1 = QPushButton("Stop Pulse Analysis", self)
        self.button1.move(40, 40)
        self.button1.setGeometry(QRect(200, 455, 180, 40))
        self.button2 = QPushButton("Clear", self)
        self.button2.move(50, 50)
        self.button2.setGeometry(QRect(390, 455, 180, 40))
        self.button3 = QPushButton("Save PDW", self)
        self.button3.setGeometry(QRect(580, 455, 180, 40))
        self.ActplotDTOA = QAction("PLSCMT\nVS\nDTOA", self)
        self.ActplotHistPRI = QAction("Histogram", self)
        self.ActplotHistPW = QAction("PA\nVS\nDTOA", self)
        self.toolbar.addAction(self.ActplotDTOA)
        self.toolbar.addAction(self.ActplotHistPRI)
        self.toolbar.addAction(self.ActplotHistPW)

        self.tableWidget = QTableWidget(self)
        self.tableWidget.setGeometry(QRect(10, 60, 775, 380))
        font = QtGui.QFont()
        font.setBold(True)
        font.setPointSize(9)
        font.setItalic(True)
        font.setWeight(75)
        self.tableWidget.setFont(font)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(8)
        self.tableWidget.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)
        self.tableWidget.setHorizontalHeaderLabels(self.Title_list)

        self.button.clicked.connect(self.Server_Start)
        self.button1.clicked.connect(self.Server_Stop)
        self.button2.clicked.connect(self.Clear)
        self.button3.clicked.connect(self.savePDW)

        self.ActplotDTOA.triggered.connect(self.plotDTOA)
        self.ActplotHistPRI.triggered.connect(self.plotHistPRI)
        self.ActplotHistPW.triggered.connect(self.plotHistPW)

        self.button.setEnabled(False)
        self.CurRowInd = 0
        self.thread = MyThread()
        # self.thread.change_value.connect(self.setProgressVal)
        self.thread.StopFlag = False
        self.thread.start()
        self.thread.StartPulseAnalysis = False
        # self.thread.pd_PDW_Update.connect(self.updateGraphs)
        # self.thread.Track_Update.connect(self.updateTrackTable)
        self.thread.updatePDW.connect(self.ExtractPDW)
        self.RAW_DTOA = np.empty(0, dtype='u4')
        self.PulseWidth = np.empty(0, dtype='u4')
        self.PulseAmpl = np.empty(0, dtype='u4')
        self.PDWUpdateFlag = False
        self.timer = QTimer(self)
        #self.timer = 2000
        # self.timer.timeout(2000)
        self.timer.timeout.connect(self.ExtractPulseParam)
        ############################################################################################################

    def plotDTOA(self):
        if self.SignalType == 'JITTER':
            Plot_DTOA(self.RAW_DTOA, x_lim2=500)
        else:
            Plot_DTOA(self.RAW_DTOA, x_lim2=100)

    def plotHistPRI(self):
        Plot_DTOA_Hist(self.RAW_DTOA)

    def plotHistPW(self):
        Plot_DTOA_Hist(self.PulseWidth)

    def ExtractPDW(self, recv_data):
        # self.Text.append('Extract PDW')
        PW, PA, D_TOA = Extract_PDW(recv_data[1:])
        self.RAW_DTOA = np.concatenate((self.RAW_DTOA, D_TOA), axis=0)
        self.PulseWidth = np.concatenate((self.PulseWidth, PW), axis=0)
        self.PulseAmpl = np.concatenate((self.PulseAmpl, PA), axis=0)
        self.PDWUpdateFlag = True
#####################################################################################################################

    def ExtractPulseParam(self):
        self.Text.append('Pulse Count' + str(len(self.RAW_DTOA)))
        # self.CurRowInd = self.tableWidget.rowCount()
        # self.tableWidget.setRowCount(self.CurRowInd+1)
        if self.PDWUpdateFlag == True:
            try:
                self.tableWidget.setRowCount(self.CurRowInd + 1)
                # self.CurRowInd = 1
                if len(self.RAW_DTOA > 1000):
                    TrackData = GetPRI(self.RAW_DTOA[-1000:])
                    TrackData['Pulse Width'] = GetPW(self.PulseWidth[-1000:])
                else:
                    TrackData = GetPRI(self.RAW_DTOA)
                    TrackData['Pulse Width'] = GetPW(self.PulseWidth)
                print(TrackData)
                self.SignalType = TrackData.get('Signal Category')
                self.Text.clear()
                self.Text.append(str(TrackData))
                PW = f'''{TrackData['Pulse Width']}'''
                PA = f'''{TrackData['Pulse Amplitude']}'''
                PRI = f'''{TrackData['PRI']}'''
                minPRI = f'''{TrackData['Min PRI']}'''
                maxPRI = f'''{TrackData['Max PRI']}'''
                ScanRate = f'''{TrackData['Scan Rate']}'''
                self.tableWidget.setItem(self.CurRowInd, 0,
                                         QTableWidgetItem(PW))
                self.tableWidget.setItem(self.CurRowInd, 1,
                                         QTableWidgetItem(PA))
                self.tableWidget.setItem(
                    self.CurRowInd, 2,
                    QTableWidgetItem(TrackData.get('Signal Category')))
                self.tableWidget.setItem(self.CurRowInd, 3,
                                         QTableWidgetItem(PRI))
                self.tableWidget.setItem(self.CurRowInd, 4,
                                         QTableWidgetItem(minPRI))
                self.tableWidget.setItem(self.CurRowInd, 5,
                                         QTableWidgetItem(maxPRI))
                self.tableWidget.setItem(
                    self.CurRowInd, 6,
                    QTableWidgetItem(TrackData.get('Scan Type')))
                self.tableWidget.setItem(self.CurRowInd, 7,
                                         QTableWidgetItem(ScanRate))
                #  print (GetPW(PulseWidth))
                #self.Track_Update.emit(TrackData)
            except:
                self.Text.append('No PDWs in Buffer')
            self.PDWUpdateFlag = False
        self.timer.start(2000)
        #Munny Write here to insert into table TrackData
        #self.savePDW()
####################################################################################################################

    def savePDW(self):
        TOA = []
        TOA.append(0)
        for i in range(1, len(self.RAW_DTOA)):
            TOA.append(TOA[i - 1] + self.RAW_DTOA[i - 1])
        pdwdata = []
        # for i in range(1000):
        #     pdwdata.append([PulseWidth[i], PulseAmpl[i], RAW_DTOA[i], TOA[i]])
        try:
            df = pd.DataFrame(columns=['TOA', 'PW', 'PA', 'DTOA'])
            df['PW'] = self.PulseWidth
            df['PA'] = self.PulseAmpl
            df['DTOA'] = self.RAW_DTOA
            df['TOA'] = TOA
            df.to_csv('pdw.csv')
        # self.pd_PDW_Update.emit(df)
        except:
            print('Error')

    ###################################################################################################################
    def Server_Start(self):
        self.Clear()
        self.Text.append("Pulse Analysis Started")
        self.RAW_DTOA = np.empty(0, dtype='u4')
        self.PulseWidth = np.empty(0, dtype='u4')
        self.PulseAmpl = np.empty(0, dtype='u4')

        self.button.setEnabled(False)
        self.button1.setEnabled(True)
        # self.Text.append("Server Started")
        self.thread.StartPulseAnalysis = True
        self.timer.start(2000)

    ###################################################################################################################
    def Server_Stop(self):
        # self.thread.StopFlag = True
        self.button.setEnabled(True)
        self.button1.setEnabled(False)
        self.Text.append("Pulse Analysis Stopped")
        self.thread.StartPulseAnalysis = False
        #self.thread.exit()
        #self.ServerStopFlag = True
        self.timer.stop()

    ###################################################################################################################
    def updateGraphs(self, df_Pdw):
        print('Update Graphs')

    # print(df_Pdw.head())
    # Munny write here for Graphs updation

    def updateTrackTable(self, TrackData):
        print('Update Table')
        print(TrackData)
        # Munny Write here for Tbale updation
#######################################################################################################################

    def Clear(self):
        self.Text.clear()
Esempio n. 44
0
class Dialog(QWidget):
    width_changed = pyqtSignal()

    def __init__(self, ip):
        super(Dialog, self).__init__()
        self.ip = ip
        self.main_layout = QVBoxLayout()
        self.header_layout = QHBoxLayout()
        self.send_layout = QHBoxLayout()
        self.send_input = QTextEdit()
        self.send_input.setPlaceholderText(variables.PLACEHOLDER_TEXT)
        self.send_input.setFont(variables.font)
        self.send_input.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.send_input.textChanged.connect(self.message_resize)
        self.send_input.installEventFilter(self)
        self.send_btn = PicButton(QPixmap(variables.SEND_IDLE_IMG),
                                  QPixmap(variables.SEND_HOVER_IMG),
                                  QPixmap(variables.SEND_PRESS_IMG))
        self.back_btn = PicButton(QPixmap(variables.BACK_IDLE_IMG),
                                  QPixmap(variables.BACK_HOVER_IMG),
                                  QPixmap(variables.BACK_PRESS_IMG))
        self.ip_label = QLabel(ip)
        self.ip_label.setFont(variables.font)
        self.messages = QListView()
        delegate = MessageDelegate()
        self.messages.setItemDelegate(delegate)
        self.width_changed.connect(
            lambda: delegate.sizeHintChanged.emit(QModelIndex()))
        self.model = MessageModel(ip)
        self.messages.setModel(self.model)
        self.send_btn.released.connect(self.message_to)
        self.back_btn.released.connect(self.return_to_menu)
        self.header_layout.addWidget(self.back_btn, 0,
                                     Qt.AlignVCenter | Qt.AlignLeft)
        self.header_layout.addWidget(self.ip_label, 0,
                                     Qt.AlignVCenter | Qt.AlignLeft)
        self.header_layout.addStretch()
        self.main_layout.addLayout(self.header_layout)
        self.main_layout.addWidget(self.messages)
        self.send_layout.addWidget(self.send_input)
        self.send_layout.addWidget(self.send_btn, 0, Qt.AlignBottom)
        self.main_layout.addLayout(self.send_layout)
        self.setLayout(self.main_layout)
        self.message_resize()

    def return_to_menu(self):
        variables.signals.close_dialog.emit()

    def message_to(self):
        msg = self.send_input.toPlainText()
        if not msg:
            return
        id = self.model.add_message(msg, variables.USER_ME)
        variables.nw.send_message(id, msg, self.ip)
        variables.signals.message_sent.emit(msg, self.ip)
        self.messages.scrollToBottom()
        self.send_input.clear()
        self.send_input.setFocus()

    def message_from(self, msg):
        self.model.add_message(msg, variables.USER_THEM)

    def undelivered_status(self, id):
        self.model.setUndelivered(id)

    def delivered_status(self, id):
        self.model.setUnread(id)

    def read_status(self, id):
        self.model.setRead(id)

    def message_resize(self):
        height = self.send_input.document().documentLayout().documentSize(
        ).height()
        fm = QFontMetrics(variables.font)
        space = self.send_input.document().documentMargin()
        rowNum = int(
            (height - (2 * self.send_input.document().documentMargin())) /
            fm.lineSpacing())
        if rowNum == 0:
            rowNum = 1
        if rowNum > variables.MAX_ROWS:
            rowNum = variables.MAX_ROWS
        margins = self.send_input.contentsMargins()
        height = fm.lineSpacing() * rowNum + (
            self.send_input.document().documentMargin() + self.send_input.
            frameWidth()) * 2 + margins.top() + margins.bottom()
        self.send_input.setFixedHeight(int(height))

    def eventFilter(self, widget, event):
        if event.type() == QEvent.KeyPress:
            keyEvent = QKeyEvent(event)
            if (not (keyEvent.modifiers() & Qt.ShiftModifier)) and (
                (keyEvent.key() == Qt.Key_Enter) or
                (keyEvent.key() == Qt.Key_Return)):
                self.message_to()
                return True
        return QWidget.eventFilter(self, widget, event)
Esempio n. 45
0
class ChatWidget(QWidget):

    def __init__(self, tab):
        QWidget.__init__(self, tab)

        self._tab = tab

        self.chat_browser = QTextBrowser()
        self.chat_browser.setOpenExternalLinks(True)

        self.chat_input = QTextEdit()
        self.chat_input.installEventFilter(self)
        self.chat_input.textChanged.connect(self.send_typing_message)
        self.typing_stamp = -1

        self.send_button = QPushButton('Send')
        self.send_button.clicked.connect(self.send_message)

        self.invite_button = QPushButton('Invite')
        self.invite_button.clicked.connect(self.goto_invite)

        font_metrics = QFontMetrics(self.chat_input.font())
        self.chat_input.setMinimumHeight(font_metrics.lineSpacing() * 3)
        self.send_button.setFixedHeight(font_metrics.lineSpacing() * 2)
        self.invite_button.setFixedHeight(font_metrics.lineSpacing() * 2)

        hbox = QHBoxLayout()
        hbox.addWidget(self.chat_input)
        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(self.send_button)
        vbox.addStretch(1)
        vbox.addWidget(self.invite_button)
        vbox.addStretch(1)
        hbox.addLayout(vbox)

        input_wrapper = QWidget()
        input_wrapper.setLayout(hbox)
        input_wrapper.setMinimumHeight(font_metrics.lineSpacing() * 3.7)

        splitter = QSplitter(Qt.Vertical)
        splitter.addWidget(self.chat_browser)
        splitter.addWidget(input_wrapper)
        splitter.setSizes([int(self.parent().height()), 1])

        hbox = QHBoxLayout()
        hbox.addWidget(splitter)
        self.setLayout(hbox)

    def send_typing_message(self):
        is_typing = bool(self.chat_input.toPlainText())
        timer = time.time() - self.typing_stamp

        if is_typing:
            if not self.typing_stamp:
                # Exceeded timer, don't notify
                return
            if self.typing_stamp == -1:
                # Started typing
                self.typing_stamp = time.time()
            elif timer > constants.TYPING_TIMEOUT:
                # Done notifying
                self.typing_stamp = 0
            else:
                # Still typing
                return
        else:
            # Not typing
            self.typing_stamp = -1

        if self._tab._zone:
            conn.synchronous_send(
                command = constants.CMD_MSG_TYPING,
                recipient = self._tab._zone.id,
                timestamp = self.typing_stamp)
        else:
            # Can't send message without zone
            pass

    def send_message(self, ts = None):
        msg = self.chat_input.toPlainText()

        if msg and self._tab._zone:
            conn.synchronous_send(
                command = constants.CMD_MSG,
                recipient = self._tab._zone.id,
                data = msg,
                timestamp = ts or None)
        else:
            # There's no zone, so these messages don't actually go anywhere,
            # but they do get added to the chat log.
            self._tab.add_message(time.time(), conn.name, msg)

        self.chat_input.clear()

    def delete_message(self, ts):
        if self._tab._zone:
            conn.synchronous_send(
                command = constants.CMD_MSG_DEL,
                recipient = self._tab._zone.id,
                timestamp = ts)
        else:
            # Can't delete message without zone
            pass

    def goto_invite(self):
        self._tab.input_widget.text = ''
        self._tab.widget_stack.setCurrentIndex(0)

    def update_chat(self):
        full_log = ''

        for (ts, sender), message in sorted(self._tab._chat_log.items()):
            if sender == 'server':
                color = '#000000'
            elif sender == conn.name:
                color = '#0000CC'
            else:
                color = '#CC0000'

            full_log += (
                '<body style="white-space: pre">'
                '<font color="{0}">'
                '({1}) '
                '<strong>{2}</strong>: '
                '</font>'
                '{3}</body>').format(
                    color,
                    time.strftime('%H:%M:%S', time.localtime(ts)),
                    sender,
                    message)

        scrollbar = self.chat_browser.verticalScrollBar()

        if scrollbar.value() != scrollbar.maximum() \
           and sender != conn.name:
            should_scroll = False
        else:
            should_scroll = True

        self.chat_browser.setText(full_log)

        if should_scroll:
            scrollbar.setValue(scrollbar.maximum())
Esempio n. 46
0
class WMain(QMainWindow, TgWai):
    def __init__(self):
        super().__init__()
        self.wn_init()

    def wn_init(self):
        JC_LOG.info(self.tm_wai('Initializing ...'))

        self.wv_i_nop = 0

        self.setWindowTitle(GC_APP_NM)
        self.resize(460, 145)

        self.wu_cw = QWidget()
        self.wu_lo = QGridLayout()
        self.wu_cw.setLayout(self.wu_lo)
        self.setCentralWidget(self.wu_cw)

        def nf2_new_le():
            fu2_le = QLineEdit()
            fu2_le.setMinimumWidth(700)
            fu2_le.setAlignment(Qt.AlignLeft)
            fu2_le.setReadOnly(True)
            return fu2_le

        def nf2_ui_add_input(x_row):
            fv2_row = x_row
            self.wu_lb_i_pn = QLabel('Input path')
            self.wu_le_i_pn = nf2_new_le()
            self.wu_le_i_pn.setText(
                QStandardPaths.writableLocation(
                    QStandardPaths.DesktopLocation))
            self.wu_pb_i_fn = QPushButton('…')
            self.wu_pb_i_fn.setMaximumWidth(25)
            self.wu_lb_i_bn = QLabel('Input base name')
            self.wu_le_i_bn = nf2_new_le()
            self.wu_lb_i_nfo = QLabel('Input file info')
            self.wu_le_i_nfo = nf2_new_le()
            self.wu_lo.addWidget(self.wu_lb_i_pn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_i_pn, fv2_row, 1, 1, 3)
            self.wu_lo.addWidget(self.wu_pb_i_fn, fv2_row, 4, 2, 1)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_i_bn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_i_bn, fv2_row, 1, 1, 3)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_i_nfo, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_i_nfo, fv2_row, 1, 1, -1)
            return fv2_row

        def nf2_ui_add_hor_ln(x_row):
            fv2_row = x_row
            fu2_fm = QFrame()
            fu2_fm.setGeometry(QRect(1, 1, 1, 1))
            fu2_fm.setFrameShape(QFrame.HLine)
            fu2_fm.setFrameShadow(QFrame.Sunken)
            self.wu_lo.addWidget(fu2_fm, fv2_row, 0, 1, -1)
            return fv2_row

        def nf2_ui_add_output(x_row):
            fv2_row = x_row
            self.wu_lb_o_pn = QLabel('Output path')
            self.wu_le_o_pn = nf2_new_le()
            self.wu_le_o_pn.setText(
                gf_pj(
                    QStandardPaths.writableLocation(
                        QStandardPaths.DownloadLocation), 'TMPS'))
            self.wu_lo.addWidget(self.wu_lb_o_pn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_o_pn, fv2_row, 1, 1, -1)
            self.wu_lb_o_bn = QLabel('Output base name')
            self.wu_le_o_bn = nf2_new_le()
            self.wu_lb_o_nfo = QLabel('Output file info')
            self.wu_le_o_nfo = nf2_new_le()
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_o_bn, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_o_bn, fv2_row, 1, 1, -1)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_lb_o_nfo, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_le_o_nfo, fv2_row, 1, 1, -1)
            return fv2_row

        def nf2_ui_add_process(x_row):
            fv2_row = x_row
            self.wu_lb_process = QLabel('Process')
            self.wu_pgb = QProgressBar()
            self.wu_pgb.setMinimum(0)
            self.wu_pgb.setAlignment(Qt.AlignCenter)
            self.wu_pb_do = QPushButton('&Do')
            self.wu_pb_do.setMaximumWidth(80)
            self.wu_pb_do.setEnabled(False)
            self.wu_te_log = QTextEdit()
            self.wu_te_log.setFont(
                QFontDatabase.systemFont(QFontDatabase.FixedFont))
            self.wu_te_log.setReadOnly(True)
            self.wu_te_log.setWordWrapMode(QTextOption.NoWrap)
            self.wu_te_log.setMinimumHeight(250)
            self.wu_lo.addWidget(self.wu_lb_process, fv2_row, 0, 1, 1,
                                 Qt.AlignRight)
            self.wu_lo.addWidget(self.wu_pgb, fv2_row, 1, 1, 2)
            self.wu_lo.addWidget(self.wu_pb_do, fv2_row, 3, 1, -1,
                                 Qt.AlignCenter)
            fv2_row += 1
            self.wu_lo.addWidget(self.wu_te_log, fv2_row, 1, 1, -1)
            return fv2_row

        nv_row = 0
        nv_row = nf2_ui_add_input(nv_row) + 1
        nv_row = nf2_ui_add_hor_ln(nv_row) + 1
        nv_row = nf2_ui_add_output(nv_row) + 1
        nv_row = nf2_ui_add_hor_ln(nv_row) + 1
        nv_row = nf2_ui_add_process(nv_row) + 1

        self.wu_lo.setColumnStretch(1, 1)
        self.wu_pb_i_fn.clicked.connect(self.wn_pb_i_fn_clicked)
        self.wu_pb_do.clicked.connect(self.wn_pb_do_clicked)

        def pp2_move_center():
            pu2_cp = QDesktopWidget().availableGeometry().center()
            pu2_fg = self.frameGeometry()
            pu2_fg.moveCenter(pu2_cp)
            self.move(pu2_fg.topLeft())

        self.show()
        pp2_move_center()
        self.raise_()

    def wn_pb_i_fn_clicked(self):
        def np2_do():
            pu2_i_fn = QFileDialog.getOpenFileName(self, 'Select PDF file',
                                                   self.wu_le_i_pn.text(),
                                                   'PDF file (*.pdf)')[0]
            if not gf_if(pu2_i_fn): return
            self.wn_log_clear()
            self.wn_log_info(f'Requested file => {pu2_i_fn}')
            self.wn_log_info('Getting total pages of the requested file ...')
            self.wu_le_i_pn.setText(gf_pn(pu2_i_fn))
            self.wv_i_nop = self.wm_pdf_nop(pu2_i_fn)
            self.wu_le_i_bn.setText(gf_bn(pu2_i_fn))
            self.wn_log_info(
                f"Total pages of the requested file => {self.wv_i_nop:,d}")
            self.wu_le_i_nfo.setText(f'{self.wv_i_nop:,d} page(s)')
            self.wn_set_output_fn()

        try:
            np2_do()
        except:
            gp_log_exception(self.wn_log_error, 'Following error occurs !!!',
                             gf_exception_to_list(), 30)
            self.wn_log_error('Check your PDF file or this program logic !!!')

    def wn_set_output_fn(self):
        nu_o_nop = self.wv_i_nop
        self.wu_le_o_bn.setText(
            f'{ gf_jn ( self.wu_le_i_bn .text () ) }-(ReversePages)-{nu_o_nop:d}-page(s).pdf'
        )
        self.wu_le_o_nfo.setText(f'{nu_o_nop:,d} pages')
        self.wu_pb_do.setEnabled(True)

    def wn_pb_do_clicked(self):
        nu_st = datetime.now()
        nv_cancelled = False
        gp_log_header(self.wn_log_info, 'Start processing ...', 23)

        def np2_do():
            pu2_w_lst = [self.wu_pb_i_fn, self.wu_pb_do]

            def pp3_set_enabled(x3_bool):
                for bu4_w in pu2_w_lst:
                    bu4_w.setEnabled(x3_bool)

            try:
                pp3_set_enabled(False)
                bu3_o_fn = gf_pj(self.wu_le_o_pn.text(),
                                 self.wu_le_o_bn.text())
                self.wn_log_info(f'Output path => { gf_pn (bu3_o_fn) }')
                self.wn_log_info(
                    f'Base name to generate => { gf_bn (bu3_o_fn) }')
                if gf_if(bu3_o_fn):
                    self.wn_log_warn(
                        f'Oputput file is already exist in { gf_pn (bu3_o_fn) }'
                    )
                    bu4_overwrite = QMessageBox.question(
                        self, GC_APP_NM, 'Overwrite ?')
                    if bu4_overwrite == QMessageBox.No:
                        nonlocal nv_cancelled
                        nv_cancelled = True
                        return
                JC_LOG.info('Make output path if not exist ...')
                gp_mp(gf_pn(bu3_o_fn))
                bu3_i_nop = self.wv_i_nop
                JC_LOG.info(f'Initializing progress bar ...')
                self.wu_pgb.setMaximum(bu3_i_nop)
                self.wu_pgb.setValue(0)
                try:
                    self.wn_log_info('Opening input file ...')
                    bu4_i_doc = CjPdfDocument(
                        CjPdfReader(
                            gf_pj(self.wu_le_i_pn.text(),
                                  self.wu_le_i_bn.text())))
                    self.wn_log_info('Opening output file ...')
                    self.wn_log_info(
                        'Writing output file ( may take a long time ) ...')
                    bu4_o_doc = CjPdfDocument(CjPdfWriter(bu3_o_fn))
                    bv4_o_nop_so_far = 0
                    bu4_page_no_list = list(range(bu3_i_nop, 0, -1))
                    for bu5_i_pg_no in bu4_page_no_list:
                        bu5_i_pg = bu4_i_doc.getPage(bu5_i_pg_no)
                        bu5_i_pg_mb_sz = bu5_i_pg.getMediaBox()
                        bu5_i_pg_bb_sz = bu5_i_pg.getBleedBox()
                        bu5_i_pg_tb_sz = bu5_i_pg.getTrimBox()
                        bu5_i_pg_cb_sz = bu5_i_pg.getCropBox()
                        bu5_i_pg.setCropBox(bu5_i_pg_mb_sz)
                        bu5_o_pg_cp = bu5_i_pg.copyAsFormXObject(bu4_o_doc)
                        bu5_o_pg = bu4_o_doc.addNewPage(
                            CjPageSize(bu5_i_pg_mb_sz))
                        bu5_o_pg.setMediaBox(bu5_i_pg_mb_sz)
                        bu5_o_pg.setBleedBox(bu5_i_pg_bb_sz)
                        bu5_o_pg.setTrimBox(bu5_i_pg_tb_sz)
                        bu5_o_pg.setCropBox(bu5_i_pg_cb_sz)
                        CjPdfCanvas(bu5_o_pg).addXObject(bu5_o_pg_cp, 0, 0)
                        bv4_o_nop_so_far += 1
                        self.wu_pgb.setValue(bv4_o_nop_so_far)
                        GC_QAPP.processEvents()
                finally:
                    bu4_o_doc.close()
                    bu4_i_doc.close()
            finally:
                pp3_set_enabled(True)

        try:
            np2_do()
        except:
            gp_log_exception(self.wn_log_error, 'Following error occurs !!!',
                             gf_exception_to_list(), 30)
            self.wn_log_error('Check your PDF file or this program logic !!!')
        else:
            if nv_cancelled: self.wn_log_warn(f'Cancelled by user !!!')
            else:
                self.wn_log_info(
                    'Done processing => elapsed {} ...'.format(datetime.now() -
                                                               nu_st))

    def wm_pdf_nop(self, x_fn):  # (n)umber (o)f (p)ages
        mu_doc = CjPdfDocument(CjPdfReader(x_fn))
        mu_nop = mu_doc.getNumberOfPages()
        mu_doc.close()
        return mu_nop

    def wn_log_clear(self):
        self.wu_te_log.clear()

    def wn_log_info(self, x_msg):
        JC_LOG.info(x_msg)
        self.wu_te_log.append(
            f"<font color=black>[I] { self. wm_2_html (x_msg) }</font>")

    def wn_log_warn(self, x_msg):
        JC_LOG.warn(x_msg)
        self.wu_te_log.append(
            f"<font color=magenta>[W] { self. wm_2_html (x_msg) }</font>")

    def wn_log_error(self, x_msg):
        JC_LOG.error(x_msg)
        self.wu_te_log.append(
            f"<font color=red>[E] { self. wm_2_html (x_msg) }</font>")

    def wm_2_html(self, x_msg):
        nv_msg = re.sub(r'(?:\r\n|\r|\n)', '<br>', x_msg)
        return nv_msg.replace(' ', '&nbsp;')

    def __del__(self):
        self.wn_fini()

    def wn_fini(self):
        JC_LOG.info(self.tm_wai('Finalizing ...'))

    def closeEvent(self, x_ev):
        JC_LOG.info(self.tm_wai('Closing ...'))
        jp_request_exit(GC_EC_SUCCESS)
Esempio n. 47
0
class MacroPanel(QDialog):
    """The macro panel"""
    def __init__(self, parent, code_array):
        super().__init__()

        self.parent = parent
        self.code_array = code_array

        self._init_widgets()
        self._layout()

        self.update()

        self.default_text_color = self.result_viewer.textColor()
        self.error_text_color = QColor("red")

        self.button_box.clicked.connect(self.on_apply)

    def _init_widgets(self):
        """Inititialize widgets"""

        self.macro_editor = SpellTextEdit(self)

        self.result_viewer = QTextEdit(self)
        self.result_viewer.setReadOnly(True)

        self.splitter = QSplitter(Qt.Vertical, self)

        self.splitter.addWidget(self.macro_editor)
        self.splitter.addWidget(self.result_viewer)

        self.button_box = QDialogButtonBox(QDialogButtonBox.Apply)

    def _layout(self):
        """Layout dialog widgets"""

        layout = QVBoxLayout(self)
        layout.addWidget(self.splitter)
        layout.addWidget(self.button_box)

        self.setLayout(layout)

    def _is_invalid_code(self):
        """Preliminary code check

        Returns a string with the error message if code is not valid Python.
        If the code runs without errors, an empty string is retruned.

        """

        try:
            ast.parse(self.code_array.macros)

        except Exception as ex:
            # Grab the traceback and return it
            stringio = StringIO()
            excinfo = exc_info()
            # usr_tb will more than likely be none because ast throws
            # SytnaxErrors as occurring outside of the current execution frame
            usr_tb = get_user_codeframe(excinfo[2]) or None
            print_exception(excinfo[0], excinfo[1], usr_tb, None, stringio)
            return stringio.getvalue()
        else:
            return ''

    def on_apply(self):
        """Event handler for Apply button"""

        self.code_array.macros = self.macro_editor.toPlainText()

        err = self._is_invalid_code()
        if err:
            self.update_result_viewer(err=err)
        else:
            self.update_result_viewer(*self.code_array.execute_macros())

        self.parent.grid.gui_update()

    def update(self):
        """Update macro content"""

        self.macro_editor.setPlainText(self.code_array.macros)
        self.on_apply()

    def update_result_viewer(self, result="", err=""):
        """Update event result following execution by main window"""

        self.result_viewer.clear()

        if result:
            self.result_viewer.append(result)
        if err:
            self.result_viewer.setTextColor(self.error_text_color)
            self.result_viewer.append(err)
            self.result_viewer.setTextColor(self.default_text_color)
Esempio n. 48
0
class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.title = "Text2Speech"
        self.top = 10
        self.left = 10
        self.width = 1280
        self.height = 1080

        self.InitWindow()

    def InitWindow(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)

        #TTS System Status Bar
        self.fontstatus = QFont()
        self.fontstatus.setPointSize(12)
        self.fontstatus.setBold(True)

        self.statusBar().showMessage('-->Waiting for Input....')
        self.statusBar().setStyleSheet(
            "background-color: rgba(150, 0, 0, 0.2);")
        self.statusBar().setFont(self.fontstatus)

        #TTS System Heading
        self.font = QFont()
        self.font.setPointSize(32)
        self.font.setBold(True)
        self.font.setWeight(63)
        self.font.setStretch(100)

        self.TTS_label = QLabel(self)
        self.TTS_label.setText(
            "<font color=#00008b>TEXT TO SPEECH APPLICATION")
        self.TTS_label.setFont(self.font)
        self.TTS_label.move(0, 60)
        self.TTS_label.resize(1280, 60)
        self.TTS_label.setAlignment(Qt.AlignCenter)

        #TTS System Heading Description
        self.fontdes = QFont()
        self.fontdes.setPointSize(14)
        self.fontdes.setWeight(63)
        self.fontdes.setStretch(80)

        self.TTS_label = QLabel(self)
        self.TTS_label.setText(
            "<font color=#7b68ee>[A tiny app that allows you to convert text input to voice output]"
        )
        self.TTS_label.setFont(self.fontdes)
        self.TTS_label.move(0, 102)
        self.TTS_label.resize(1280, 40)
        self.TTS_label.setAlignment(Qt.AlignCenter)

        #TTS System speak now label
        self.font1 = QFont()
        self.font1.setPointSize(18)
        self.font1.setBold(True)
        self.font1.setWeight(50)

        self.Sub_label = QLabel(self)
        self.Sub_label.setText("<font color=#8a2be2>Text Input.")
        self.Sub_label.setFont(self.font1)
        self.Sub_label.move(0, 125)
        self.Sub_label.resize(1280, 150)
        self.Sub_label.setAlignment(Qt.AlignCenter)

        #Textedit Box to get Input
        self.fontbox = QFont()
        self.fontbox.setPointSize(14)

        self.text_edit = QTextEdit('This is a Text to Speech System.', self)
        self.text_edit.setFont(self.fontbox)
        self.text_edit.move(45, 218)
        self.text_edit.resize(1190, 250)

        #Font attributes for buttons
        self.butfont = QFont()
        self.butfont.setPointSize(12)
        self.butfont.setBold(True)

        #SpeakButton to get Voice Ouput
        self.button = QPushButton(self)
        self.button.setText("Speak Now")
        self.button.move(540, 492)
        self.button.setStyleSheet("background-color:#0000ff; color:#ffffe0;")
        self.button.setFont(self.butfont)
        self.button.clicked.connect(self.on_click)

        #OpenButton to get txt file
        self.Open_Button = QPushButton(self)
        self.Open_Button.setText("Open File")
        self.Open_Button.move(660, 492)
        self.Open_Button.setStyleSheet(
            "background-color:#dc143c; color:#faf0e6;")
        self.Open_Button.setFont(self.butfont)
        self.Open_Button.clicked.connect(self.on_opclick)

        self.showMaximized()

        #SpeakButton OnClick Action to get text to speech voice
    def on_click(self):
        #TTS System Status Bar : Text to Speech Conversion
        self.statusBar().showMessage('-->Converting Text To Speech....')
        self.statusBar().setFont(self.fontstatus)

        data = self.text_edit.toPlainText(
        )  #returns the text from the text_edit box as plain text

        #To call and access the function of load module
        p = load.TextToSpeech()
        p.get_pronunciation(data)

        #OpenButton Onclick Action to display OpenFileDialog Box
    def on_opclick(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(
            self,
            "Open a File",
            "",
            "Text Files (*.txt);;Python Files (*.py)",
            options=options)
        if fileName:
            #TTS System Status Bar : Opening a File
            self.statusBar().showMessage('-->Opened a File : ' + fileName)
            self.statusBar().setFont(self.fontstatus)

            #To Open and Read the Content of a File
            file = fileName  #store file path with file name in file variable
            f = open(file, 'r+')  #Opens the file in read only mode
            text = f.read()  #reads the content of file
            self.text_edit.clear()  #clears the textedit box area
            self.text_edit.setText(
                text)  #display the content of file in textedit box
Esempio n. 49
0
class SpellCheckApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        self.initUI()

    def initUI(self):
        self.setWindowTitle('맞춤법 검사기')
        self.resize(600, 300)
        self.setWindowIcon(QIcon('pencil.png'))

        self.setStyleSheet(
            'QPushButton{border-radius: 5px; border: 1px solid #ccc;'
            'padding: 5px; background-color:white; color: #555;}'
            'QPushButton:pressed{background-color:#ccc;}'
            'QPushButton:flat{background-color:#03cf5d; color:white; font-weight:bold;}'
            'QTextEdit{padding:5px; border-radius:5px; border: 1px solid #ccc;'
            'background-color:white; color: #555;}'
            'QProgressBar{border: 1px solid #ccc; padding: 2px;'
            'border-radius: 5px; text-align:center; font-weight:bold;'
            'background-color:white; color:#333;}'
            'QProgressBar::chunk{background-color:#03CF5D;'
            'border-radius:5px;}')

        grid = QGridLayout()

        self.check = QPushButton('검사', self)
        self.check.clicked.connect(self._check_)
        self.clear = QPushButton('초기화', self)
        self.clear.clicked.connect(self.clear_all)
        self.load = QPushButton('불러오기', self)
        self.load.clicked.connect(self.open_file)
        self.save = QPushButton('저장', self)
        self.save.clicked.connect(self.save_file)
        self.top = QPushButton('항상 위', self)
        self.top.clicked.connect(self.allways_top)
        self.origin = QTextEdit()
        self.origin.setAcceptRichText(False)
        self.origin.setPlaceholderText('검사할 내용을 작성하거나 텍스트 파일을 불러오세요.')
        self.checked = QTextBrowser()
        self.copy = QPushButton('복사', self)
        self.copy.clicked.connect(self._copy_)
        self.checked.setToolTip('<b><p style="color:red">맞춤법</p>'
                                '<p style="color:#B22AF8">표준어 의심</p>'
                                '<p style="color:#03CF5D">띄어쓰기</p>'
                                '<p style="color:blue">통계적 교정</p></b>')
        self.checked.setAcceptRichText(True)
        self.checked.setReadOnly(True)
        self.pb = QProgressBar()

        grid.addWidget(self.load, 0, 0)
        grid.addWidget(self.check, 0, 1)
        grid.addWidget(self.clear, 0, 2)
        grid.addWidget(self.save, 0, 3)
        grid.addWidget(self.copy, 0, 4)
        grid.addWidget(self.top, 0, 5)

        grid.addWidget(self.origin, 1, 0, 1, 3)
        grid.addWidget(self.checked, 1, 3, 1, 3)
        grid.addWidget(self.pb, 2, 0, 1, 6)

        self.setLayout(grid)

        self.show()

    def open_file(self):
        file_name = QFileDialog.getOpenFileName(
            self, 'Open', '', 'Text Files(*.txt);; All Files(*)', '')
        if file_name[0]:
            self.clear_all()
            with open(file_name[0], 'r', encoding='utf8') as f:
                lines = f.readlines()
                for line in lines:
                    self.origin.append(line)

    def clear_all(self):
        self.origin.clear()
        self.checked.clear()

    def _check_(self):
        txt = self.origin.toPlainText()
        self.checked.clear()

        self.pb.setMaximum(len(txt))

        self.get_thread = SpellCheckThread(txt)
        self.get_thread.progress.connect(self.get_progress_value)
        self.get_thread.add.connect(self.add)
        self.get_thread.start()
        self.checked.setEnabled(False)

    def save_file(self):
        file_name = QFileDialog.getSaveFileName(
            self, 'Save', '', 'Text File(*.txt);; All File(*)', '')
        if file_name[0]:
            with open(file_name[0], 'w', encoding='utf8') as f:
                lines = self.checked.toPlainText()
                f.writelines(lines)
                QMessageBox.about(self, 'Saved', file_name[0] + '에 저장했습니다.')

    def allways_top(self):
        if self.top.isFlat():
            self.top.setFlat(False)
            self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
        else:
            self.top.setFlat(True)
            self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
        self.show()

    def _copy_(self):
        self.checked.selectAll()
        self.checked.copy()

    @pyqtSlot(str)
    def add(self, txt):
        self.checked.insertHtml(txt)

    @pyqtSlot(int)
    def get_progress_value(self, val):
        self.pb.setValue(val)
        if val == self.pb.maximum():
            self.checked.setEnabled(True)
Esempio n. 50
0
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
Esempio n. 51
0
class mainWindow(QTabWidget):

    sendMessage = pyqtSignal(list, name='sendMessage')
    selectFriend = pyqtSignal(list, name='selectFriend')
    selectAutoGroup = pyqtSignal(list, name='selectAutoGroup')
    imgHeadRequest = pyqtSignal(str, name='imgHeadRequest')
    friendAutoReply = pyqtSignal(int, name='friendAutoReply')  # 朋友自动回复

    chatroom_num = 0  # 群个数
    selectGroupAutoReply = []  # 自动回复的群
    '''
    通讯录信息
    | NickName ,Sex,Province,City,signature,FromUserName|
    '''
    AllFriendsInfo = {}

    def __init__(self):
        super().__init__()

        self.focusID = 0
        self.setStyle('qrc/black.qss')
        self.createActions()
        self.createTrayIcon()
        self.init()

    def setStyle(self, _qssPath):
        with open(_qssPath, encoding='UTF-8') as file:
            str = file.read()
            qss = ''.join(str)
            self.setStyleSheet(qss)

    def init(self):
        self.tabChat = QWidget()
        self.tabContact = QWidget()
        self.tabSet = QWidget()

        self.addTab(self.tabChat, '微信')
        self.addTab(self.tabContact, '通讯录')
        self.addTab(self.tabSet, '设置')

        self.tabChatInit()
        self.setInit()
        self.contactInit()
        # self.leftLayout = QVBoxLayout()
        # self.rightLayout = QVBoxLayout()
        # mainLayout = QGridLayout()
        #
        # self.contact = QListWidget()
        # self.leftLayout.addWidget(self.contact)
        #
        # self.chatroom = QLineEdit()
        # self.chatroom.setText('This is ChatRoom')
        # self.chatlog = QLabel()
        # self.chatlog.setText('This is ChatLog')
        #
        # self.rightLayout.addWidget(self.chatlog)
        # self.rightLayout.addWidget(self.chatroom)
        #
        # mainLayout.addLayout(self.leftLayout, 0, 0, 1, 1)
        # mainLayout.addLayout(self.rightLayout, 0, 1, 1, 3)
        #
        # self.setLayout(mainLayout)
        self.setWindowTitle(self.tr('Wechat_alpha'))

    def addChatFriend(self, _NickName, _RemarkName):

        item = QListWidgetItem()
        str = _NickName
        if _RemarkName is not '':
            str += '[' + _RemarkName + ']'

        item.setText(str)

        self.listChatting.addItem(item)

    # 通讯录写入名单
    def fillContact(self, _fullContact):

        # self.AllFriendsInfo = _fullContact
        for each in _fullContact:
            item = QListWidgetItem()
            str = each['RemarkName']
            if str is '':
                str = each['NickName']
            item.setText(str)
            self.contactList.addItem(item)
            # | NickName, Sex, Province, City, signature, FromUserName |
            self.AllFriendsInfo[str] = [
                each['NickName'], each['Sex'], each['Province'], each['City'],
                each['Signature'], each['UserName']
            ]

    # 群自动回复----获得群名
    def setChatroomFill(self, _chatroom):

        self.chatroom_num = 0
        for each in _chatroom:
            self.chatroom_num += 1
            #self.chatroomInfo[each['NickName']] = each['UserName']
            item = QListWidgetItem()
            str = each['NickName']
            item.setText(str)
            self.allGroupList.addItem(item)
        #print(self.chatroomInfo)

    def contactInit(self):

        size = self.size()

        self.contactList = QListWidget()
        self.contactList.setFixedSize(size.width() / 3, size.height())
        self.contactList.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.contactList.itemClicked.connect(self.contactListClick)

        infoWidget = QWidget()
        infoWidget.setFixedSize(size.width() * 2 / 3, size.height())

        topLayout = QGridLayout()
        midLayout = QVBoxLayout()
        bottomLayout = QHBoxLayout()

        # top
        self.headLabel = QLabel()  # 头像
        self.headLabel.setFixedSize(150, 150)
        self.headLabel.setScaledContents(True)

        self.signatureLabel = QLabel()  # 签名
        self.signatureLabel.setAlignment(QtCore.Qt.AlignVCenter)
        self.nickNameLabel = QLabel()  # 微信名
        self.nickNameLabel.setAlignment(QtCore.Qt.AlignVCenter)

        topLayout.addWidget(self.nickNameLabel, 1, 0, 1, 3)
        topLayout.addWidget(self.signatureLabel, 2, 0, 1, 3)
        topLayout.addWidget(self.headLabel, 0, 1, 1, 1)

        # mid
        self.remarkNameLabel = QLabel()  # 备注
        self.cityLabel = QLabel()  # 城市

        midLayout.addWidget(self.remarkNameLabel)
        midLayout.addWidget(self.cityLabel)

        # bottom
        self.sendMsgBtn = QPushButton('发消息')

        bottomLayout.addWidget(self.sendMsgBtn)

        layout = QGridLayout()

        infoLayout = QVBoxLayout()
        infoLayout.addLayout(topLayout)
        infoLayout.addLayout(midLayout)
        infoLayout.addLayout(bottomLayout)
        infoLayout.addSpacing(10)

        infoWidget.setLayout(infoLayout)
        layout.addWidget(self.contactList, 0, 0, 1, 1)
        layout.addWidget(infoWidget, 0, 1, 1, 2)

        self.tabContact.setLayout(layout)

    def setInit(self):

        setTab = QTabWidget(self.tabSet)
        setTab.setTabPosition(QTabWidget.West)  # 方向

        size = self.size()

        #############################自动回复################################
        btnAutoSet = QPushButton('应用')
        btnAutoCancel = QPushButton('取消')
        btnAutoCancel.clicked.connect(self.clearSelectList)
        btnAutoSet.clicked.connect(self.setSelectList)

        btnLayout = QHBoxLayout()
        btnLayout.addWidget(btnAutoSet)
        btnLayout.addSpacing(5)
        btnLayout.addWidget(btnAutoCancel)

        self.allGroupList = QListWidget()
        self.selectGroupList = QListWidget()  # 选定自动回复的

        self.allGroupList.setFixedSize(size.width() * 3 / 7,
                                       size.height() * 2 / 3)
        self.selectGroupList.setFixedSize(size.width() * 3 / 7,
                                          size.height() * 2 / 3)

        self.allGroupList.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.selectGroupList.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)

        self.allGroupList.itemDoubleClicked.connect(self.aGroupDoubleClick)
        self.selectGroupList.itemDoubleClicked.connect(self.sGroupDoubleClick)

        self.setAutoLayout = QGridLayout()
        self.autoReplyFriend = QCheckBox('自动回复')
        self.autoReplyFriend.stateChanged.connect(self.setFriendAutoReply)

        self.setAutoLayout.setSpacing(10)

        self.setAutoLayout.addWidget(self.autoReplyFriend, 0, 0, 1, 1)
        self.setAutoLayout.addWidget(self.allGroupList, 1, 0, 10, 1)
        self.setAutoLayout.addWidget(self.selectGroupList, 1, 1, 10, 1)
        self.setAutoLayout.addLayout(btnLayout, 12, 1, 1, 1)

        # for each in self.ChatroomCheckBoxList:
        #     self.setAutoLayout.addWidget(each)
        tabAuto = QWidget()
        tabAuto.setLayout(self.setAutoLayout)
        #####################################################################
        # 其他
        self.showLabel = QLabel()
        self.showLabel.setScaledContents(True)
        self.showLabel.setFixedSize(size.width() * 2 / 3, size.width() * 2 / 3)
        sexDisttibutionBtn = QPushButton('性别分布')
        wordCouldBtn = QPushButton('签名词图')

        sexDisttibutionBtn.clicked.connect(self.calSex)
        wordCouldBtn.clicked.connect(self.generateWordCloud)

        layout = QGridLayout()

        layout.addWidget(self.showLabel, 0, 0, 2, 2)
        layout.addWidget(sexDisttibutionBtn, 2, 0, 1, 1)
        layout.addWidget(wordCouldBtn, 2, 1, 1, 1)
        tabFun = QWidget()
        tabFun.setLayout(layout)
        #####################################################################
        setTab.addTab(tabAuto, '自动回复')
        setTab.addTab(tabFun, '特色功能')
        # setTab.addTab('其他')

    def tabChatInit(self):

        size = self.size()

        layout = QGridLayout()
        self.listChatting = QListWidget()
        self.listChatting.setFixedSize(size.width() / 3, size.height())

        self.chatLog = QTextBrowser()
        self.chatLog.document().setMaximumBlockCount(1000)  # 限制1000行
        self.chatLog.setFixedSize(size.width() * 2 / 3, size.height() * 2 / 3)

        self.textInput = QTextEdit()
        self.textInput.setFixedSize(size.width() * 2 / 3, size.height() / 4)

        self.btnSend = QPushButton()
        self.btnSend.setText('发送')

        # 显示正在聊天的朋友
        self.chattingFri = QLabel('当前聊天朋友:_____')

        self.btnSend.clicked.connect(self.sendMsg)
        self.listChatting.itemClicked.connect(self.listClick)

        self.chatLog.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.chatLog.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

        layout.addWidget(self.listChatting, 0, 0, 6, 1)
        layout.addWidget(self.chatLog, 0, 1, 3, 3)
        layout.addWidget(self.textInput, 3, 1, 2, 3)
        layout.addWidget(self.chattingFri, 5, 1, 1, 1)
        layout.addWidget(self.btnSend, 5, 3, 1, 1)

        self.tabChat.setLayout(layout)

    def showChatLog(self, _Msg):

        # count = -1
        #         # for count, line in enumerate(open(thefilepath, 'rU')):
        #         #     pass
        #         # count += 1
        msg_time = time.strftime("%Y-%m-%d %H:%M:%S",
                                 time.localtime(_Msg['time']))
        content = _Msg['content']

        if _Msg['fromusr'] == _Msg['selfusr']:
            self.chatLog.append(msg_time + '\n' + '我' + ':' + content + '\n')
        else:
            fromFriend = _Msg['remarkname']
            self.chatLog.append(msg_time + '\n' + fromFriend + ':' + content +
                                '\n')

    def showSendChatLog(self, _Msg):
        msg_time = time.strftime("%Y-%m-%d %H:%M:%S",
                                 time.localtime(int(time.time())))
        content = _Msg[0]
        self.chatLog.append(msg_time + '\n' + '我' + ':' + content + '\n')

    @pyqtSlot()
    def sendMsg(self):

        sMsg = self.textInput.toPlainText()
        if sMsg != '':
            self.textInput.clear()
            self.sendMessage.emit([sMsg])

    @pyqtSlot(QListWidgetItem)
    def listClick(self, item):
        self.selectFriend.emit([item.text()])

    @pyqtSlot(QListWidgetItem)
    def contactListClick(self, item):
        global curTmpImg
        # | NickName, Sex, Province, City, signature, FromUserName |
        cur = self.AllFriendsInfo[item.text()]
        self.imgHeadRequest.emit(cur[5])

        if curTmpImg:
            png = QtGui.QPixmap()
            png.loadFromData(curTmpImg)
            #png.scaled((50,50))
            self.headLabel.setPixmap(png)
            curTmpImg = None

        self.signatureLabel.setText('签名      ' + ''.join(cur[4]))  # 签名
        str = ''.join(cur[0])
        if cur[1] == 1:
            str += ' ♂'
        else:
            str += '  ♀'
        self.nickNameLabel.setText('微信      ' + str)  # 微信名
        self.remarkNameLabel.setText('备注        ' + item.text())  # 备注
        self.cityLabel.setText('地区      ' +
                               ''.join(cur[2] + ' ' + cur[3]))  # 城市

    # add to select list
    @pyqtSlot(QListWidgetItem)
    def aGroupDoubleClick(self, item):
        select = item.text()
        item = QListWidgetItem()
        item.setText(select)
        self.selectGroupList.addItem(item)
        self.selectGroupAutoReply.append(select)

    # remove select item from list
    @pyqtSlot(QListWidgetItem)
    def sGroupDoubleClick(self, item):

        select = item.text()
        self.selectGroupList.removeItemWidget(
            self.selectGroupList.takeItem(self.selectGroupList.row(item)))
        self.selectGroupAutoReply.remove(select)

    @pyqtSlot(int)
    def setFriendAutoReply(self, _state):
        self.friendAutoReply.emit(_state)

    # 清空选定
    def clearSelectList(self):
        self.selectGroupList.clear()
        self.selectGroupAutoReply.clear()

    # 应用群自动回复
    def setSelectList(self):
        self.selectAutoGroup.emit(self.selectGroupAutoReply)

    # 获取头像
    def postUserHead(self, _img):
        global curTmpImg
        curTmpImg = _img
        #print(_img)

    # 更改当前聊天朋友名字显示
    def changeChattingFri(self, _str):
        self.chattingFri.setText('当前发送:' + _str[0])

    #  计算性别
    def calSex(self):

        # 设置全局字体
        plt.rcParams['font.sans-serif'] = ['SimHei']
        # 解决‘-’表现为方块的问题
        plt.rcParams['axes.unicode_minus'] = False

        female = 0
        total = len(self.AllFriendsInfo)
        for each in self.AllFriendsInfo.values():

            if each[1] is 2:
                female += 1
        male = total - female

        data = {'男性(人)': (male, '#7199cf'), '女性(人)': (female, '#ffff10')}

        # 设置绘图对象的大小
        fig = plt.figure(figsize=(8, 8))

        sex = data.keys()
        values = [x[0] for x in data.values()]
        colors = [x[1] for x in data.values()]

        ax1 = fig.add_subplot(111)
        ax1.set_title('性别比例')

        labels = [
            '{}:{}'.format(city, value) for city, value in zip(sex, values)
        ]

        # 设置饼图的凸出显示
        explode = [0, 0.1]

        # 画饼状图, 并且指定标签和对应的颜色
        # 指定阴影效果
        ax1.pie(values,
                labels=labels,
                colors=colors,
                explode=explode,
                shadow=True)

        pngPath = 'cache/_sd/sd.jpg'
        plt.savefig(pngPath)
        # plt.show()
        if os.path.exists(pngPath):
            png = QtGui.QPixmap(pngPath)
            self.showLabel.setPixmap(png)

    # 生成词云
    def generateWordCloud(self):

        signature = [each[4] for each in self.AllFriendsInfo.values()]

        text = ','.join(signature)
        pattern = re.compile('<span.*?</span>')  # 匹配表情
        text = re.sub(repl='', string=text, pattern=pattern)  # 删除表情

        coloring = np.array(Image.open("qrc/back.jpg"))
        my_wordcloud = wordcloud.WordCloud(
            background_color="white",
            max_words=2000,
            mask=coloring,
            max_font_size=60,
            random_state=42,
            scale=2,
            font_path="qrc/FZSTK.ttf"
        ).generate(
            text
        )  # 生成词云。font_path="C:\Windows\Fonts\msyhl.ttc"指定字体,有些字不能解析中文,这种情况下会出现乱码。

        file_name_p = 'cache/word/wc.jpg'
        my_wordcloud.to_file(file_name_p)  # 保存图片

        if os.path.exists(file_name_p):
            png = QtGui.QPixmap(file_name_p)
            self.showLabel.setPixmap(png)

    def createTrayIcon(self):
        '''
        创建托盘图标,可以让程序最小化到windows托盘中运行
        :return:
        '''
        self.trayIconMenu = QMenu(self)
        self.trayIconMenu.addAction(self.restoreAction)
        self.trayIconMenu.addSeparator()
        self.trayIconMenu.addAction(self.quitAction)
        self.trayIcon = QSystemTrayIcon(self)
        self.trayIcon.setContextMenu(self.trayIconMenu)
        self.trayIcon.setIcon(QIcon('qrc/icon.png'))
        self.setWindowIcon(QIcon('qrc/icon.png'))
        self.trayIcon.show()

    def createActions(self):
        '''
        为托盘图标添加功能
        :return:
        '''
        self.restoreAction = QAction("来喽", self, triggered=self.showNormal)
        self.quitAction = QAction("告辞",
                                  self,
                                  triggered=QApplication.instance().quit)

    def iconActivated(self, reason):
        '''
        激活托盘功能
        :param reason:
        :return:
        '''
        if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.DoubleClick):
            self.showNormal()

    # 弹窗提醒
    def msgWarning(self, _message, _type):

        if _type == 0:
            QMessageBox.information(self, "红包提醒", _message, QMessageBox.Yes)
        else:
            QMessageBox.information(self, "撤回提醒", _message, QMessageBox.Yes)
Esempio n. 52
0
class MainWindow(QMainWindow):
    """Главное окно программы. Управляет интерфейсом и событиями."""
    def __init__(self, core):
        """Инициализация главного окна.

        core - ядро программы, содержащее логику."""
        super().__init__()
        self.core = core
        self.core.logged.connect(self.onLogged)
        self.initUI()
        self.command()

    def initUI(self):
        """Инициализировать графический интерфейс."""
        self.textEdit = QTextEdit()

        self.actionFileStart = QAction('&Start', self)
        self.actionFileStart.triggered.connect(self.onActionFileStartTriggered)
        self.actionFileStop = QAction('&Stop', self)
        self.actionFileStop.triggered.connect(self.onActionFileStopTriggered)
        self.actionFileStop.setDisabled(True)

        actionFileSave = QAction('&Save config', self)
        actionFileSave.triggered.connect(self.core.save)
        actionFileDraw = QAction('&Save chart', self)
        actionFileDraw.triggered.connect(self.core.draw)

        actionFileLogClear = QAction('&Clear', self)
        actionFileLogClear.triggered.connect(self.textEdit.clear)

        actionFileExit = QAction('&Exit', self)
        actionFileExit.triggered.connect(self.close)

        self.actionViewInfo = QAction('&Extended', self)
        self.actionViewInfo.setCheckable(True)
        self.actionViewInfo.setChecked(True)
        self.actionViewInfo.changed.connect(self.changeRow)

        actionConfigPeriod = QAction('&Period...', self)
        actionConfigPeriod.triggered.connect(self.actionConfigPeriodTriggered)

        actionConfigSensorsAdd = QAction('&Add...', self)
        actionConfigSensorsAdd.triggered.connect(
            self.actionConfigSensorsAddTriggered)

        actionConfigSensorsDel = QAction('&Delete...', self)
        actionConfigSensorsDel.triggered.connect(
            self.actionConfigSensorsDelTriggered)

        actionConfigPathAddresses = QAction('&Adressess...', self)
        actionConfigPathAddresses.triggered.connect(
            self.actionConfigPathAddressesTriggered)

        actionConfigPathSensors = QAction('&Sensors...', self)
        actionConfigPathSensors.triggered.connect(
            self.actionConfigPathSensorsTriggered)

        actionConfigPathData = QAction('&Data...', self)
        actionConfigPathData.triggered.connect(
            self.actionConfigPathDataTriggered)

        actionHelpHelp = QAction('&Help...', self)
        actionHelpHelp.triggered.connect(self.actionHelpHelpTriggered)
        actionHelpAbout = QAction('&About...', self)
        actionHelpAbout.triggered.connect(self.onAbout)

        menuFile = self.menuBar().addMenu('&File')
        menuFile.addAction(self.actionFileStart)
        menuFile.addAction(self.actionFileStop)
        menuFile.addSeparator()

        menuFileOpen = menuFile.addMenu('&Open')
        menuFileSave = menuFile.addMenu('&Save')
        menuFileSave.addAction(actionFileSave)
        menuFileSave.addAction(actionFileDraw)
        menuFile.addSeparator()

        menuFile.addAction(actionFileLogClear)
        menuFile.addSeparator()
        menuFile.addAction(actionFileExit)

        menuView = self.menuBar().addMenu('&View')
        menuView.addAction(self.actionViewInfo)

        menuConfig = self.menuBar().addMenu('&Settings')
        menuConfig.addAction(actionConfigPeriod)
        menuConfigSensors = menuConfig.addMenu('&Sensors')
        menuConfigSensors.addAction(actionConfigSensorsAdd)
        menuConfigSensors.addAction(actionConfigSensorsDel)
        menuConfigPath = menuConfig.addMenu('&Path')
        menuConfigPath.addAction(actionConfigPathAddresses)
        menuConfigPath.addAction(actionConfigPathSensors)
        menuConfigPath.addAction(actionConfigPathData)

        menuHelp = self.menuBar().addMenu('&Help')
        menuHelp.addAction(actionHelpHelp)
        menuHelp.addAction(actionHelpAbout)

        self.textEditList = deque(maxlen=100)
        self.textEdit.setVerticalScrollBarPolicy(2)
        self.textEdit.setToolTip("Action log.")
        self.textEdit.setReadOnly(True)

        self.isItemSave = False
        self.table = QTableWidget(0, 3)
        self.table.setToolTip("Temperature sensors.")
        self.table.setFixedWidth(342)
        self.table.setVerticalScrollBarPolicy(1)
        self.table.setHorizontalScrollBarPolicy(1)
        self.table.setColumnWidth(0, 50)
        self.table.setColumnWidth(1, 150)
        self.table.setColumnWidth(2, 120)
        self.table.setAlternatingRowColors(True)
        self.table.setSelectionMode(QTableWidget.SingleSelection)
        self.table.setSelectionBehavior(QTableWidget.SelectRows)
        self.table.setHorizontalHeaderLabels(['Val', 'Name', 'Address'])
        self.table.verticalHeader().setFixedWidth(20)
        self.table.verticalHeader().setDefaultAlignment(Qt.AlignRight)
        self.table.setEditTriggers(self.table.NoEditTriggers)

        grid = QGridLayout()
        grid.setSpacing(3)
        grid.setContentsMargins(3, 3, 3, 3)
        grid.addWidget(self.textEdit, 0, 0, 1, 1)
        grid.addWidget(self.table, 0, 1, 1, 1)
        widget = QWidget()
        widget.setLayout(grid)
        self.setCentralWidget(widget)

        self.setGeometry(300, 200, 600, 400)
        self.setWindowFlags(Qt.MSWindowsFixedSizeDialogHint)
        self.statusBar().setSizeGripEnabled(False)
        self.setWindowTitle('Observer')
        self.show()
        self.core.dataAdded.connect(self.onDataAdded)
        self.statusBar().showMessage('Application is runnig.')

    def command(self):
        """Обработка командой строки при запуске."""
        if len(sys.argv) > 1:
            if sys.argv[1] == '-s':
                if len(sys.argv) > 2:
                    if sys.argv[2].isdigit():
                        self.core.period = sys.argv[2]
                    self.actionFileStart.trigger()

    def closeEvent(self, event):
        """Событие закрытия программы."""
        self.core.stop()
        super().closeEvent(event)

    def onActionFileStartTriggered(self):
        """Действие нажатия Файл -> Старт.
        Запускает мониторинг."""
        self.actionFileStop.setEnabled(True)
        self.actionFileStart.setDisabled(True)
        self.core.start()

    def onActionFileStopTriggered(self):
        """Действие нажатия Файл -> Стоп.
        Остановить мониторинг."""
        self.actionFileStart.setEnabled(True)
        self.actionFileStop.setDisabled(True)
        self.core.stop()

    def actionConfigSensorsAddTriggered(self):
        """Действие нажатия Настройки -> Сенсоры -> Добавить.
        Открыть файл с настройками датчиков."""
        if os.path.exists(self.core.pathSensors):
            answer = QMessageBox.question(
                self, 'Add sensors',
                'Open file "{}/{}" to add sensors in external editor?'.format(
                    self.core.pathSensors, 'temperature'))
            if answer == QMessageBox.Yes:
                try:
                    os.startfile('{}\\{}'.format(self.core.pathSensors,
                                                 'temperature'))
                except Exception:
                    QMessageBox.warning(
                        self, 'Add sensors', 'File "{}/{}" don`t open!'.format(
                            self.core.pathSensors, 'temperature'))
        else:
            QMessageBox.warning(
                self, 'Add sensors',
                '"{}" path does not exist'.format(self.core.pathSensors))

    def actionConfigSensorsDelTriggered(self):
        """Действие нажатия Настройки -> Сенсоры -> Удалить.
        Открыть файл с настройками датчиков."""
        if os.path.exists(self.core.pathSensors):
            answer = QMessageBox.question(
                self, 'Delete sensors',
                'Open "{}/{}" to delete sensors in external editor?'.format(
                    self.core.pathSensors, 'temperature'))
            if answer == QMessageBox.Yes:
                try:
                    os.startfile('{}\\{}'.format(self.core.pathSensors,
                                                 'temperature'))
                except Exception:
                    QMessageBox.warning(
                        self, 'Delete sensors',
                        'File "{}/{}" don`t open!'.format(
                            self.core.pathSensors, 'temperature'))
        else:
            QMessageBox.warning(
                self, 'Delete sensors',
                '"{}" path does not exist'.format(self.core.pathSensors))

    def actionConfigPeriodTriggered(self):
        """Действие нажатия Настройки -> Период.
        Открыть окно настройки периода опроса датчиков."""
        period, ok = QInputDialog.getInt(self, 'Request period',
                                         'Enter request period:',
                                         int(self.core.period), 10, 3600)
        if ok:
            self.core.period = str(period)
            self.core.configSave()

    def actionConfigPathAddressesTriggered(self):
        """Действие нажатия Настройки -> Путь -> Адреса.
        Открывает окно выбора пути к файлу настройки адресов."""
        path = QFileDialog.getOpenFileName(self, 'Addresses path',
                                           self.core.pathAddresses, '')
        if path[0] != '':
            self.core.pathAddresses = path[0]
            self.core.configSave()

    def actionConfigPathSensorsTriggered(self):
        """Действие нажатия Настройки -> Путь -> Датчики.
        Открывает окно выбора пути к файлу настройки датчиков."""
        path = QFileDialog.getExistingDirectory(self, 'Sensors directory',
                                                self.core.pathSensors)
        if path != '':
            self.core.pathSensors = path
            self.core.configSave()

    def actionConfigPathDataTriggered(self):
        """Действие нажатия Настройки -> Путь -> Данные.
        Открывает окно выбора пути к папке, содержащей данные."""
        path = QFileDialog.getExistingDirectory(self, 'Data directory',
                                                self.core.pathData)
        if path != '':
            self.core.pathData = path
            self.core.configSave()

    def changeRow(self):
        """Изменение отображения информации в колонках."""
        if self.actionViewInfo.isChecked():
            self.table.setColumnHidden(1, False)
            self.table.setColumnHidden(2, False)
            self.table.setFixedWidth(self.table.width() + 270)
            self.setFixedWidth(self.width() + 270)
        else:
            self.table.setColumnHidden(1, True)
            self.table.setColumnHidden(2, True)
            self.table.setFixedWidth(self.table.width() - 270)
            self.setFixedWidth(self.width() - 270)

    def checkItemSave(self, item):
        """Проверка изменения ячейки имени датчика."""
        if item.column() == 1:
            self.isItemSave = True
        else:
            self.isItemSave = False

    def itemSave(self, item):
        """Сохранение имени в списке."""
        if self.isItemSave:
            if item.column() == 1:
                if item.tableWidget() == self.table:
                    self.isItemSave = False
                    self.statusBar().showMessage(item.text() + " save")
                    temp = self.table.item(item.row(), 2)
                    key = temp.text()
                    self.core.sensors[key].name = item.text()
        self.table.clearSelection()

    def onLogged(self, log, modes):
        """Событие логирования.
        
        log - передаваемое сообщение;
        
        modes - содержит один или несколько режимов отображения лога:
        
        l - вывод в текстовое поле;

        s - вывод в статус бар;

        f - запись в файл."""
        if 'l' in modes:
            self.textEditList.appendleft(log)
            self.textEdit.clear()
            self.textEdit.setText('\n'.join(self.textEditList))

        if 's' in modes:
            self.statusBar().showMessage(log)

        if 'f' in modes:
            directory = '{0}\\{1}\\{2}\\{3}'.format(
                self.core.pathData, self.core.currentDate.strftime('%Y'),
                self.core.currentDate.strftime('%m'),
                self.core.currentDate.strftime('%d'))
            os.makedirs(directory, 0o777, True)
            with open(
                    '{0}\\{1}.log'.format(
                        directory, self.core.currentDate.strftime('%Y.%m.%d')),
                    'a') as file:
                file.write(log + '\n')

    def onDataAdded(self):
        """Событие добавления данных."""
        self.table.setRowCount(len(self.core.sensors))
        if self.table.rowCount() <= 20:
            self.table.setMinimumHeight(25 + self.table.rowCount() * 23)
        i = 0
        for key in self.core.sensors.keys():
            if self.core.sensors[key].value is not None:
                self.table.setRowHeight(i, 23)
                self.table.setItem(
                    i, 0, QTableWidgetItem(self.core.sensors[key].value))
                self.table.setItem(
                    i, 1, QTableWidgetItem(self.core.sensors[key].name))
                self.table.setItem(i, 2, QTableWidgetItem(key))
                i += 1
        self.table.setRowCount(i)
        self.table.sortItems(1)

    def onAbout(self):
        """Действие нажатия Помощь -> О программе."""
        text = '<h2>{0}</h2>'\
               '<p>Client program for monitoring the condition<br>'\
               'of the premises of the Kharkov Radar.<br>'\
               'Source code is available on '\
               '<a href="https://github.com/StanislavMain/ObserverClient">'\
               'GitHub</a>.</p><p><b>Stanislav Hnatiuk</b><br>'\
               'Institute of Ionosphere\n<br>Ukraine, Kharkiv.<br><br>'\
               'Contacts with me:<br>'\
               '<a href="https://t.me/stanmain">Telegram</a><br>'\
               '<a href="https://github.com/StanislavMain">GitHub</a><br>'\
               '<br><b>All rights reserved.</b></p>'.format(self.windowTitle())
        QMessageBox.about(self, 'About the program', text)

    def actionHelpHelpTriggered(self):
        """Действие нажатия Помощь -> Помощь."""
        text = '<p><b>Console parametrs</b><br>'\
               'usage: main [options]<br>'\
               'where options have next key:<br>'\
               '-s [seconds]: start monitoring with a period of [seconds]</p>'\
               '<p><b>Code and name</b><br>'\
               'Write your address and sensors in the appropriate files:<br>'\
               '{}<br>{}/*</p>'\
               '<p><b>Data</b><br>'\
               'Data is located in "{}"<br>'\
               '"/Year/Month/Day/Y.M.D.csv" : data file<br>'\
               '"/Year/Month/Day/Y.M.D.png" : chart file<br>'\
               '"/Year/Month/Day/Y.M.D.log" : log file<br>'\
               '</p>'.format(
                   self.core.pathAddresses,
                   self.core.pathSensors,
                   self.core.pathData
                )
        QMessageBox.information(self, 'Help', text)
Esempio n. 53
0
class MainUI(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        # place Window
        self.placeWindow = QLineEdit()
        self.placeWindow.setFixedWidth(120)
        self.placeWindow.setReadOnly(True)

        # place Layout
        placeLayout = QVBoxLayout()
        placeLayout.addWidget(self.placeWindow)
        placeLayout.addStretch(1)

        # game Window
        self.gameWindow = QTextEdit()
        self.gameWindow.setReadOnly(True)
        self.gameWindow.setFixedHeight(400)

        # map Window
        self.mapWindow = QTextEdit()
        self.mapWindow.setReadOnly(True)
        self.mapWindow.setFixedHeight(200)

        # enemy Window
        self.questWindow = QTextEdit()
        self.questWindow.setReadOnly(True)
        self.questWindow.setFixedHeight(90)
        self.questWindow.setFontPointSize(8)

        # player Window
        self.playerWindow = QTextEdit()
        self.playerWindow.setReadOnly(True)
        self.playerWindow.setFixedHeight(90)
        self.playerWindow.setFontPointSize(8)

        # upper Layout
        upperLayout = QGridLayout()
        upperLayout.addWidget(self.gameWindow, 0, 0)

        # down Layout
        downLayout = QGridLayout()
        downLayout.addWidget(self.mapWindow, 0, 0)
        downLayout.addWidget(self.questWindow, 1, 0)
        downLayout.addWidget(self.playerWindow, 2, 0)

        # button
        self.moveButton_1 = QToolButton()
        self.moveButton_1.setFixedSize(50, 80)
        self.moveButton_1.setText("▲")
        self.moveButton_2 = QToolButton()
        self.moveButton_2.setFixedSize(80, 50)
        self.moveButton_2.setText("◀")
        self.moveButton_3 = QToolButton()
        self.moveButton_3.setFixedSize(80, 50)
        self.moveButton_3.setText("▶")
        self.moveButton_4 = QToolButton()
        self.moveButton_4.setFixedSize(50, 80)
        self.moveButton_4.setText("▼")

        self.actionButton_1 = QToolButton()
        self.actionButton_1.setFixedSize(100, 100)
        self.actionButton_2 = QToolButton()
        self.actionButton_2.setFixedSize(100, 100)
        self.actionButton_3 = QToolButton()
        self.actionButton_3.setFixedSize(100, 100)
        self.actionButton_4 = QToolButton()
        self.actionButton_4.setFixedSize(100, 100)

        # move button Layout
        moveButtonLayout = QGridLayout()
        moveButtonLayout.addWidget(self.moveButton_1, 0, 1)
        moveButtonLayout.addWidget(self.moveButton_2, 1, 0)
        moveButtonLayout.addWidget(self.moveButton_3, 1, 2)
        moveButtonLayout.addWidget(self.moveButton_4, 2, 1)

        # action button Layout
        actionButtonLayout = QGridLayout()
        actionButtonLayout.addWidget(self.actionButton_1, 0, 0)
        actionButtonLayout.addWidget(self.actionButton_2, 0, 1)
        actionButtonLayout.addWidget(self.actionButton_3, 1, 0)
        actionButtonLayout.addWidget(self.actionButton_4, 1, 1)

        # main Layout
        mainLayout = QGridLayout()
        mainLayout.setSizeConstraint(QLayout.SetFixedSize)
        mainLayout.addLayout(placeLayout, 0, 0)
        mainLayout.addLayout(upperLayout, 1, 0)
        mainLayout.addLayout(downLayout, 1, 1)
        mainLayout.addLayout(moveButtonLayout, 2, 0)
        mainLayout.addLayout(actionButtonLayout, 2, 1)

        self.setLayout(mainLayout)

        self.setWindowTitle("title")

        self.setGeometry(500, 500, 1000, 2000)

    # 버튼 문자 변경
    def button_setText(self, text_1="", text_2="", text_3="", text_4=""):
        self.actionButton_1.setText(text_1)
        self.actionButton_2.setText(text_2)
        self.actionButton_3.setText(text_3)
        self.actionButton_4.setText(text_4)

    # 텍스트 파일 불러오기
    def text_load(self, filename):
        f = open(filename, "r", encoding="utf-8")
        self.current_text = filename
        self.lines = f.readlines()
        f.close()
        self.placeWindow.setText(filename[:-4])
        self.questWindow.clear()
        self.gameWindow.clear()
        self.button_setText("Next", "Skip")
        self.gameWindow.append(self.lines[0])
        self.cnt_textline = 1

    # 다음 문장
    def text_next(self):
        self.gameWindow.append(self.lines[self.cnt_textline])
        self.cnt_textline += 1
        if self.cnt_textline == len(self.lines):
            self.button_setText("Continue")

    # 텍스트 종료
    def text_end(self):
        if self.current_text == "Prolog.txt":
            self.screen_class()
        elif self.current_text == "npc1_1.txt":
            self.questWindow.setText("1번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc1_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc2_1.txt":
            self.questWindow.setText("2번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc2_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc3_1.txt":
            self.questWindow.setText("3번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc3_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc4_1.txt":
            self.questWindow.setText("4번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc4_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc5_1.txt":
            self.questWindow.setText("5번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc5_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc6_1.txt":
            self.questWindow.setText("6번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc6_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc7_1.txt":
            self.questWindow.setText("7번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc7_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc8_1.txt":
            self.questWindow.setText("8번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc8_2.txt":
            self.screen_quest_end()
        elif self.current_text == "npc9_1.txt":
            self.questWindow.setText("9번 퀘스트")
            self.screen_quest()
        elif self.current_text == "npc9_2.txt":
            self.text_load("Epilogue.txt")
        elif self.current_text == "Epilogue.txt":
            self.screen_main()

    # 맵 그리기
    def map_draw(self, map):
        tmp = ""
        for i in range(0, len(map)):
            for j in range(0, len(map[0])):
                if map[i][j] == 0:  #벽
                    tmp += "□"
                elif map[i][j] == 1:  #길 (안깬, 몬스터)
                    tmp += "■"
                elif map[i][j] == 2:  #플레이어
                    tmp += "★"
                elif map[i][j] == 3:  #길 (깬)
                    tmp += "○"
                elif map[i][j] == 4:  #길 (안깬, 보물상자)
                    tmp += "■"
                elif map[i][j] == 5:  #길 (안깬, 보스)
                    tmp += "■"
            tmp += "\n"

        self.mapWindow.setFontPointSize(10)
        self.mapWindow.setText(tmp)

    # gameover
    def gameover(self):
        self.gameWindow.setText("")
        self.gameWindow.append("플레이어가 죽었습니다")
        self.gameWindow.append("ㅜㅅㅜ")
        self.placeWindow.clear()
        self.mapWindow.clear()
        self.playerWindow.clear()
        self.button_setText("", "", "", "메인으로")

    # 유저 상태창
    def status_player(self, level, unit_class, hp_max, hp_current, mp_max,
                      mp_current, gold):
        self.playerWindow.setText(unit_class + "  레벨 : " + str(level) +
                                  "  골드  : " + str(gold))
        self.playerWindow.append("hp : " + str(hp_current) + "/" +
                                 str(hp_max) + "   mp : " + str(mp_current) +
                                 "/" + str(mp_max))

    # 메인 화면
    def screen_main(self):
        self.placeWindow.setText("메인 화면")
        self.gameWindow.setFontPointSize(15)
        self.gameWindow.setText("In A Dream")
        self.gameWindow.setFontPointSize(10)
        self.gameWindow.setAlignment(Qt.AlignCenter)
        self.questWindow.setText("")
        self.playerWindow.setText("")
        self.button_setText("New Game", "How To Play", "Credit", "Exit")

    # 크레딧
    def screen_credit(self):
        self.placeWindow.setText("제작자")
        self.gameWindow.setText("")
        self.gameWindow.append("20163136 이민규")
        self.gameWindow.append("20182089 송희범")
        self.button_setText("", "", "", "뒤로")

    # howtoplay
    def screen_howtoplay(self):
        self.placeWindow.setText("HowToPlay")
        self.gameWindow.setText(
            "마을에서 NPC에게 퀘스트를 받고 해당 던전에 가서 퀘스트를 클리어하는 방식입니다")
        self.gameWindow.append("")
        self.gameWindow.append("□:벽")
        self.gameWindow.append("■:길(몬스터, 보물상자, 보스)")
        self.gameWindow.append("○:이미 한번 깬 길")
        self.gameWindow.append("★:플레이어")
        self.gameWindow.append("")
        self.gameWindow.append("던전에선 도중에 탈출할 수 있지만, 일정 데미지를 입습니다")
        self.button_setText("", "", "", "뒤로")

    # 직업 선택
    def screen_class(self):
        self.placeWindow.setText("직업 선택")
        self.gameWindow.setText("")
        self.gameWindow.append("플레이어의 직업을 선택해주세요")
        self.gameWindow.setAlignment(Qt.AlignCenter)
        self.button_setText("나무꾼", "저격수", "고고학자", "뒤로")

    # 스킬
    def screen_skill(self, skillList):
        self.button_setText(skillList[0], skillList[1], skillList[2], "전투")

    # 마을 이동 불가
    def screen_village_cant(self):
        self.gameWindow.append("")
        self.gameWindow.append("아직 갈 수 없는 마을입니다")

    # 마을 광장
    def screen_village_square(self, village_name):
        self.placeWindow.setText(village_name)
        self.gameWindow.setText("")
        self.gameWindow.append("마을에서 무엇을 할까?")
        self.button_setText("상점", "대화", "던전 선택", "마을 선택")

    # 마을 상점
    def screen_village_shop(self):
        self.placeWindow.setText("상점")
        self.gameWindow.setText("")
        self.gameWindow.append("어서오세요! 꽤 보고싶었다구요?")
        self.gameWindow.append("")
        self.gameWindow.append("HP물약: 100골드")
        self.gameWindow.append("MP물약: 100골드")
        self.button_setText("HP물약", "MP물약", "", "뒤로")

    # 마을 상점 구매
    def screen_village_shop_buy(self, item_name, item_num):
        self.gameWindow.append("")
        self.gameWindow.append(item_name + "을 구매하였습니다. 현재 개수: " +
                               str(item_num))

    # 마을 상점 구매 실패
    def screen_village_shop_nomoney(self, item_name, item_price):
        self.gameWindow.append("")
        self.gameWindow.append(item_name + "구매에 실패하였습니다. 가격은 " +
                               str(item_price) + "골드입니다")

    # 마을 대화
    def screen_village_npc(self, npcList):
        self.gameWindow.setText("")
        self.gameWindow.append("대화할 상대를 선택하여 주세요")
        self.button_setText(npcList[0], npcList[1], npcList[2], "뒤로")

    # 던전 선택
    def screen_village_dungeonChoice(self, dungeonList):
        self.placeWindow.setText("던전 선택")
        self.gameWindow.setText("")
        self.gameWindow.append("들어가실 던전을 선택하여주세요")
        self.gameWindow.append("")
        self.gameWindow.append("해당 던전의 퀘스트를 받아야 입장이 가능합니다")
        self.gameWindow.setAlignment(Qt.AlignCenter)
        self.button_setText(dungeonList[0], dungeonList[1], dungeonList[2],
                            "뒤로")

    # 마을 선택
    def screen_village_villageChoice(self, villageList):
        self.placeWindow.setText("마을 선택")
        self.gameWindow.setText("")
        self.gameWindow.append("이동하실 마을을 선택하여주세요")
        self.gameWindow.setAlignment(Qt.AlignCenter)
        self.button_setText(villageList[0], villageList[1], "", "뒤로")

    # NPC 레벨 부족
    def npc_cant(self, level):
        self.gameWindow.append("")
        self.gameWindow.append("아직 나와 대화할 때가 아니네 " + str(level) + "은 찍고 오게나")

    # NPC 퀘스트 수락
    def npc_over(self):
        self.gameWindow.append("")
        self.gameWindow.append("저번에 도와줘서 고마웠네")

    # 퀘스트 수락
    def screen_quest(self):
        self.gameWindow.setText("퀘스트를 받았다!")
        self.button_setText("", "", "", "뒤로")

    # 퀘스트 완료
    def screen_quest_end(self):
        self.gameWindow.setText("퀘스트를 완료했다!")
        self.questWindow.clear()
        self.button_setText("", "", "", "뒤로")

    # 던전 입장 불가
    def screen_dungeon_cant(self):
        self.gameWindow.append("")
        self.gameWindow.append("던전에 해당하는 퀘스트를 받고 오시오")

    # 던전 입장
    def screen_dungeon_start(self, dungeon_name):
        self.placeWindow.setText(dungeon_name)
        self.gameWindow.setText(dungeon_name + "의 입구이다.")
        self.gameWindow.append("")
        self.gameWindow.append("으쓱한 기운이 느껴진다.")
        self.button_setText("", "", "입장", "뒤로")

    # 던전 이동
    def screen_dungeon_move(self, clear):
        self.gameWindow.setText("우측 하단의 방향키로 이동해주세요")
        self.gameWindow.append("")
        self.gameWindow.append("□:벽")
        self.gameWindow.append("■:길(몬스터, 보물상자, 보스)")
        self.gameWindow.append("○:이미 한번 깬 길")
        self.gameWindow.append("★:플레이어")
        if clear == False:
            self.button_setText("", "", "아이템", "탈출")
        else:
            self.button_setText("", "", "아이템", "나가기")

    # 던전 아이템
    def screen_dungeon_item(self, itemList):
        self.gameWindow.append("")
        self.gameWindow.append("HP물약: " + str(itemList[0]))
        self.gameWindow.append("MP물약: " + str(itemList[1]))
        self.button_setText("HP물약", "MP물약", "", "전투")

    # 던전 몬스터
    def screen_dungeon_monster(self, name, hp):
        self.gameWindow.setText("")
        self.gameWindow.append(name + "의 hp: " + str(hp))
        self.gameWindow.setAlignment(Qt.AlignCenter)
        self.button_setText("공격", "스킬", "아이템", "탈출")

    # 던전 몬스터 공격
    def screen_dungeon_monster_attack(self, name, hp, dmgToMon, dmgToPly):
        self.gameWindow.clear()
        self.gameWindow.setText("")
        self.gameWindow.append(name + "에게")
        self.gameWindow.append(str(dmgToMon) + "의 데미지를 주었다")
        self.gameWindow.append("")
        self.gameWindow.append(str(dmgToPly) + "의 피해를 받았다")
        self.gameWindow.append("")
        self.gameWindow.append(name + "의 hp: " + str(hp))
        self.gameWindow.setAlignment(Qt.AlignCenter)

    # 던전 보물상자
    def screen_dungeon_box(self):
        self.gameWindow.setText("보물상자 발견!!")
        self.button_setText("", "", "열기", "")

    # 던전 보물상자 열기
    def screen_dungeon_box_open(self, gold):
        self.gameWindow.setText(str(gold) + "획득")
        self.button_setText("", "", "", "계속하기")

    #던전 보스 등장
    def screen_dungeon_boss(self, boss_name):
        self.placeWindow.setText(boss_name)
        self.gameWindow.setText("")
        self.gameWindow.append(boss_name + "가 나타났다!!")
        self.gameWindow.setAlignment(Qt.AlignCenter)
        self.button_setText("", "", "싸우자", "탈출")

    # 던전 클리어
    def screen_dungeon_clear(self):
        self.gameWindow.setText("")
        self.gameWindow.append("던전을 클리어했다 마을로 돌아가자")
        self.button_setText("", "", "둘러보기", "돌아가기")
Esempio n. 54
0
class WorkSpace(QWidget):
    inputGreek = [
        'x', 'y', 'z', '(', ')', '7', '8', '9', 'DEL', 'C', 'f', 'g', 'h', '{',
        '}', '4', '5', '6', '/', '*', 'sin', 'cos', 'tan', '[', ']', '1', '2',
        '3', '+', '-', 'log', 'exp', '^', 'i', u'\u03C0', '.', '0', '=', '<',
        '>'
    ]
    inputLaTeX = [
        'x', 'y', 'z', '(', ')', '7', '8', '9', 'DEL', 'C', 'f', 'g', 'h', '{',
        '}', '4', '5', '6', '\\div', '\\times', '\\sin', '\\cos', '\\tan', '[',
        ']', '1', '2', '3', '+', '-', 'log', 'exp', '^', 'i', '\\pi', '.', '0',
        '=', '<', '>'
    ]

    mode = 'interaction'
    showQuickSim = True
    showStepByStep = True
    showPlotter = False
    enableQSolver = True
    buttons = {}
    solutionOptionsBox = QGridLayout()
    solutionButtons = {}
    inputBox = QGridLayout()
    selectedCombo = "Greek"
    equations = []
    stepsFontSize = 1
    axisRange = [10, 10, 10, 30]  # axisRange[-1] --> MeshDensity in 3D graphs
    resultOut = False

    try:
        with open('local/eqn-list.vis', 'r+') as fp:
            for line in fp:
                if not line.isspace():
                    fp.write(line)
                    equations.insert(
                        0, ('Equation No.' + str(len(equations) + 1), line))
            fp.close()
    except IOError:
        if not os.path.exists('local'):
            os.mkdir('local')
        file = open('local/eqn-list.vis', 'w')
        file.close()

    if len(equations) == 0:
        equations = [('No equations stored', '')]

    equationListVbox = QVBoxLayout()
    tokens = []
    lTokens = []
    rTokens = []
    buttonSet = False
    solutionType = ""

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)

        self.equationList = QTabWidget()
        self.equationList.tab1 = QWidget()
        # self.equationList.tab2 = QWidget()
        self.equationList.addTab(self.equationList.tab1, "history")
        # self.equationList.addTab(self.equationList.tab2, "favourites")
        self.equationList.tab1.setLayout(self.equationsLayout())
        self.equationList.tab1.setStatusTip("Track of old equations")
        self.equationList.setFixedWidth(300)

        inputSpace = QTabWidget()
        inputSpace.tab1 = QWidget()
        inputSpace.tab2 = QWidget()
        inputSpace.addTab(inputSpace.tab1, "input")
        inputSpace.addTab(inputSpace.tab2, "settings")
        inputSpace.tab1.setLayout(self.inputsLayout())
        inputSpace.tab2.setLayout(preferenceLayout(self))
        inputSpace.tab1.setStatusTip("Input characters")
        inputSpace.setFixedHeight(200)

        buttonSpace = QWidget()
        buttonSpace.setLayout(self.buttonsLayout())
        buttonSpace.setFixedWidth(300)
        buttonSpace.setStatusTip("Interact")

        self.tabPlot = QTabWidget()
        self.tabPlot.tab1 = QWidget()
        self.tabPlot.tab2 = QWidget()
        self.tabPlot.addTab(self.tabPlot.tab1, "2D-plot")
        self.tabPlot.addTab(self.tabPlot.tab2, "3D-plot")
        self.tabPlot.tab1.setLayout(plotFigure2D(self))
        self.tabPlot.tab1.setStatusTip("Visualize equation in 2D")
        self.tabPlot.tab2.setLayout(plotFigure3D(self))
        self.tabPlot.tab2.setStatusTip("Visualize equation in 3D")

        tabStepsLogs = QTabWidget()
        tabStepsLogs.tab1 = QWidget()
        tabStepsLogs.tab2 = QWidget()
        tabStepsLogs.addTab(tabStepsLogs.tab1, "step-by-step")
        # tabStepsLogs.addTab(tabStepsLogs.tab2, "logger")
        tabStepsLogs.tab1.setLayout(stepsFigure(self))
        tabStepsLogs.tab1.setStatusTip("Step-by-step solver")
        # tabStepsLogs.tab2.setStatusTip("Logger")

        font = QtGui.QFont()
        font.setPointSize(16)
        self.textedit = QTextEdit()

        self.textedit.setFont(font)
        self.textedit.textChanged.connect(self.textChangeTrigger)
        self.textedit.setFixedHeight(60)
        self.textedit.setStatusTip("Input equation")

        quickSolve = QWidget()
        quickSolve.setLayout(qSolveFigure(self))
        quickSolve.setFixedHeight(45)
        quickSolve.setStatusTip("Quick solver")

        splitter4 = QSplitter(Qt.Vertical)
        splitter4.addWidget(self.textedit)
        splitter4.addWidget(quickSolve)
        splitter4.addWidget(inputSpace)

        splitter3 = QSplitter(Qt.Horizontal)
        splitter3.addWidget(splitter4)
        splitter3.addWidget(buttonSpace)

        splitter2 = QSplitter(Qt.Horizontal)
        splitter2.addWidget(tabStepsLogs)
        splitter2.addWidget(self.tabPlot)
        splitter2.addWidget(self.equationList)

        splitter1 = QSplitter(Qt.Vertical)
        splitter1.addWidget(splitter3)
        splitter1.addWidget(splitter2)

        hbox.addWidget(splitter1)
        self.setLayout(hbox)

    def textChangeTrigger(self):
        if self.textedit.toPlainText() == "":
            self.enableQSolver = True
        if self.enableQSolver and self.showQuickSim:
            self.qSol = quickSimplify(self)
            if self.qSol is None:
                self.qSol = ""
            showQSolve(self, self.showQuickSim)
        elif self.showQuickSim is False:
            self.qSol = ""
            showQSolve(self, self.showQuickSim)

    def clearAll(self):
        self.textedit.clear()
        self.eqToks = [[]]
        self.output = ""
        showSteps(self)
        plot(self)

    def equationsLayout(self):
        self.myQListWidget = QtWidgets.QListWidget(self)
        for index, name in self.equations:
            myQCustomQWidget = QCustomQWidget()
            myQCustomQWidget.setTextUp(index)
            myQCustomQWidget.setTextDown(name)
            myQListWidgetItem = QtWidgets.QListWidgetItem(self.myQListWidget)
            myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
            self.myQListWidget.addItem(myQListWidgetItem)
            self.myQListWidget.setItemWidget(myQListWidgetItem,
                                             myQCustomQWidget)
        self.myQListWidget.resize(400, 300)
        self.equationListVbox.addWidget(self.myQListWidget)
        self.myQListWidget.itemClicked.connect(self.Clicked)
        self.clearButton = QtWidgets.QPushButton('clear equations')
        self.clearButton.clicked.connect(self.clearHistory)
        self.clearButton.setStatusTip("Restart UI for clearing history")
        # FIXME: Clear button. Clear rightaway.
        self.equationListVbox.addWidget(self.clearButton)
        return self.equationListVbox

    def clearHistory(self):
        file = open('local/eqn-list.vis', 'w')
        file.truncate()
        file.close()

    def Clicked(self, item):
        _, name = self.equations[self.myQListWidget.currentRow()]
        self.textedit.setText(name)

    def buttonsLayout(self):
        vbox = QVBoxLayout()
        interactionModeLayout = QVBoxLayout()
        interactionModeButton = QtWidgets.QPushButton('visma')
        interactionModeButton.clicked.connect(self.interactionMode)
        interactionModeLayout.addWidget(interactionModeButton)
        interactionModeWidget = QWidget(self)
        interactionModeWidget.setLayout(interactionModeLayout)
        interactionModeWidget.setFixedSize(275, 50)
        topButtonSplitter = QSplitter(Qt.Horizontal)
        topButtonSplitter.addWidget(interactionModeWidget)
        permanentButtons = QWidget(self)
        """
        documentButtonsLayout = QHBoxLayout()
        newButton = PicButton(QPixmap("assets/new.png"))
        saveButton = PicButton(QPixmap("assets/save.png"))
        newButton.setToolTip('Add New Equation')
        saveButton.setToolTip('Save Equation')
        documentButtonsLayout.addWidget(newButton)
        documentButtonsLayout.addWidget(saveButton)
        newButton.clicked.connect(self.newEquation)
        saveButton.clicked.connect(self.saveEquation)
        permanentButtons.setLayout(documentButtonsLayout)
        """
        topButtonSplitter.addWidget(permanentButtons)
        self.bottomButton = QFrame()
        self.buttonSplitter = QSplitter(Qt.Vertical)
        self.buttonSplitter.addWidget(topButtonSplitter)
        self.buttonSplitter.addWidget(self.bottomButton)
        vbox.addWidget(self.buttonSplitter)
        return vbox

    def interactionMode(self):
        self.enableQSolver = False
        showQSolve(self, self.enableQSolver)
        cursor = self.textedit.textCursor()
        interactionText = cursor.selectedText()
        if str(interactionText) == '':
            self.mode = 'normal'
            self.input = str(self.textedit.toPlainText())
        else:
            self.input = str(interactionText)
            self.mode = 'interaction'
        showbuttons = True
        if len(self.input) == 0:
            self.input = '0'
            QMessageBox.information(
                self, "Message",
                "No input is given. please enter some expression.")
            showbuttons = False

        self.tokens = tokenizer(self.input)

        self.addEquation()
        lhs, rhs = getLHSandRHS(self.tokens)
        self.lTokens = lhs
        self.rTokens = rhs
        operations, self.solutionType = checkTypes(lhs, rhs)
        if isinstance(operations, list) and showbuttons:
            opButtons = []
            if len(operations) > 0:
                if len(operations) == 1:
                    if operations[0] not in [
                            'integrate', 'differentiate', 'find roots',
                            'factorize'
                    ]:
                        opButtons = ['simplify']
                else:
                    opButtons = ['simplify']
            for operation in operations:
                if operation == '+':
                    opButtons.append("addition")
                elif operation == '-':
                    opButtons.append("subtraction")
                elif operation == '*':
                    opButtons.append("multiplication")
                elif operation == '/':
                    opButtons.append("division")
                else:
                    opButtons.append(operation)

            if self.buttonSet:
                for i in reversed(range(self.solutionOptionsBox.count())):
                    self.solutionOptionsBox.itemAt(i).widget().setParent(None)
                for i in range(int(len(opButtons) / 2) + 1):
                    for j in range(2):
                        if len(opButtons) > (i * 2 + j):
                            self.solutionButtons[(i,
                                                  j)] = QtWidgets.QPushButton(
                                                      opButtons[i * 2 + j])
                            self.solutionButtons[(i, j)].resize(100, 100)
                            self.solutionButtons[(i, j)].clicked.connect(
                                self.onSolvePress(opButtons[i * 2 + j]))
                            self.solutionOptionsBox.addWidget(
                                self.solutionButtons[(i, j)], i, j)
            else:
                self.bottomButton.setParent(None)
                self.solutionWidget = QWidget()
                for i in range(int(len(opButtons) / 2) + 1):
                    for j in range(2):
                        if len(opButtons) > (i * 2 + j):
                            self.solutionButtons[(i,
                                                  j)] = QtWidgets.QPushButton(
                                                      opButtons[i * 2 + j])
                            self.solutionButtons[(i, j)].resize(100, 100)
                            self.solutionButtons[(i, j)].clicked.connect(
                                self.onSolvePress(opButtons[i * 2 + j]))
                            self.solutionOptionsBox.addWidget(
                                self.solutionButtons[(i, j)], i, j)
                self.solutionWidget.setLayout(self.solutionOptionsBox)
                self.buttonSplitter.addWidget(self.solutionWidget)
                self.buttonSet = True

    def refreshButtons(self, operations):
        if isinstance(operations, list):
            opButtons = []
            if len(operations) > 0:
                if len(operations) == 1:
                    if operations[0] != 'solve':
                        opButtons = ['simplify']
                else:
                    opButtons = ['simplify']
            for operation in operations:
                if operation == '+':
                    opButtons.append("addition")
                elif operation == '-':
                    opButtons.append("subtraction")
                elif operation == '*':
                    opButtons.append("multiplication")
                elif operation == '/':
                    opButtons.append("division")
                else:
                    opButtons.append(operation)
            for i in reversed(range(self.solutionOptionsBox.count())):
                self.solutionOptionsBox.itemAt(i).widget().setParent(None)
            for i in range(int(len(opButtons) / 2) + 1):
                for j in range(2):
                    if len(opButtons) > (i * 2 + j):
                        self.solutionButtons[(i, j)] = QtWidgets.QPushButton(
                            opButtons[i * 2 + j])
                        self.solutionButtons[(i, j)].resize(100, 100)
                        self.solutionButtons[(i, j)].clicked.connect(
                            self.onSolvePress(opButtons[i * 2 + j]))
                        self.solutionOptionsBox.addWidget(
                            self.solutionButtons[(i, j)], i, j)

    def clearButtons(self):
        for i in reversed(range(self.solutionOptionsBox.count())):
            self.solutionOptionsBox.itemAt(i).widget().setParent(None)

    def wrtVariableButtons(self, variables, operation):
        if isinstance(variables, list):
            varButtons = []
            if len(variables) > 0:
                for variable in variables:
                    varButtons.append(variable)
                varButtons.append("Back")
                for i in reversed(range(self.solutionOptionsBox.count())):
                    self.solutionOptionsBox.itemAt(i).widget().setParent(None)
                for i in range(int(len(varButtons) / 2) + 1):
                    for j in range(2):
                        if len(varButtons) > (i * 2 + j):
                            self.solutionButtons[(i,
                                                  j)] = QtWidgets.QPushButton(
                                                      varButtons[i * 2 + j])
                            self.solutionButtons[(i, j)].resize(100, 100)
                            self.solutionButtons[(i, j)].clicked.connect(
                                self.onWRTVariablePress(
                                    varButtons[i * 2 + j], operation))
                            self.solutionOptionsBox.addWidget(
                                self.solutionButtons[(i, j)], i, j)

    def newEquation(self):
        self.textedit.setText("")

    def saveEquation(self):
        for i in reversed(range(self.equationListVbox.count())):
            self.equationListVbox.itemAt(i).widget().setParent(None)

        eqn = str(self.textedit.toPlainText())
        if len(self.equations) == 1:
            index, name = self.equations[0]
            if index == "No equations stored":
                self.equations[0] = ("Equation No. 1", eqn)
            else:
                self.equations.append(("Equation No. 2", eqn))
        else:
            self.equations.append(
                ("Equation No. " + str(len(self.equations) + 1), eqn))

        self.textedit.setText('')
        file = open('local/eqn-list.vis', 'r+')
        self.myQListWidget = QtWidgets.QListWidget(self)
        i = 0
        for index, name in self.equations:
            if i != 0:
                file.write("\n")
            file.write(name)
            myQCustomQWidget = QCustomQWidget()
            myQCustomQWidget.setTextUp(index)
            myQCustomQWidget.setTextDown(name)
            myQListWidgetItem = QtWidgets.QListWidgetItem(self.myQListWidget)
            myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
            self.myQListWidget.addItem(myQListWidgetItem)
            self.myQListWidget.setItemWidget(myQListWidgetItem,
                                             myQCustomQWidget)
            i += 1
        file.close()
        self.myQListWidget.resize(400, 300)

        self.myQListWidget.itemClicked.connect(self.Clicked)
        self.equationListVbox.addWidget(self.myQListWidget)
        return self.equationListVbox

    def addEquation(self):
        eqn = str(self.textedit.toPlainText())
        for index, equation in self.equations:
            if equation == eqn:
                return self.equationListVbox

        for i in reversed(range(self.equationListVbox.count())):
            self.equationListVbox.itemAt(i).widget().setParent(None)

        if len(self.equations) == 1:
            index, name = self.equations[0]
            if index == "No equations stored":
                self.equations[0] = ("Equation No. 1", eqn)
            else:
                self.equations.append(("Equation No. 2", eqn))
        else:
            self.equations.append(
                ("Equation No. " + str(len(self.equations) + 1), eqn))
        file = open('local/eqn-list.vis', 'r+')
        self.myQListWidget = QtWidgets.QListWidget(self)
        i = 0
        for index, name in self.equations:
            if i != 0:
                file.write("\n")
            file.write(name)
            myQCustomQWidget = QCustomQWidget()
            myQCustomQWidget.setTextUp(index)
            myQCustomQWidget.setTextDown(name)
            myQListWidgetItem = QtWidgets.QListWidgetItem(self.myQListWidget)
            myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
            self.myQListWidget.addItem(myQListWidgetItem)
            self.myQListWidget.setItemWidget(myQListWidgetItem,
                                             myQCustomQWidget)
            i += 1
        file.close()
        self.myQListWidget.resize(400, 300)

        self.myQListWidget.itemClicked.connect(self.Clicked)
        self.equationListVbox.addWidget(self.myQListWidget)
        self.myQListWidget.itemClicked.connect(self.Clicked)
        self.clearButton = QtWidgets.QPushButton('clear equations')
        self.clearButton.clicked.connect(self.clearHistory)
        self.equationListVbox.addWidget(self.clearButton)
        return self.equationListVbox

    def inputsLayout(self, loadList="Greek"):

        inputLayout = QHBoxLayout(self)
        inputWidget = QWidget()
        self.selectedCombo = str(loadList)
        for i in range(4):
            for j in range(10):
                if str(loadList) in "Greek":
                    if (i * 10 + j) < len(self.inputGreek):
                        self.buttons[(i, j)] = QtWidgets.QPushButton(
                            self.inputGreek[i * 10 + j])
                        self.buttons[(i, j)].resize(100, 100)
                        self.buttons[(i, j)].clicked.connect(
                            self.onInputPress(self.inputGreek[i * 10 + j]))
                        self.inputBox.addWidget(self.buttons[(i, j)], i, j)
                elif str(loadList) in "LaTeX":
                    if (i * 10 + j) < len(self.inputLaTeX):
                        self.buttons[(i, j)] = QtWidgets.QPushButton(
                            self.inputLaTeX[i * 10 + j])
                        self.buttons[(i, j)].resize(100, 100)
                        self.buttons[(i, j)].clicked.connect(
                            self.onInputPress(self.inputLaTeX[i * 10 + j]))
                        # (self.inputLaTeX[i * 3 + j])
                        self.inputBox.addWidget(self.buttons[(i, j)], i, j)
        inputWidget.setLayout(self.inputBox)
        # inputSplitter.addWidget(inputTypeSplitter)
        # inputSplitter.addWidget(inputWidget)
        inputLayout.addWidget(inputWidget)
        return inputLayout

    def onActivated(self, text):
        for i in reversed(range(self.inputBox.count())):
            self.inputBox.itemAt(i).widget().setParent(None)

        for i in range(4):
            for j in range(10):
                if str(text) in "Greek":
                    if (i * 10 + j) < len(self.inputGreek):
                        self.buttons[(i, j)] = QtWidgets.QPushButton(
                            self.inputGreek[i * 10 + j])
                        self.buttons[(i, j)].resize(100, 100)
                        self.buttons[(i, j)].clicked.connect(
                            self.onInputPress(self.inputGreek[i * 10 + j]))
                        self.inputBox.addWidget(self.buttons[(i, j)], i, j)
                elif str(text) in "LaTeX":
                    if (i * 10 + j) < len(self.inputLaTeX):
                        self.buttons[(i, j)] = QtWidgets.QPushButton(
                            self.inputLaTeX[i * 10 + j])
                        self.buttons[(i, j)].resize(100, 100)
                        self.buttons[(i, j)].clicked.connect(
                            self.onInputPress(self.inputLaTeX[i * 10 + j]))
                        self.inputBox.addWidget(self.buttons[(i, j)], i, j)
        self.selectedCombo = str(text)

    def onInputPress(self, name):
        def calluser():
            if name == 'C':
                self.clearAll()
            elif name == 'DEL':
                cursor = self.textedit.textCursor()
                cursor.deletePreviousChar()
            else:
                self.textedit.insertPlainText(str(name))

        return calluser

    def onSolvePress(self, name):
        def calluser():
            availableOperations = []
            tokenString = ''
            equationTokens = []
            self.resultOut = True
            if name == 'addition':
                if self.solutionType == 'expression':
                    self.tokens, availableOperations, tokenString, equationTokens, comments = addition(
                        self.tokens, True)
                else:
                    self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = additionEquation(
                        self.lTokens, self.rTokens, True)
            elif name == 'subtraction':
                if self.solutionType == 'expression':
                    self.tokens, availableOperations, tokenString, equationTokens, comments = subtraction(
                        self.tokens, True)
                else:
                    self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = subtractionEquation(
                        self.lTokens, self.rTokens, True)
            elif name == 'multiplication':
                if self.solutionType == 'expression':
                    self.tokens, availableOperations, tokenString, equationTokens, comments = multiplication(
                        self.tokens, True)
                else:
                    self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = multiplicationEquation(
                        self.lTokens, self.rTokens, True)
            elif name == 'division':
                if self.solutionType == 'expression':
                    self.tokens, availableOperations, tokenString, equationTokens, comments = division(
                        self.tokens, True)
                else:
                    self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = divisionEquation(
                        self.lTokens, self.rTokens, True)
            elif name == 'simplify':
                if self.solutionType == 'expression':
                    self.tokens, availableOperations, tokenString, equationTokens, comments = simplify(
                        self.tokens)
                else:
                    self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = simplifyEquation(
                        self.lTokens, self.rTokens)
            elif name == 'factorize':
                self.tokens, availableOperations, tokenString, equationTokens, comments = factorize(
                    self.tokens)
            elif name == 'find roots':
                self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = quadraticRoots(
                    self.lTokens, self.rTokens)
            elif name == 'solve':
                lhs, rhs = getLHSandRHS(self.tokens)
                variables = getVariables(lhs, rhs)
                self.wrtVariableButtons(variables, name)
                self.resultOut = False
            elif name == 'integrate':
                lhs, rhs = getLHSandRHS(self.tokens)
                variables = getVariables(lhs, rhs)
                self.wrtVariableButtons(variables, name)
                self.resultOut = False
            elif name == 'differentiate':
                lhs, rhs = getLHSandRHS(self.tokens)
                variables = getVariables(lhs, rhs)
                self.wrtVariableButtons(variables, name)
                self.resultOut = False
            if self.resultOut:
                self.eqToks = equationTokens
                self.output = resultLatex(name, equationTokens, comments)
                if len(availableOperations) == 0:
                    self.clearButtons()
                else:
                    self.refreshButtons(availableOperations)
                if self.mode == 'normal':
                    self.textedit.setText(tokenString)
                elif self.mode == 'interaction':
                    cursor = self.textedit.textCursor()
                    cursor.insertText(tokenString)
                if self.showStepByStep is True:
                    showSteps(self)
                if self.showPlotter is True:
                    plot(self)

        return calluser

    def onWRTVariablePress(self, varName, operation):
        def calluser():
            availableOperations = []
            tokenString = ''
            equationTokens = []
            if varName == 'Back':
                self.input = str(self.textedit.toPlainText())
                self.tokens = tokenizer(self.input)
                # print(self.tokens)
                lhs, rhs = getLHSandRHS(self.tokens)
                operations, self.solutionType = checkTypes(lhs, rhs)
                self.refreshButtons(operations)

            elif operation == 'solve':
                self.lTokens, self.rTokens, availableOperations, tokenString, equationTokens, comments = solveFor(
                    self.lTokens, self.rTokens, varName)

            elif operation == 'integrate':
                self.lTokens, availableOperations, tokenString, equationTokens, comments = integrate(
                    self.lTokens, varName)

            elif operation == 'differentiate':
                self.lTokens, availableOperations, tokenString, equationTokens, comments = differentiate(
                    self.lTokens, varName)

            self.eqToks = equationTokens
            self.output = resultLatex(operation, equationTokens, comments,
                                      varName)
            if len(availableOperations) == 0:
                self.clearButtons()
            else:
                self.refreshButtons(availableOperations)
            if self.mode == 'normal':
                self.textedit.setText(tokenString)
            elif self.mode == 'interaction':
                cursor = self.textedit.textCursor()
                cursor.insertText(tokenString)
            if self.showStepByStep is True:
                showSteps(self)
            if self.showPlotter is True:
                plot(self)

        return calluser
Esempio n. 55
0
class MainWindow(QDialog):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.createCategorySelectionGroupBox()
        self.createTextEditLayout()
        self.createButtonLayout()

        mainLayout = QGridLayout()
        mainLayout.addLayout(self.categorySelectionLayout, 0, 0)
        mainLayout.addLayout(self.textEditLayout, 1, 0)
        mainLayout.addLayout(self.buttonLayout, 2, 0)
        self.setLayout(mainLayout)

        QApplication.setStyle(QStyleFactory.create("cleanlooks"))
        self.setWindowTitle("FK-tiedotin")
        self.setWindowIcon(QtGui.QIcon('templates/fi.png'))

        # Always-on-top mode. Currently does not work on Windows.
        #alwaysOnTopShortcut = QShortcut(QtGui.QKeySequence("Ctrl+O"), self)
        #alwaysOnTopShortcut.activated.connect(lambda:
        #    super(MainWindow, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint))

    def createCategorySelectionGroupBox(self):
        self.languageCheckBox = QCheckBox("Text in English", self)
        self.languageCheckBox.stateChanged.connect(
            self.languageCheckBoxClicked)

        self.toBothBulletinsCheckBox = QCheckBox("Add to both versions", self)

        categorySelectionGroupBox = QGroupBox("Category")
        self.categorySelectionButtonGroup = QButtonGroup()

        self.radioButton1 = QRadioButton("Killan tapahtumat")
        self.radioButton2 = QRadioButton("Muut tapahtumat")
        self.radioButton3 = QRadioButton("Yleistä")
        self.radioButton4 = QRadioButton("Opinnot")
        self.radioButton1.setChecked(True)

        self.categorySelectionButtonGroup.addButton(self.radioButton1)
        self.categorySelectionButtonGroup.addButton(self.radioButton2)
        self.categorySelectionButtonGroup.addButton(self.radioButton3)
        self.categorySelectionButtonGroup.addButton(self.radioButton4)

        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(self.radioButton1)
        buttonLayout.addWidget(self.radioButton2)
        buttonLayout.addWidget(self.radioButton3)
        buttonLayout.addWidget(self.radioButton4)
        categorySelectionGroupBox.setLayout(buttonLayout)

        self.dateEdit = QDateEdit()
        self.dateEdit.setDateTime(QDateTime.currentDateTime())
        self.dateEdit.setCalendarPopup(True)

        dateLabel = QLabel("Date")
        dateLabel.setBuddy(self.dateEdit)

        self.categorySelectionLayout = QVBoxLayout()
        self.categorySelectionLayout.addWidget(self.languageCheckBox)
        self.categorySelectionLayout.addWidget(self.toBothBulletinsCheckBox)
        self.categorySelectionLayout.addWidget(categorySelectionGroupBox)
        self.categorySelectionLayout.addWidget(dateLabel)
        self.categorySelectionLayout.addWidget(self.dateEdit)

    def otherLanguageText(self, text):  # convert to dictionary

        if (text == "Guild's events"):
            return "Killan tapahtumat"
        elif (text == "Killan tapahtumat"):
            return "Guild's events"
        elif (text == "Other events"):
            return "Muut tapahtumat"
        elif (text == "Muut tapahtumat"):
            return "Other events"
        elif (text == "General"):
            return "Yleistä"
        elif (text == "Yleistä"):
            return "General"
        elif (text == "Studies"):
            return "Opinnot"
        elif (text == "Opinnot"):
            return "Studies"
        else:
            raise Exception("Wrong value for otherLanguageText")
        """
        categoriesDict_en = {
            "Guild's events":"Killan tapahtumat",
            "Other events":"Muut tapahtumat",
            "General":"Yleistä",
            "Studies":"Opinnot"
        }

        categoriesDict_fi = dict(reversed(item) for item in categoriesDict_en.items())
        categoriesDict = dict(categoriesDict_en, categoriesDict_fi)

        try:
            return categoriesDict(text)
        except ValueError:
            raise Exception("Wrong value for otherLanguageText")
        """

    def languageCheckBoxClicked(self, state):
        if state == QtCore.Qt.Checked:
            self.radioButton1.setText("Guild's events")
            self.radioButton2.setText("Other events")
            self.radioButton3.setText("General")
            self.radioButton4.setText("Studies")
        else:
            self.radioButton1.setText("Killan tapahtumat")
            self.radioButton2.setText("Muut tapahtumat")
            self.radioButton3.setText("Yleistä")
            self.radioButton4.setText("Opinnot")

    #def hide(self):
    #    self.headerLineEdit.hide()
    #    self.textBrowser = QTextBrowser()
    #    self.textBrowser.setGeometry(QtCore.QRect(390, 10, 531, 681))
    #    self.textBrowser.setObjectName("textBrowser")
    #    self.textBrowser.show()

    def createTextEditLayout(self):
        self.textEditLayout = QVBoxLayout()

        self.additionalWeeksEdit = QLineEdit()
        self.additionalWeeksEdit.setText("0")  # default
        self.headerLineEdit = QLineEdit()
        self.imageUrl = QLineEdit()
        self.contentTextEdit = QTextEdit()

        addWeeksLabel = QLabel("Additional weeks")
        addWeeksLabel.setBuddy(self.additionalWeeksEdit)
        headerLabel = QLabel("Header")
        headerLabel.setBuddy(self.headerLineEdit)
        imageUrlLabel = QLabel("Image URL")
        imageUrlLabel.setBuddy(self.imageUrl)
        contentLabel = QLabel("Content")
        contentLabel.setBuddy(self.contentTextEdit)

        self.textEditLayout.addWidget(addWeeksLabel)
        self.textEditLayout.addWidget(self.additionalWeeksEdit)
        self.textEditLayout.addWidget(headerLabel)
        self.textEditLayout.addWidget(self.headerLineEdit)
        self.textEditLayout.addWidget(imageUrlLabel)
        self.textEditLayout.addWidget(self.imageUrl)
        self.textEditLayout.addWidget(contentLabel)
        self.textEditLayout.addWidget(self.contentTextEdit)

    def createButtonLayout(self):
        self.buttonLayout = QHBoxLayout()

        savePushButton = QPushButton("Save")
        savePushButton.clicked.connect(self.save)

        clearPushButton = QPushButton("Clear")
        clearPushButton.clicked.connect(self.clear)

        self.buttonLayout.addWidget(clearPushButton)
        self.buttonLayout.addStretch(1)
        self.buttonLayout.addWidget(savePushButton)

    def save(self):
        category = self.categorySelectionButtonGroup.checkedButton().text()
        date = [
            self.dateEdit.date().day(),
            self.dateEdit.date().month(),
            self.dateEdit.date().year()
        ]
        weeks = int(self.additionalWeeksEdit.text())
        header = self.headerLineEdit.text().strip()
        image = self.imageUrl.text()
        content = self.contentTextEdit.toPlainText()

        save_entry(
            {
                'category': category,
                'date': date,
                'header': header,
                'image': image,
                'content': content
            }, self.languageCheckBox.isChecked(), weeks)

        if self.toBothBulletinsCheckBox.isChecked():
            save_entry(
                {
                    'category': self.otherLanguageText(
                        category),  # both languages fix here
                    'date': date,
                    'header': header,
                    'image': image,
                    'content': content
                },
                not self.languageCheckBox.isChecked(),
                weeks)

        self.clear()

    def clear(self):
        self.headerLineEdit.clear()
        self.imageUrl.clear()
        self.contentTextEdit.clear()
        self.languageCheckBox.setCheckState(0)
        self.toBothBulletinsCheckBox.setCheckState(0)
        self.dateEdit.setDateTime(QDateTime.currentDateTime())
Esempio n. 56
0
class AddressBook(QWidget):
    NavigationMode, AddingMode, EditingMode = range(3)

    def __init__(self, parent=None):
        super(AddressBook, self).__init__(parent)

        self.contacts = SortedDict()
        self.oldName = ''
        self.oldAddress = ''
        self.currentMode = self.NavigationMode

        nameLabel = QLabel("Name:")
        self.nameLine = QLineEdit()
        self.nameLine.setReadOnly(True)

        addressLabel = QLabel("Address:")
        self.addressText = QTextEdit()
        self.addressText.setReadOnly(True)

        self.addButton = QPushButton("&Add")
        self.addButton.show()
        self.editButton = QPushButton("&Edit")
        self.editButton.setEnabled(False)
        self.removeButton = QPushButton("&Remove")
        self.removeButton.setEnabled(False)
        self.findButton = QPushButton("&Find")
        self.findButton.setEnabled(False)
        self.submitButton = QPushButton("&Submit")
        self.submitButton.hide()
        self.cancelButton = QPushButton("&Cancel")
        self.cancelButton.hide()

        self.nextButton = QPushButton("&Next")
        self.nextButton.setEnabled(False)
        self.previousButton = QPushButton("&Previous")
        self.previousButton.setEnabled(False)

        self.loadButton = QPushButton("&Load...")
        self.loadButton.setToolTip("Load contacts from a file")
        self.saveButton = QPushButton("Sa&ve...")
        self.saveButton.setToolTip("Save contacts to a file")
        self.saveButton.setEnabled(False)

        self.exportButton = QPushButton("Ex&port")
        self.exportButton.setToolTip("Export as vCard")
        self.exportButton.setEnabled(False)

        self.dialog = FindDialog()

        self.addButton.clicked.connect(self.addContact)
        self.submitButton.clicked.connect(self.submitContact)
        self.editButton.clicked.connect(self.editContact)
        self.removeButton.clicked.connect(self.removeContact)
        self.findButton.clicked.connect(self.findContact)
        self.cancelButton.clicked.connect(self.cancel)
        self.nextButton.clicked.connect(self.next)
        self.previousButton.clicked.connect(self.previous)
        self.loadButton.clicked.connect(self.loadFromFile)
        self.saveButton.clicked.connect(self.saveToFile)
        self.exportButton.clicked.connect(self.exportAsVCard)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(self.addButton)
        buttonLayout1.addWidget(self.editButton)
        buttonLayout1.addWidget(self.removeButton)
        buttonLayout1.addWidget(self.findButton)
        buttonLayout1.addWidget(self.submitButton)
        buttonLayout1.addWidget(self.cancelButton)
        buttonLayout1.addWidget(self.loadButton)
        buttonLayout1.addWidget(self.saveButton)
        buttonLayout1.addWidget(self.exportButton)
        buttonLayout1.addStretch()

        buttonLayout2 = QHBoxLayout()
        buttonLayout2.addWidget(self.previousButton)
        buttonLayout2.addWidget(self.nextButton)

        mainLayout = QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addLayout(buttonLayout1, 1, 2)
        mainLayout.addLayout(buttonLayout2, 2, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("Simple Address Book")

    def addContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.nameLine.clear()
        self.addressText.clear()

        self.updateInterface(self.AddingMode)

    def editContact(self):
        self.oldName = self.nameLine.text()
        self.oldAddress = self.addressText.toPlainText()

        self.updateInterface(self.EditingMode)

    def submitContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name == "" or address == "":
            QMessageBox.information(self, "Empty Field",
                    "Please enter a name and address.")
            return

        if self.currentMode == self.AddingMode:
            if name not in self.contacts:
                self.contacts[name] = address
                QMessageBox.information(self, "Add Successful",
                        "\"%s\" has been added to your address book." % name)
            else:
                QMessageBox.information(self, "Add Unsuccessful",
                        "Sorry, \"%s\" is already in your address book." % name)
                return

        elif self.currentMode == self.EditingMode:
            if self.oldName != name:
                if name not in self.contacts:
                    QMessageBox.information(self, "Edit Successful",
                            "\"%s\" has been edited in your address book." % self.oldName)
                    del self.contacts[self.oldName]
                    self.contacts[name] = address
                else:
                    QMessageBox.information(self, "Edit Unsuccessful",
                            "Sorry, \"%s\" is already in your address book." % name)
                    return
            elif self.oldAddress != address:
                QMessageBox.information(self, "Edit Successful",
                        "\"%s\" has been edited in your address book." % name)
                self.contacts[name] = address

        self.updateInterface(self.NavigationMode)

    def cancel(self):
        self.nameLine.setText(self.oldName)
        self.addressText.setText(self.oldAddress)
        self.updateInterface(self.NavigationMode)

    def removeContact(self):
        name = self.nameLine.text()
        address = self.addressText.toPlainText()

        if name in self.contacts:
            button = QMessageBox.question(self, "Confirm Remove",
                    "Are you sure you want to remove \"%s\"?" % name,
                    QMessageBox.Yes | QMessageBox.No)

            if button == QMessageBox.Yes:
                self.previous()
                del self.contacts[name]

                QMessageBox.information(self, "Remove Successful",
                        "\"%s\" has been removed from your address book." % name)

        self.updateInterface(self.NavigationMode)

    def next(self):
        name = self.nameLine.text()
        it = iter(self.contacts)

        try:
            while True:
                this_name, _ = it.next()

                if this_name == name:
                    next_name, next_address = it.next()
                    break
        except StopIteration:
            next_name, next_address = iter(self.contacts).next()

        self.nameLine.setText(next_name)
        self.addressText.setText(next_address)

    def previous(self):
        name = self.nameLine.text()

        prev_name = prev_address = None
        for this_name, this_address in self.contacts:
            if this_name == name:
                break

            prev_name = this_name
            prev_address = this_address
        else:
            self.nameLine.clear()
            self.addressText.clear()
            return

        if prev_name is None:
            for prev_name, prev_address in self.contacts:
                pass

        self.nameLine.setText(prev_name)
        self.addressText.setText(prev_address)

    def findContact(self):
        self.dialog.show()

        if self.dialog.exec_() == QDialog.Accepted:
            contactName = self.dialog.getFindText()

            if contactName in self.contacts:
                self.nameLine.setText(contactName)
                self.addressText.setText(self.contacts[contactName])
            else:
                QMessageBox.information(self, "Contact Not Found",
                        "Sorry, \"%s\" is not in your address book." % contactName)
                return

        self.updateInterface(self.NavigationMode)

    def updateInterface(self, mode):
        self.currentMode = mode

        if self.currentMode in (self.AddingMode, self.EditingMode):
            self.nameLine.setReadOnly(False)
            self.nameLine.setFocus(Qt.OtherFocusReason)
            self.addressText.setReadOnly(False)

            self.addButton.setEnabled(False)
            self.editButton.setEnabled(False)
            self.removeButton.setEnabled(False)

            self.nextButton.setEnabled(False)
            self.previousButton.setEnabled(False)

            self.submitButton.show()
            self.cancelButton.show()

            self.loadButton.setEnabled(False)
            self.saveButton.setEnabled(False)
            self.exportButton.setEnabled(False)

        elif self.currentMode == self.NavigationMode:
            if not self.contacts:
                self.nameLine.clear()
                self.addressText.clear()

            self.nameLine.setReadOnly(True)
            self.addressText.setReadOnly(True)
            self.addButton.setEnabled(True)

            number = len(self.contacts)
            self.editButton.setEnabled(number >= 1)
            self.removeButton.setEnabled(number >= 1)
            self.findButton.setEnabled(number > 2)
            self.nextButton.setEnabled(number > 1)
            self.previousButton.setEnabled(number >1 )

            self.submitButton.hide()
            self.cancelButton.hide()

            self.exportButton.setEnabled(number >= 1)

            self.loadButton.setEnabled(True)
            self.saveButton.setEnabled(number >= 1)

    def saveToFile(self):
        fileName, _ = QFileDialog.getSaveFileName(self, "Save Address Book",
                '', "Address Book (*.abk);;All Files (*)")

        if not fileName:
            return

        try:
            out_file = open(str(fileName), 'wb')
        except IOError:
            QMessageBox.information(self, "Unable to open file",
                    "There was an error opening \"%s\"" % fileName)
            return

        pickle.dump(self.contacts, out_file)
        out_file.close()

    def loadFromFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Address Book",
                '', "Address Book (*.abk);;All Files (*)")

        if not fileName:
            return

        try:
            in_file = open(str(fileName), 'rb')
        except IOError:
            QMessageBox.information(self, "Unable to open file",
                    "There was an error opening \"%s\"" % fileName)
            return

        self.contacts = pickle.load(in_file)
        in_file.close()

        if len(self.contacts) == 0:
            QMessageBox.information(self, "No contacts in file",
                    "The file you are attempting to open contains no "
                    "contacts.")
        else:
            for name, address in self.contacts:
                self.nameLine.setText(name)
                self.addressText.setText(address)

        self.updateInterface(self.NavigationMode)

    def exportAsVCard(self):
        name = str(self.nameLine.text())
        address = self.addressText.toPlainText()

        nameList = name.split()

        if len(nameList) > 1:
            firstName = nameList[0]
            lastName = nameList[-1]
        else:
            firstName = name
            lastName = ''

        fileName, _ = QFileDialog.getSaveFileName(self, "Export Contact", '',
                "vCard Files (*.vcf);;All Files (*)")

        if not fileName:
            return

        out_file = QFile(fileName)

        if not out_file.open(QIODevice.WriteOnly):
            QMessageBox.information(self, "Unable to open file",
                    out_file.errorString())
            return

        out_s = QTextStream(out_file)

        out_s << 'BEGIN:VCARD' << '\n'
        out_s << 'VERSION:2.1' << '\n'
        out_s << 'N:' << lastName << ';' << firstName << '\n'
        out_s << 'FN:' << ' '.join(nameList) << '\n'

        address.replace(';', '\\;')
        address.replace('\n', ';')
        address.replace(',', ' ')

        out_s << 'ADR;HOME:;' << address << '\n'
        out_s << 'END:VCARD' << '\n'

        QMessageBox.information(self, "Export Successful",
                "\"%s\" has been exported as a vCard." % name)
Esempio n. 57
0
class VGenesTextMain(QMainWindow):
    def __init__(self):
        super(VGenesTextMain, self).__init__()
        self.setupUi()

    def setupUi(self):

        self.curFile = ''

        self.textEdit = QTextEdit()
        self.textEdit.setTextInteractionFlags(Qt.TextEditorInteraction)
        self.setCentralWidget(self.textEdit)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()

        self.readSettings()

        self.textEdit.document().contentsChanged.connect(self.documentWasModified)

        self.setCurrentFile('')

    def closeEvent(self, event):
        if self.maybeSave():
            self.writeSettings()
            event.accept()
        else:
            event.ignore()

    def newFile(self):
        if self.maybeSave():
            self.textEdit.clear()
            self.setCurrentFile('')

    def open(self):
        if self.maybeSave():
            fileName, _ = QFileDialog.getOpenFileName(self)
            if fileName:
                self.loadFile(fileName)

    def print_(self):
        document = self.textEdit.document()
        printer = QPrinter()

        dlg = QPrintDialog(printer, self)
        if dlg.exec_() != QDialog.Accepted:
            return

        document.print_(printer)

        self.statusBar().showMessage("Ready", 2000)

    def save(self):
        if self.curFile:
            return self.saveFile(self.curFile)

        return self.saveAs()

    def saveAs(self):
        fileName, _ = QFileDialog.getSaveFileName(self)
        if fileName:
            return self.saveFile(fileName)

        return False

    def IncreaseFont(self):
        FontIs = self.textEdit.currentFont()
        font = QFont(FontIs)

        FontSize = int(font.pointSize())
        FontFam = font.family()
        if FontSize < 36:
            FontSize += 1
        font.setPointSize(FontSize)
        font.setFamily(FontFam)

        self.textEdit.setFont(font)

    def DecreaseFont(self):
        FontIs = self.textEdit.currentFont()
        font = QFont(FontIs)

        FontSize = int(font.pointSize())
        FontFam = font.family()
        if FontSize > 6:
            FontSize -= 1
        font.setPointSize(FontSize)
        font.setFamily(FontFam)

        self.textEdit.setFont(font)

    def about(self):
        QMessageBox.about(self, "About VGenes Text Editor",
                "The <b>VGenes Text Editor</b> allows "
                "you to edit, save, and print documents "
                "generated by VGenes.")

    def documentWasModified(self):
        self.setWindowModified(self.textEdit.document().isModified())

    def createActions(self):
        self.newAct = QAction(QIcon(':/PNG-Icons/page.png'), "&New", self,
                shortcut=QKeySequence.New, statusTip="Create a new file",
                triggered=self.newFile)

        self.openAct = QAction(QIcon(':/PNG-Icons/folder.png'), "&Open...", self,
                shortcut=QKeySequence.Open, statusTip="Open an existing file",
                triggered=self.open)

        self.saveAct = QAction(QIcon(':/PNG-Icons/SaveIcon.png'), "&Save", self,
                shortcut=QKeySequence.Save,
                statusTip="Save the document to disk", triggered=self.save)

        self.saveAsAct = QAction("Save &As...", self,
                shortcut=QKeySequence.SaveAs,
                statusTip="Save the document under a new name",
                triggered=self.saveAs)

        self.closeAct = QAction("Close", self, shortcut=QKeySequence.Close,
                statusTip="Close window", triggered=self.close)

        self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
                statusTip="Exit VGenes Text Editor", triggered=self.close)



        self.cutAct = QAction(QIcon(':/PNG-Icons/scissor.png'), "Cu&t", self,
                shortcut=QKeySequence.Cut,
                statusTip="Cut the current selection's contents to the clipboard",
                triggered=self.textEdit.cut)

        self.IncreaseAct = QAction(QIcon(':/PNG-Icons/plus.png'), "&Increase", self,
                statusTip="Increase font size",
                triggered=self.IncreaseFont)

        self.DecreaseAct = QAction(QIcon(':/PNG-Icons/minus.png'), "&Decrease", self,
                statusTip="Decrease font size",
                triggered=self.DecreaseFont)

        self.printAct = QAction(QIcon(':/PNG-Icons/print.png'), "&Print...", self,
                shortcut=QKeySequence.Print,
                statusTip="Print the current form letter",
                triggered=self.print_)

        self.copyAct = QAction(QIcon(':/PNG-Icons/pages.png'), "&Copy", self,
                shortcut=QKeySequence.Copy,
                statusTip="Copy the current selection's contents to the clipboard",
                triggered=self.textEdit.copy)

        self.pasteAct = QAction(QIcon(':/PNG-Icons/Paste.png'), "&Paste", self,
                shortcut=QKeySequence.Paste,
                statusTip="Paste the clipboard's contents into the current selection",
                triggered=self.textEdit.paste)

        self.aboutAct = QAction("&About", self,
                statusTip="Show the application's About box",
                triggered=self.about)

        # self.aboutQtAct = QAction("About &Qt", self,
        #         statusTip="Show the Qt library's About box",
        #         triggered=QApplication.instance().aboutQt)

        self.cutAct.setEnabled(False)
        self.copyAct.setEnabled(False)
        self.textEdit.copyAvailable.connect(self.cutAct.setEnabled)
        self.textEdit.copyAvailable.connect(self.copyAct.setEnabled)

    def createMenus(self):

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 1029, 22))
        self.menubar.setDefaultUp(False)
        self.menubar.setNativeMenuBar(False)
        self.menubar.setObjectName("menubar")
        self.menuFile = QMenu(self.menubar)


        self.setMenuBar(self.menubar)



        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.closeAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addAction(self.printAct)
        self.fileMenu.addSeparator();
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        # self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.closeACT)
        self.fileToolBar.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileToolBar.addAction(self.printAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

        self.FontSizeToolBar = self.addToolBar("FontSize")
        self.FontSizeToolBar.addAction(self.IncreaseAct)
        self.FontSizeToolBar.addAction(self.DecreaseAct)


    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings("Trolltech", "VGenes Text Editor")
        pos = settings.value("pos", QPoint(200, 200))
        size = settings.value("size", QSize(400, 400))
        self.resize(size)
        self.move(pos)

    def writeSettings(self):
        settings = QSettings("Trolltech", "VGenes Text Editor")
        settings.setValue("pos", self.pos())
        settings.setValue("size", self.size())

    def maybeSave(self):
        if self.textEdit.document().isModified():
            ret = QMessageBox.warning(self, "VGenes Text Editor",
                    "The document has been modified.\nDo you want to save "
                    "your changes?",
                    QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)

            if ret == QMessageBox.Save:
                return self.save()

            if ret == QMessageBox.Cancel:
                return False

        return True

    def loadFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.ReadOnly | QFile.Text):
            QMessageBox.warning(self, "VGenes Text Editor",
                    "Cannot read file %s:\n%s." % (fileName, file.errorString()))
            return

        inf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        self.textEdit.setPlainText(inf.readAll())
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName)
        self.statusBar().showMessage("File loaded", 2000)

    def saveFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.WriteOnly | QFile.Text):
            QMessageBox.warning(self, "VGenes Text Editor",
                    "Cannot write file %s:\n%s." % (fileName, file.errorString()))
            return False

        outf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        outf << self.textEdit.toPlainText()
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName);
        self.statusBar().showMessage("File saved", 2000)
        return True

    def setCurrentFile(self, fileName):
        self.curFile = fileName
        self.textEdit.document().setModified(False)
        self.setWindowModified(False)

        if self.curFile:
            shownName = self.strippedName(self.curFile)
        else:
            shownName = 'untitled.txt'

        self.setWindowTitle("%s[*] - VGenes Text Editor" % shownName)

    def strippedName(self, fullFileName):
        return QFileInfo(fullFileName).fileName()