Esempio n. 1
0
	def resizeEvent(self, event):
		QTextEdit.resizeEvent(self, event)
		rect = self.contentsRect()
		self.resized.emit(rect)
		self.lineNumberArea.setGeometry(rect.left(), rect.top(),
			self.lineNumberAreaWidth(), rect.height())
		self.infoArea.updateTextAndGeometry()
Esempio n. 2
0
class Window(QWidget):

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

        # Make widgets #################

        self.edit = QTextEdit()
        self.btn = QPushButton("Print")

        self.edit.setPlaceholderText("Type something here and press the 'Print' button")

        # Set button slot ##############

        self.btn.clicked.connect(self.printText)

        # Set the layout ###############

        vbox = QVBoxLayout()

        vbox.addWidget(self.edit)
        vbox.addWidget(self.btn)

        self.setLayout(vbox)

    def printText(self):
        print(self.edit.toPlainText())
Esempio n. 3
0
	def contextMenuEvent(self, event):
		text = self.toPlainText()
		dictionary = self.tab.highlighter.dictionary
		if (dictionary is None) or not text:
			return QTextEdit.contextMenuEvent(self, event)
		oldcursor = self.textCursor()
		cursor = self.cursorForPosition(event.pos())
		pos = cursor.positionInBlock()
		if pos == len(text):
			pos -= 1
		curchar = text[pos]
		isalpha = curchar.isalpha()
		cursor.select(QTextCursor.WordUnderCursor)
		if not isalpha or (oldcursor.hasSelection() and
		oldcursor.selectedText() != cursor.selectedText()):
			return QTextEdit.contextMenuEvent(self, event)
		self.setTextCursor(cursor)
		word = cursor.selectedText()
		if not word or dictionary.check(word):
			self.setTextCursor(oldcursor)
			return QTextEdit.contextMenuEvent(self, event)
		suggestions = dictionary.suggest(word)
		actions = [self.parent.act(sug, trig=self.fixWord(sug)) for sug in suggestions]
		menu = self.createStandardContextMenu()
		menu.insertSeparator(menu.actions()[0])
		for action in actions[::-1]:
			menu.insertAction(menu.actions()[0], action)
		menu.exec(event.globalPos())
Esempio n. 4
0
    def __init__(self, Wizard, parent=None):
        super(ScriptsPage, self).__init__(parent)

        self.base = Wizard.base

        self.setTitle(self.tr("Scripts page"))
        self.setSubTitle(self.tr("Write scripts"))

        prepareLabel = QLabel("%prepare: ")
        self.prepareEdit = QTextEdit()

        buildLabel = QLabel("%build: ")
        self.buildEdit = QTextEdit()

        installLabel = QLabel("%install: ")
        self.installEdit = QTextEdit()

        checkLabel = QLabel("%check: ")
        self.checkEdit = QTextEdit()

        buildArchLabel = QLabel("BuildArch: ")
        self.buildArchCheckbox = QCheckBox("noarch")

        grid = QGridLayout()
        grid.addWidget(prepareLabel, 0, 0)
        grid.addWidget(self.prepareEdit, 0, 1)
        grid.addWidget(buildLabel, 1, 0)
        grid.addWidget(self.buildEdit, 1, 1)
        grid.addWidget(installLabel, 2, 0)
        grid.addWidget(self.installEdit, 2, 1)
        grid.addWidget(checkLabel, 3, 0)
        grid.addWidget(self.checkEdit, 3, 1)
        grid.addWidget(buildArchLabel, 4, 0)
        grid.addWidget(self.buildArchCheckbox, 4, 1)
        self.setLayout(grid)
Esempio n. 5
0
	def keyPressEvent(self, event):
		key = event.key()
		cursor = self.textCursor()
		if key == Qt.Key_Backspace and event.modifiers() & Qt.GroupSwitchModifier:
			# Workaround for https://bugreports.qt.io/browse/QTBUG-49771
			event = QKeyEvent(event.type(), event.key(),
				event.modifiers() ^ Qt.GroupSwitchModifier)
		if key == Qt.Key_Tab:
			documentIndentMore(self.document(), cursor)
		elif key == Qt.Key_Backtab:
			documentIndentLess(self.document(), cursor)
		elif key == Qt.Key_Return and not cursor.hasSelection():
			if event.modifiers() & Qt.ShiftModifier:
				# Insert Markdown-style line break
				markupClass = self.tab.getActiveMarkupClass()
				if markupClass == MarkdownMarkup:
					cursor.insertText('  ')
			if event.modifiers() & Qt.ControlModifier:
				cursor.insertText('\n')
				self.ensureCursorVisible()
			else:
				self.handleReturn(cursor)
		else:
			if event.text() and self.tableModeEnabled:
				cursor.beginEditBlock()
			QTextEdit.keyPressEvent(self, event)
			if event.text() and self.tableModeEnabled:
				cursor.endEditBlock()
Esempio n. 6
0
	def initUI(self):
		self.label1 = QLabel("待转换内容:(字符以空格或回车分隔)")
		self.label2 = QLabel("转换结果:")

		self.text1 = QTextEdit(EXAMPLE_1)
		self.text1.setAcceptRichText(False)
		self.text2 = QTextEdit(EXAMPLE_2)
		self.text2.setAcceptRichText(False)
		self.btn1 = QPushButton('转换')
		self.btn1.resize(10,10)

		grid = QGridLayout()
		grid.setSpacing(10)

		grid.addWidget(self.label1,1,0)
		grid.addWidget(self.label2,1,1)
		grid.addWidget(self.text1,2,0)
		grid.addWidget(self.text2,2,1)
		grid.addWidget(self.btn1,2,2)

		self.setLayout(grid)

		# 按钮连接到槽
		self.btn1.clicked.connect(self.buttonClicked)

		self.setGeometry(200,300,600,350)
		self.setWindowTitle('短信字符转换')
		self.show()
Esempio n. 7
0
    def createBottomLeftTabWidget(self):
        self.bottomLeftTabWidget = QTabWidget()
        self.bottomLeftTabWidget.setSizePolicy(QSizePolicy.Preferred,
                QSizePolicy.Ignored)

        tab1 = QWidget()
        tableWidget = QTableWidget(10, 10)

        tab1hbox = QHBoxLayout()
        tab1hbox.setContentsMargins(5, 5, 5, 5)
        tab1hbox.addWidget(tableWidget)
        tab1.setLayout(tab1hbox)

        tab2 = QWidget()
        textEdit = QTextEdit()

        textEdit.setPlainText("Twinkle, twinkle, little star,\n"
                              "How I wonder what you are.\n" 
                              "Up above the world so high,\n"
                              "Like a diamond in the sky.\n"
                              "Twinkle, twinkle, little star,\n" 
                              "How I wonder what you are!\n")

        tab2hbox = QHBoxLayout()
        tab2hbox.setContentsMargins(5, 5, 5, 5)
        tab2hbox.addWidget(textEdit)
        tab2.setLayout(tab2hbox)

        self.bottomLeftTabWidget.addTab(tab1, "&Table")
        self.bottomLeftTabWidget.addTab(tab2, "Text &Edit")
Esempio n. 8
0
	def __init__(self):
		super(Dialog, self).__init__()

		self.createMenu()

		self.widget_register_url()
		self.widget_download()
		self.thread_download = threading.Thread( group=None, target=self.run_downloader, name=None, args=(), kwargs={}, daemon=True )
		self.running = False

		bigEditor = QTextEdit()
		bigEditor.setPlainText("This widget takes up all the remaining space "
				"in the top-level layout.")

		buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

		buttonBox.accepted.connect(self.accept)
		buttonBox.rejected.connect(self.reject)

		mainLayout = QVBoxLayout()
		mainLayout.setMenuBar(self.menuBar)

		mainLayout.addWidget(self.form_register_url)
		mainLayout.addWidget(self.form_download_urls)

		self.setLayout(mainLayout)

		self.setWindowTitle("Bamboodl")
Esempio n. 9
0
	def __init__(self):
		super().__init__()
		self.inputText = QTextEdit()
		self.outputText = QTextEdit()
		self.outputText2 = QTextEdit()
		self.runButton = QPushButton('分解')
		self.init_ui()
Esempio n. 10
0
 def keyPressEvent(self, event):
     if event.modifiers() & Qt.ControlModifier:
         handled = False
         if event.key() == Qt.Key_Q:
             self.stopSpellchecker()
             handled = True
         elif event.key() == Qt.Key_E:
             self.initSpellchecker()
             handled = True
         elif event.key() == Qt.Key_F1:
             self.toCaps()
             handled = True
         elif event.key() == Qt.Key_F2:
             self.removeEOL()
             handled = True
         elif event.key() == Qt.Key_O and event.modifiers() & \
                 Qt.AltModifier:
             self.openFile()
             handled = True
         else:
             return QTextEdit.keyPressEvent(self, event)
         if handled:
             event.accept()
             return
     else:
         QTextEdit.keyPressEvent(self, event)
Esempio n. 11
0
class window(QWidget):
    def __init__(self):
        super().__init__()
        self.grid = QGridLayout()
        self.text = QTextEdit()
        self.btn = QPushButton()
        self.btn.setText('Send')
        self.btn.clicked.connect(self.sendMessage)
        self.message = QLineEdit()

        self.grid.addWidget(self.text,1,1,2,2)
        self.grid.addWidget(self.message,3,1,1,1)
        self.grid.addWidget(self.btn,3,2,1,1)

        self.setLayout(self.grid)

        self.updateThread = updateThread()
        self.updateThread.signal.connect(self.updateMessages, Qt.QueuedConnection)
        self.updateThread.start()

    def sendMessage(self, signal):
        client.sendMessage(self.message.text())

    def updateMessages(self, signal):
        self.text.append(signal)
Esempio n. 12
0
    def initUI(self):
        self.dialoga()
        self.sendamessage = QLabel("Send:")
        self.tray_icon = SystemTrayIcon(QtGui.QIcon("Outki.ico"), self)
        self.tray_icon.show()
        self.messageEdit = QLineEdit()
        global messageBox
        messageBox = QTextEdit()
        messageBox.setReadOnly(True)
        self.sendButton = QPushButton("Send")

        grid = QGridLayout()
        grid.setSpacing(1)

        grid.addWidget(messageBox, 1, 0, 2, 4)
        grid.addWidget(self.sendamessage, 3, 0, 4, 0)
        grid.addWidget(self.messageEdit, 3, 1, 4, 2)
        grid.addWidget(self.sendButton, 3, 3, 4, 3)

        self.setLayout(grid)
        self.sendButton.clicked.connect(self.send)
        self.messageEdit.returnPressed.connect(self.send)
        threade = ThreadingExample()
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle("Outki")
        self.setWindowIcon(QIcon("Outki.ico"))
        self.show()
Esempio n. 13
0
    def __init__(self, filename):
        super().__init__()

        self.setGeometry(20, 20, 1324, 1068)
        self.setWindowTitle('qt-Notepad')
        self.setStyleSheet('font-size: 14pt; font-family: Courier;')

        self.show()
        self.init_ui()
        centralWidget = QWidget()
        self.tabs = QTabWidget(centralWidget)
        self.setCentralWidget(self.tabs)
        self.tabs.setTabsClosable(True)
        self.tabs.setMovable(True)
        self.tabs.tabCloseRequested.connect(self.closeTab)
        if filename:
            f = open(filename, 'r')
            filedata = f.read()
            f.close()
            newfile = QTextEdit()
            newfile.setText(filedata)
            i = self.tabs.addTab(newfile, filename)
            self.tabs.setCurrentIndex(i)
        else:
            self.open_file()
Esempio n. 14
0
    def __init__(self, Wizard, parent=None):
        super(RequiresPage, self).__init__(parent)

        self.base = Wizard.base

        self.setTitle(self.tr("Requires page"))
        self.setSubTitle(self.tr("Write requires and provides"))

        buildRequiresLabel = QLabel("BuildRequires: ")
        self.bRequiresEdit = QTextEdit()
        self.bRequiresEdit.setMaximumHeight(220)

        requiresLabel = QLabel("Requires: ")
        self.requiresEdit = QTextEdit()
        self.requiresEdit.setMaximumHeight(220)

        providesLabel = QLabel("Provides: ")
        self.providesEdit = QTextEdit()

        grid = QGridLayout()
        grid.addWidget(buildRequiresLabel, 0, 0)
        grid.addWidget(self.bRequiresEdit, 1, 0)
        grid.addWidget(requiresLabel, 2, 0)
        grid.addWidget(self.requiresEdit, 3, 0,)
        grid.addWidget(providesLabel, 4, 0)
        grid.addWidget(self.providesEdit, 5, 0)
        self.setLayout(grid)
Esempio n. 15
0
def show():
    dialog = QDialog()
    dialog.setWindowTitle("Oops!")

    layout = QVBoxLayout(dialog)

    label = QLabel(dialog)
    layout.addWidget(label)
    label.setText("<p>An uncaught exception has occurred!</p><p>Please use the information below to post a bug report at <a href=\"http://github.com/Ultimaker/Cura/issues\">http://github.com/Ultimaker/Cura/issues</a></p>")

    textarea = QTextEdit(dialog)
    layout.addWidget(textarea)

    try:
        from UM.Application import Application
        version = Application.getInstance().getVersion()
    except:
        version = "Unknown"

    trace = "".join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]))

    crash_info = "Version: {0}\nPlatform: {1}\nQt: {2}\nPyQt: {3}\n\nException:\n{4}"
    crash_info = crash_info.format(version, platform.platform(), QT_VERSION_STR, PYQT_VERSION_STR, trace)

    textarea.setText(crash_info)

    buttons = QDialogButtonBox(QDialogButtonBox.Close, dialog)
    layout.addWidget(buttons)
    buttons.addButton("Open Web Page", QDialogButtonBox.HelpRole)
    buttons.rejected.connect(lambda: dialog.close())
    buttons.helpRequested.connect(lambda: webbrowser.open("http://github.com/Ultimaker/Cura/issues"))

    dialog.exec_()
Esempio n. 16
0
class TextEditDemo(QWidget):
    def __init__(self,parent=None):
        super(TextEditDemo, self).__init__(parent)
        self.setWindowTitle('QTextEdit 例子')

        #定义窗口的初始大小
        self.resize(300,270)
        #创建多行文本框
        self.textEdit=QTextEdit()
        #创建两个按钮
        self.btnPress1=QPushButton('显示文本')
        self.btnPress2=QPushButton('显示HTML')

        #实例化垂直布局
        layout=QVBoxLayout()
        #相关控件添加到垂直布局中
        layout.addWidget(self.textEdit)
        layout.addWidget(self.btnPress1)
        layout.addWidget(self.btnPress2)

        #设置布局
        self.setLayout(layout)

        #将按钮的点击信号与相关的槽函数进行绑定,点击即触发
        self.btnPress1.clicked.connect(self.btnPress1_clicked)
        self.btnPress2.clicked.connect(self.btnPress2_clicked)

    def btnPress1_clicked(self):
        #以文本的形式输出到多行文本框
        self.textEdit.setPlainText('Hello PyQt5!\n单击按钮')

    def btnPress2_clicked(self):
        #以Html的格式输出多行文本框,字体红色,字号6号
        self.textEdit.setHtml("<font color='red' size='6'><red>Hello PyQt5!\n单击按钮。</font>")
Esempio n. 17
0
    def init_text_edit(self):

        """Initialize Text Edits Function

        Following function defines all of the text edits of the app.

        Args:
            QMainWindow object: main window of the app.

        Returns:
            None

        """

        self.russian_text_edit = QTextEdit(self)
        self.russian_text_edit.setPlaceholderText('Введите термин')
        self.russian_text_edit.setStyleSheet(__style__)
        self.russian_text_edit.resize(250, 100)
        self.russian_text_edit.move(20, 20)

        self.english_text_edit = QTextEdit(self)
        self.english_text_edit.setPlaceholderText('Enter term')
        self.english_text_edit.setStyleSheet(__style__)
        self.english_text_edit.resize(250, 100)
        self.english_text_edit.move(330, 20)
Esempio n. 18
0
class OutputWindow(QMainWindow):

    def __init__(self, text):
        super().__init__()
        self.create_output_window(text)

    def create_output_window(self, text):

        self.output = QTextEdit(self)
        self.output.move(150, 25)
        self.output.setReadOnly(True)
        self.output.setGeometry(10, 10, 690, 350)
        self.output.setLineWrapMode(QTextEdit.NoWrap);
        self.output.insertPlainText(text)

        btn1 = QPushButton("Exit", self)
        btn1.setGeometry(40, 365, 200, 35)

        btn1.clicked.connect(self.buttonClicked)

        self.setGeometry(300, 300, 700, 400)
        self.setWindowTitle('Result')
        self.show()

    def buttonClicked(self):
        self.close()
Esempio n. 19
0
 def keyPressEvent(self, event):
     if event.modifiers() & Qt.ControlModifier:
         handled = False
         if event.key() == Qt.Key_B:
             self.toggleBold()
             handled = True
         elif event.key() == Qt.Key_I:
             self.toggleItalic()
             handled = True
         elif event.key() == Qt.Key_K:
             self.colorMenu()
             handled = True
         elif event.key() == Qt.Key_M:
             self.textEffectMenu()
             handled = True
         elif event.key() == Qt.Key_U:
             self.toggleUnderline()
             handled = True
         if handled:
             event.accept()
             return
     if event.key() in (Qt.Key_Enter, Qt.Key_Return):
         self.emit(SIGNAL("returnPressed()"))
         event.accept()
     else:
         QTextEdit.keyPressEvent(self, event)
Esempio n. 20
0
File: qt.py Progetto: asfin/electrum
    def create_signature_tab(self):
        w = QWidget()

        layout = QGridLayout(w)

        message_e = QTextEdit()
        layout.addWidget(QLabel(_('Message')), 1, 0)
        layout.addWidget(message_e, 1, 1)
        layout.setRowStretch(2, 2)

        encrypted_e = QTextEdit()
        encrypted_e.setFont(QFontDatabase.systemFont(QFontDatabase.FixedFont))
        layout.addWidget(QLabel(_('Signed')), 2, 0)
        layout.addWidget(encrypted_e, 2, 1)
        layout.setRowStretch(2, 2)

        hbox = QHBoxLayout()
        b = QPushButton(_('Sign'))
        b.clicked.connect(lambda: self.do_sign(message_e, encrypted_e))
        hbox.addWidget(b)

        b = QPushButton(_('Verify'))
        b.clicked.connect(lambda: self.do_verify(encrypted_e, message_e))
        hbox.addWidget(b)

        layout.addLayout(hbox, 3, 1)
        return w
Esempio n. 21
0
	def init(self):
		self.cpus=multiprocessing.cpu_count()
		
		self.tab.setTabsClosable(True)
		self.tab.setMovable(True)
		self.tab.setTabBar(QHTabBar())
		self.tab.setTabPosition(QTabWidget.West)
		
		self.font = QFont()
		self.font.setFamily('Monospace')
		self.font.setStyleHint(QFont.Monospace)
		self.font.setFixedPitch(True)
		self.font.setPointSize(int(12))

		self.terminals=[]
		self.process=[]
		for i in range(0,self.cpus):
			term=QTextEdit()
			term.setFont(self.font)
			
			pal = QPalette()
			bgc = QColor(0, 0, 0)
			pal.setColor(QPalette.Base, bgc)
			textc = QColor(230, 230, 230)
			pal.setColor(QPalette.Text, textc)
			term.setPalette(pal)

			proc=QProcess(self)
			proc.readyRead.connect(functools.partial(self.dataReady,i))
			self.process.append(proc)
			self.terminals.append(term)
			self.tab.addTab(term,"cpu "+str(i))
    def initUI(self):
        self.textTitle = QLabel('Text to Translate')
        self.textEdit = QTextEdit()
        
        self.binaryTitle = QLabel('Translated text')
        self.binaryEdit = QTextEdit()
        
        self.translateButton = QPushButton('Translate', self)
        self.translateButton.clicked.connect(self.translateData)
        
        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.textTitle)
        self.vbox.addWidget(self.textEdit)
        self.vbox.addWidget(self.binaryTitle)
        self.vbox.addWidget(self.binaryEdit)
        self.vbox.addWidget(self.translateButton)

        self.setLayout(self.vbox)
        
        self.binaryCopy = QShortcut(QKeySequence("Ctrl-C"), self.binaryEdit)
        self.binaryPaste = QShortcut(QKeySequence("Ctrl-V"), self.binaryEdit)
        self.textCopy = QShortcut(QKeySequence("Ctrl-C"), self.textEdit)
        self.textPaste = QShortcut(QKeySequence("Ctrl-V"), self.textEdit)
    
        self.setGeometry(300,300,550,600)
        self.setWindowTitle('Binary Translator')
        self.show()
Esempio n. 23
0
 def mousePressEvent(self, event):
     if event.button() == Qt.RightButton:
         # Rewrite the mouse event to a left button event so the cursor is
         # moved to the location of the pointer.
         event = QMouseEvent(QEvent.MouseButtonPress, event.pos(),
                             Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
     QTextEdit.mousePressEvent(self, event)
Esempio n. 24
0
    def mousePressEvent(self, event):
        QTextEdit.mousePressEvent(self, event)

        cursor = self.cursorForPosition(event.pos())
        columnNumber = cursor.positionInBlock()

        # Limit cursor position to the editable area
        # - TODO: remove hard coded numbers
        if columnNumber < self.addressWidth:
            columnNumber = self.addressWidth
        if columnNumber > 73:
            columnNumber = 73;

        # Not all of the characters displayed in the hex dump area can be edited 
        if columnNumber < 58:
            bytePos = columnNumber - self.addressWidth
            byteIdx = bytePos % 3   # 0, 1, 2 => "7F "
            if byteIdx == 2:
                columnNumber -= 1

        block = cursor.block()      # The current block of the cursor
        cursor.setPosition(block.position() + columnNumber)

        self.setTextCursor(cursor)

        self.viewport().update()    # necessary to get the right coordinates in the paint event
Esempio n. 25
0
class ProprietesAvance(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self, parent)
        self.parent = parent
        self.objets = parent.objets
        self.panel = self.parent.parent.panel
        self.canvas = self.parent.parent.canvas
        self.islabel = self.parent.parent.islabel

        self.sizer = QVBoxLayout()
        if len(self.objets) is 1:
            self.objet = self.objets[0]

            style = QVBoxLayout()
            style_box = QGroupBox("Style de l'objet")
            style_box.setLayout(style)
            style.addWidget(QLabel("<span style='color:red;font-style:italic;'>Attention, ne modifiez ce contenu que si vous savez ce que vous faites.</span>"))
            self.avance = QTextEdit()
            self.avance.setMinimumSize(350, 200)
            self.actualiser()
            style.addWidget(self.avance)
            self.sizer.addWidget(style_box)

            ok = QPushButton('OK')
            appliquer = QPushButton("Appliquer")
            actualiser = QPushButton("Actualiser")
            ok.clicked.connect(self.EvtOk)
            appliquer.clicked.connect(self.EvtAppliquer)
            actualiser.clicked.connect(self.actualiser)
            boutons = QHBoxLayout()
            boutons.addWidget(ok)
            boutons.addWidget(appliquer)
            boutons.addWidget(actualiser)
            self.sizer.addLayout(boutons)

        self.setLayout(self.sizer)
        ##self.parent.parent.dim3 = self.sizer.CalcMin().Get()

    def EvtOk(self):
        self.EvtAppliquer()
        self.parent.parent.fenetre_principale.raise_()
        self.parent.parent.close() # fermeture de la frame


    def EvtAppliquer(self):
        txt = self.avance.toPlainText().split('\n')
        dico = "{"
        for ligne in txt:
            key, value = ligne.split(":", 1)
            key = "'" + key.strip() + "':"
            dico += key + value + ","
        dico += "}"
        if self.islabel:
            self.canvas.executer("%s.etiquette.style(**%s)" %(self.objet.parent.nom, dico))
        else:
            self.canvas.executer("%s.style(**%s)" %(self.objet.nom, dico))

    def actualiser(self, event = None):
        items = (txt.split(':', 1) for txt in advanced_split(str(self.objet.style())[1:-1], ","))
        self.avance.setPlainText('\n'.join(sorted(key.strip()[1:-1] + ':' + value for key, value in items)))
Esempio n. 26
0
    def __init__(self):
        super(Dialog, self).__init__()

        self.createMenu()
        self.createHorizontalGroupBox()
        self.createGridGroupBox()
        self.createFormGroupBox()

        bigEditor = QTextEdit()
        bigEditor.setPlainText("This widget takes up all the remaining space "
                               "in the top-level layout.")

        buttonBox = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

        buttonBox.accepted.connect(self.accept)
        buttonBox.rejected.connect(self.reject)

        mainLayout = QVBoxLayout()
        mainLayout.setMenuBar(self.menuBar)
        mainLayout.addWidget(self.horizontalGroupBox)
        mainLayout.addWidget(self.gridGroupBox)
        mainLayout.addWidget(self.formGroupBox)
        mainLayout.addWidget(bigEditor)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Basic Layouts")
Esempio n. 27
0
class Example(QMainWindow):

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

    def initUI(self):

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

        openFile = QAction('&Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.showDialog)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openFile)

        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('file dialog')
        self.show()

    def showDialog(self):
        fname = QFileDialog.getOpenFileName(
            self, 'open file', 'D://')

        if fname[0]:
            with open(fname[0], 'r') as f:
                data = f.read()
                self.textEdit.setText(data)
Esempio n. 28
0
class Edit(QWidget):

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

        self.filename = filename

        #Save and Cancel buttons, placed at the bottom of the window
        saveButton = QPushButton("Save")
        cancelButton = QPushButton("Cancel")
        saveButton.clicked.connect(self.save)
        cancelButton.clicked.connect(self.cancel)

        #Text edit field above the buttons
        #Containing all ingredients in the file, to be edited/removed/added to by the user
        self.ingredientEdit = QTextEdit()
        self.loadIngredients()

        #Set grid layout
        grid = QGridLayout()
        grid.setSpacing(10)

        #Add buttons, text field
        grid.addWidget(self.ingredientEdit, 1, 0, 5, 2)
        grid.addWidget(saveButton, 6, 0)
        grid.addWidget(cancelButton, 6, 1)

        self.setLayout(grid)
        self.setGeometry(800, 600, 350, 300)
        if filename == "ingredients.txt":
            self.setWindowTitle("My Ingredients")
        elif filename == "shoppinglist.txt":
            self.setWindowTitle("Shopping List")
        else:
            self.setWindowTitle(filename)

    # import ingredients from whichever file and put them in the text field
    # So that they can be edited by the user
    def loadIngredients(self):
        ingredients = whatsfordinner.importIngredients(self.filename)

        for i in ingredients:
            if (i != " ") and (i != "") and (i != None):
                self.ingredientEdit.append(i)

        self.ingredientEdit.repaint()

    # write ingredients to file
    def save(self):
        text = self.ingredientEdit.toPlainText()
        ingredients = text.split('\n')
        whatsfordinner.deleteIngredients(self.filename)
        whatsfordinner.writeIngredients(self.filename, ingredients)
        self.close()

    # close without writing
    def cancel(self):
        self.close()
class BinaryTranslator(QWidget):

    def __init__(self):
        super().__init__()
        
        #self.clipboard = QApplication.clipboard()
        
        self.initUI()
        
    def initUI(self):
        self.textTitle = QLabel('Text to Translate')
        self.textEdit = QTextEdit()
        
        self.binaryTitle = QLabel('Translated text')
        self.binaryEdit = QTextEdit()
        
        self.translateButton = QPushButton('Translate', self)
        self.translateButton.clicked.connect(self.translateData)
        
        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.textTitle)
        self.vbox.addWidget(self.textEdit)
        self.vbox.addWidget(self.binaryTitle)
        self.vbox.addWidget(self.binaryEdit)
        self.vbox.addWidget(self.translateButton)

        self.setLayout(self.vbox)
        
        self.binaryCopy = QShortcut(QKeySequence("Ctrl-C"), self.binaryEdit)
        self.binaryPaste = QShortcut(QKeySequence("Ctrl-V"), self.binaryEdit)
        self.textCopy = QShortcut(QKeySequence("Ctrl-C"), self.textEdit)
        self.textPaste = QShortcut(QKeySequence("Ctrl-V"), self.textEdit)
    
        self.setGeometry(300,300,550,600)
        self.setWindowTitle('Binary Translator')
        self.show()

    def translateData(self):
        self.text = self.textEdit.toPlainText()
        self.translatedText = toBinFrStr(str(self.text))
        self.binaryEdit.setText(self.translatedText)
        
    def keyPresEvent(self, k):
        
        if k.key() == self.binaryCopy:
            binaryEdit.copy(self)
            copy(self.translatedText)
           
        elif k.key() == self.binaryPaste:
            binaryEdit.paste(self)
            

        elif k.key() == self.textCopy:
            textEdit.copy(self)
            copy(self.translatedText) 

        elif k.key() == self.textPaste:
            textEdit.paste(self)
Esempio n. 30
0
    def __init__(self, parent):
        super(QKOSAbout, self).__init__(parent)
        gridlayout = QGridLayout(self)
        titlefont = QFont()
        titlefont.setPointSize(24)
        policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        label = QLabel("About QKeysOnScreen", self)
        label.setFont(titlefont)
        label.setSizePolicy(policy)
        gridlayout.addWidget(label, 0, 0)
        labelcopyright = QLabel("\u00a9 2015 Fredrick Brennan <*****@*****.**>")
        labelcopyright.setSizePolicy(policy)
        gridlayout.addWidget(labelcopyright, 1, 0)
        labeldesc = (
            "<p>QKeysOnScreen is a simple application intended for "
            + "presentations, video tutorials, and any other case where"
            + " you'd want to display the current state of the keyboard"
            + ' on the screen. For more information see our <a href="'
            + 'https://github.com/ctrlcctrlv/QKeysOnScreen">Github</a>'
            + " project."
        )
        qlabeldesc = QLabel(labeldesc)
        qlabeldesc.setWordWrap(True)
        gridlayout.addWidget(qlabeldesc, 2, 0)

        from PyQt5.QtCore import QT_VERSION_STR
        from PyQt5.Qt import PYQT_VERSION_STR
        import platform

        pyversion = ".".join([str(o) for o in sys.version_info])
        uname_result = platform.uname()
        uname = "{} {}".format(uname_result.system, uname_result.release)
        labelversions = (
            "<strong>Versions:</strong><br>Qt: {0}<br>PyQt: {1}" + "<br>Python: {2}<br>OS: {3}<br>QKeysOnScreen: 0.0.1"
        ).format(QT_VERSION_STR, PYQT_VERSION_STR, platform.python_version(), uname, platform.machine())
        qlabelversions = QLabel(labelversions)
        qlabelversions.setStyleSheet("border: 1px solid green")
        gridlayout.addWidget(qlabelversions, 0, 1)

        self.kb = get_keyboard_path()
        self.mouse = get_mouse_path()
        self.infoqlabel = QLabel(
            "<strong>Devices:</strong><br>" + "Our mouse is {0}<br/>Our keyboard is {1}".format(self.mouse, self.kb),
            self,
        )
        self.infoqlabel.setStyleSheet("border: 1px solid green")
        gridlayout.addWidget(self.infoqlabel, 2, 1)

        qte = QTextEdit(self)
        qte.setReadOnly(True)
        qfile = QFile(":/LICENSE")
        qfile.open(QIODevice.ReadOnly)
        qte.setPlainText(bytes(qfile.readAll()).decode("utf-8"))
        qfile.close()

        gridlayout.addWidget(qte, 3, 0, 1, 2)

        self.setLayout(gridlayout)
Esempio n. 31
0
class NgMainWin(QMainWindow):
    def __init__(self):
        super().__init__()
        self.enableDebug = False
        self.tabWidget = QTabWidget()
        self.tabWidget.setTabsClosable(True)
        self.logEdit = QTextEdit()
        self.tabWidget.addTab(self.logEdit, 'log')

        self.createActions()
        self.createMenus()

        self.setCentralWidget(self.tabWidget)
        self.setWindowTitle('NG Toolset')
        self.setWindowFlags(self.windowFlags() or Qt.WindowMinMaxButtonsHint)
        self.setWindowState(self.windowState() or Qt.WindowMaximized)
        self.tabWidget.tabCloseRequested.connect(self.onTabCloseRequested)

    def onTabCloseRequested(self, index):
        if index == 0:
            return
        widget = self.tabWidget.widget(index)
        self.tabWidget.removeTab(index)

    def onAbout(self):
        QMessageBox.information(
            self, 'About',
            '<h1>NG Toolset</h1><p>NG toolset is set of useful NPO tools for 4G and 5G.</p>'
            +
            '<p>Author: <a href=mailto:[email protected]>zhengwei.gao(at)yahoo.com</a></p>'
            +
            '<p>Blog: <a href="http://blog.csdn.net/jeffyko">http://blog.csdn.net/jeffyko</a></p>'
        )

    def onEnableDebug(self, checked):
        self.enableDebug = checked

    def onChkSqlPlugin(self):
        drivers = QSqlDatabase().drivers()
        for e in drivers:
            self.logEdit.append('Found SQL driver: %s' % e)

    def onExecXmlParser(self):
        indir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                             'data')
        parser = NgXmlParser(self, indir)
        parser.start()

    def onExecNedsM8015(self):
        args = dict()
        args['dbConf'] = 'oracle_db_config.txt'
        args['sqlQuery'] = [
            'neds_lnadj.sql', 'neds_lnadjl.sql', 'neds_lncel.sql',
            'neds_lnhoif.sql', 'neds_lnrel.sql', 'neds_irfim.sql',
            'neds_m8015.sql', 'neds_m8051.sql', 'neds_m8005.sql',
            'neds_m8001.sql', 'neds_m8013.sql', 'neds_m8006.sql',
            'neds_m8007.sql'
        ]

        query = NgSqlQuery(self, args)
        query.exec_()

        if query.queryStat:
            proc = NgM8015Proc(self)
            proc.loadCsvData()
            proc.makeEciMap()
            proc.procUserCase01()
            proc.procUserCase02()
            proc.procUserCase04()
            self.logEdit.append('<font color=blue>Done!</font>')

    def onExecSshSftpClient(self):
        client = NgSshSftp(self)

    def onExecRawPmParser5g(self):
        parser = NgRawPmParser(self, '5g')

    def onExecLteResGrid(self):
        dlg = NgLteGridUi(self)
        dlg.exec_()

    def onExecNbiotResGrid(self):
        dlg = NgNbiotGridUi(self)
        dlg.exec_()

    def onExecNrResGrid(self):
        #QMessageBox.information(self, 'NR Resource Grid', '<p><font color=red><b>Oops, NR resource grid is still under development!</b></font></p>'
        #                        + '<p>Please visit: <a href="http://www.3gpp.org/ftp/Specs/2018-03/Rel-15/38_series/"> http://www.3gpp.org/ftp/Specs/2018-03/Rel-15/38_series/</a> for latest 5G NSA specifications.</p>')
        dlg = NgNrGridUi(self)
        dlg.exec_()

    def createActions(self):
        #File Menu
        self.exitAction = QAction('Exit')
        self.exitAction.triggered.connect(self.close)

        #LTE menu
        self.lteResGridAction = QAction('LTE Resource Grid')
        self.lteResGridAction.triggered.connect(self.onExecLteResGrid)
        self.nbiotResGridAction = QAction('NB-IoT Resource Grid')
        self.nbiotResGridAction.triggered.connect(self.onExecNbiotResGrid)

        #NR menu
        self.nrResGridAction = QAction('NR Resource Grid')
        self.nrResGridAction.triggered.connect(self.onExecNrResGrid)

        #Misc menu
        self.chkSqlAction = QAction('Check SQL Plugin')
        self.chkSqlAction.triggered.connect(self.onChkSqlPlugin)
        self.xmlParserAction = QAction('SCF/Vendor Parser')
        self.xmlParserAction.triggered.connect(self.onExecXmlParser)
        self.sqlQueryAction = QAction('NEDS (M8015 Analyzer)')
        self.sqlQueryAction.triggered.connect(self.onExecNedsM8015)
        self.sshSftpAction = QAction('SSH/SFTP Client')
        self.sshSftpAction.triggered.connect(self.onExecSshSftpClient)
        self.rawPmParserAction = QAction('Raw PM Parser(5G)')
        self.rawPmParserAction.triggered.connect(self.onExecRawPmParser5g)

        #Options menu
        self.enableDebugAction = QAction('Enable Debug')
        self.enableDebugAction.setCheckable(True)
        self.enableDebugAction.setChecked(False)
        self.enableDebugAction.triggered[bool].connect(self.onEnableDebug)

        #Help menu
        self.aboutAction = QAction('About')
        self.aboutAction.triggered.connect(self.onAbout)
        self.aboutQtAction = QAction('About Qt')
        self.aboutQtAction.triggered.connect(qApp.aboutQt)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu('File')
        self.fileMenu.addAction(self.exitAction)

        self.lteMenu = self.menuBar().addMenu('LTE')
        self.lteMenu.addAction(self.lteResGridAction)
        self.lteMenu.addAction(self.nbiotResGridAction)

        self.nrMenu = self.menuBar().addMenu('NR')
        self.nrMenu.addAction(self.nrResGridAction)

        self.miscMenu = self.menuBar().addMenu('Misc')
        self.miscMenu.addAction(self.chkSqlAction)
        self.miscMenu.addAction(self.xmlParserAction)
        self.miscMenu.addAction(self.sqlQueryAction)
        self.miscMenu.addAction(self.sshSftpAction)
        self.miscMenu.addAction(self.rawPmParserAction)

        self.optionsMenu = self.menuBar().addMenu('Options')
        self.optionsMenu.addAction(self.enableDebugAction)

        self.helpMenu = self.menuBar().addMenu('Help')
        self.helpMenu.addAction(self.aboutAction)
        self.helpMenu.addAction(self.aboutQtAction)
Esempio n. 32
0
    def request_trezor_init_settings(self, wizard, method, device):
        vbox = QVBoxLayout()
        next_enabled = True
        label = QLabel(_("Enter a label to name your device:"))
        name = QLineEdit()
        hl = QHBoxLayout()
        hl.addWidget(label)
        hl.addWidget(name)
        hl.addStretch(1)
        vbox.addLayout(hl)

        def clean_text(widget):
            text = widget.toPlainText().strip()
            return ' '.join(text.split())

        if method in [TIM_NEW, TIM_RECOVER]:
            gb = QGroupBox()
            hbox1 = QHBoxLayout()
            gb.setLayout(hbox1)
            # KeepKey recovery doesn't need a word count
            if method == TIM_NEW:
                vbox.addWidget(gb)
            gb.setTitle(_("Select your seed length:"))
            bg = QButtonGroup()
            for i, count in enumerate([12, 18, 24]):
                rb = QRadioButton(gb)
                rb.setText(_("{} words").format(count))
                bg.addButton(rb)
                bg.setId(rb, i)
                hbox1.addWidget(rb)
                rb.setChecked(True)
            cb_pin = QCheckBox(_('Enable PIN protection'))
            cb_pin.setChecked(True)
        else:
            text = QTextEdit()
            text.setMaximumHeight(60)
            if method == TIM_MNEMONIC:
                msg = _("Enter your BIP39 mnemonic:")
            else:
                msg = _("Enter the master private key beginning with xprv:")
                def set_enabled():
                    from electrum_axe.bip32 import is_xprv
                    wizard.next_button.setEnabled(is_xprv(clean_text(text)))
                text.textChanged.connect(set_enabled)
                next_enabled = False

            vbox.addWidget(QLabel(msg))
            vbox.addWidget(text)
            pin = QLineEdit()
            pin.setValidator(QRegExpValidator(QRegExp('[1-9]{0,9}')))
            pin.setMaximumWidth(100)
            hbox_pin = QHBoxLayout()
            hbox_pin.addWidget(QLabel(_("Enter your PIN (digits 1-9):")))
            hbox_pin.addWidget(pin)
            hbox_pin.addStretch(1)

        if method in [TIM_NEW, TIM_RECOVER]:
            vbox.addWidget(WWLabel(RECOMMEND_PIN))
            vbox.addWidget(cb_pin)
        else:
            vbox.addLayout(hbox_pin)

        passphrase_msg = WWLabel(PASSPHRASE_HELP_SHORT)
        passphrase_warning = WWLabel(PASSPHRASE_NOT_PIN)
        passphrase_warning.setStyleSheet("color: red")
        cb_phrase = QCheckBox(_('Enable passphrases'))
        cb_phrase.setChecked(False)
        vbox.addWidget(passphrase_msg)
        vbox.addWidget(passphrase_warning)
        vbox.addWidget(cb_phrase)

        wizard.exec_layout(vbox, next_enabled=next_enabled)

        if method in [TIM_NEW, TIM_RECOVER]:
            item = bg.checkedId()
            pin = cb_pin.isChecked()
        else:
            item = ' '.join(str(clean_text(text)).split())
            pin = str(pin.text())

        return (item, name.text(), pin, cb_phrase.isChecked())
Esempio n. 33
0
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.client = None
        threading.Thread(target=self.run_writing).start()
        threading.Thread(target=self.update_users).start()

    def initUI(self):
        self.setWindowTitle(TITLE)
        self.setMinimumSize(700, 400)
        self.setWindowIcon(QIcon('Resources/icon.png'))

        self.init_messeges()
        self.init_users()
        self.init_botton_send()
        self.init_input()
        self.init_menu_bar()
        self.set_grid()

        self.show()

    def set_grid(self):
        grid = QGridLayout()
        grid.setMenuBar(self.menu_bar)
        grid.addWidget(self.users, 0, 2)
        grid.addWidget(self.messages, 0, 0, 1, 2)
        grid.addWidget(self.input_line, 1, 0, 1, 2)
        grid.addWidget(self.botton_send, 1, 2)
        self.setLayout(grid)

    def init_messeges(self):
        self.messages = QTextEdit()
        self.messages.setReadOnly(True)

    def init_users(self):
        self.users = QListWidget()
        self.users.setFixedWidth(150)

    def init_botton_send(self):
        self.botton_send = QPushButton()
        self.botton_send.setFixedWidth(150)
        self.botton_send.setText('Send')
        self.botton_send.clicked.connect(self.on_click_send_button)

    def init_input(self):
        self.input_line = QLineEdit()
        self.input_line.returnPressed.connect(self.on_click_send_button)

    def init_menu_bar(self):
        self.menu_bar = QMenuBar()

        menu_irc = QMenu('IRC', self.menu_bar)

        startAction = QAction('Start', self)
        startAction.triggered.connect(self.show_dialog_connect)
        stopAction = QAction('Stop', self)
        stopAction.triggered.connect(self.stop)

        menu_irc.addAction(startAction)
        menu_irc.addAction(stopAction)
        self.menu_bar.addMenu(menu_irc)

        menu_options = QMenu('Options', self.menu_bar)

        joinAction = QAction('Join', self)
        joinAction.triggered.connect(self.show_dialog_join)
        leftAction = QAction('Left', self)
        leftAction.triggered.connect(self.show_dialog_left)
        nickAction = QAction('Nick', self)
        nickAction.triggered.connect(self.show_dialog_nick)
        saveLogAction = QAction('Save log', self)
        saveLogAction.triggered.connect(self.show_dialog_unload)

        menu_options.addAction(joinAction)
        menu_options.addAction(leftAction)
        menu_options.addAction(nickAction)
        menu_options.addAction(saveLogAction)
        self.menu_bar.addMenu(menu_options)

    def on_click_send_button(self):
        if not self.client:
            QMessageBox.warning(self, ' ',
                                'You need to connect to the server!')
            return
        if not self.client.config.target:
            QMessageBox.warning(self, ' ', 'You need to join to the channel!')
            return
        if not self.input_line.text():
            return
        line = self.client.send_message(self.input_line.text())
        self.messages.append(line)
        self.input_line.clear()
        self.input_line.setFocus()

    def show_dialog_connect(self):
        if self.client:
            QMessageBox.warning(self, ' ', 'You are already connected!')
            return
        server, res_1 = QInputDialog.getText(self, ' ', 'Enter server')
        nick, res_2 = QInputDialog.getText(self, ' ', 'Enter nickname')
        if res_1 and res_2:
            self.client = main.Client(server, nick)
            self.client.handler.run()
            self.client.login()

    def show_dialog_join(self):
        if self.client:
            channel, res = QInputDialog.getText(self, ' ', 'Enter channel')
            if res:
                self.client.join(channel)
        else:
            QMessageBox.warning(self, ' ',
                                'You need to connect to the server!')

    def show_dialog_unload(self):
        path, mask = QFileDialog.getSaveFileName(self, "Open Dialog", "",
                                                 "*.txt")
        if path:
            with open(path, 'w', encoding='UTF-8') as file:
                file.write(self.messages.toPlainText())
        else:
            QMessageBox.warning(self, ' ', 'You need to change file!')

    def show_dialog_left(self):
        if self.client and self.client.config.target:
            channel, res = QInputDialog.getText(self, ' ', 'Enter channel')
            if res:
                self.client.left(channel)
        else:
            QMessageBox.warning(self, ' ', 'You need to join to the channel!')

    def show_dialog_nick(self):
        if self.client:
            nick, res = QInputDialog.getText(self, ' ', 'Enter new nick')
            if res:
                self.client.change_nick(nick)
        else:
            QMessageBox.warning(self, ' ',
                                'You need to connect to the server!')

    def run_writing(self):
        while True:
            if self.client:
                if len(self.client.handler.output):
                    self.messages.append(self.client.handler.output.pop(0))
            time.sleep(0.1)

    def update_users(self):
        while True:
            if self.client:
                if self.client.handler.names:
                    self.users.clear()
                    for nick in self.client.handler.names:
                        self.users.addItem(nick)
                    self.client.handler.names = []
            time.sleep(1)

    def stop(self):
        if not self.client:
            QMessageBox.warning(self, ' ', 'You are already stopped!')
            return
        self.client.stop()
        self.client = None
Esempio n. 34
0
 def init_messeges(self):
     self.messages = QTextEdit()
     self.messages.setReadOnly(True)
Esempio n. 35
0
class LoggerConsole(QWidget):
    def __init__(self, parent):
        super().__init__(parent, Qt.Widget)
        self.setObjectName('logger_console')
        self.layout = QGridLayout(self)

        self.output = QTextEdit(self)
        self.output.setReadOnly(True)
        self.layout.addWidget(self.output, 0, 0)

    def print_msg(self, msg: str):
        self.output.setTextColor(QColor(0, 0, 0))
        timestamp = datetime.now().strftime('[%Y-%m-%d %H:%M:%S]')
        message = f'{timestamp} [L]  {msg}'
        self.output.append(message)

    def print_warn(self, warn: str):
        self.output.setTextColor(QColor(255, 140, 0))
        timestamp = datetime.now().strftime('[%Y-%m-%d %H:%M:%S]')
        message = f'{timestamp} [W]  {warn}'
        self.output.append(message)

    def print_err(self, err: str):
        self.output.setTextColor(QColor(178, 34, 34))
        timestamp = datetime.now().strftime('[%Y-%m-%d %H:%M:%S]')
        message = f'{timestamp} [E]  {err}'
        self.output.append(message)
Esempio n. 36
0
class WidgetGallery(QDialog):
    def __init__(self, parent=None):
        super(WidgetGallery, self).__init__(parent)
        self.ButtonState = 0

        self.createSendTextBox()
        self.createReceiveTextBox()
        self.createSendButton()
        self.createConnectButton()
        self.createClearSendButton()
        self.createClearReceiveButton()

        mainLayout = QGridLayout()
        mainLayout.addWidget(self.SendTextBox, 1, 0)
        mainLayout.addWidget(self.ReceiveTextBox, 1, 1)
        mainLayout.addWidget(self.SendButton, 2, 0)
        mainLayout.addWidget(self.ConnectButton, 2, 1)
        mainLayout.addWidget(self.ClearSendButtonBox, 3, 0)
        mainLayout.addWidget(self.ClearReceiveButtonBox, 3, 1)
        mainLayout.setRowStretch(1, 1)
        mainLayout.setRowStretch(2, 1)
        mainLayout.setColumnStretch(0, 1)
        mainLayout.setColumnStretch(1, 1)
        self.setLayout(mainLayout)

        self.setWindowTitle("Chatting")
        self.setModal(False)

    def createSendTextBox(self):
        self.SendTextBox = QGroupBox("Sending Text")

        self.SendMessage = SendEnter(self)
        self.SendMessage.setPlainText("")
        SendBoxLayout = QHBoxLayout()
        SendBoxLayout.setContentsMargins(5, 5, 5, 5)
        SendBoxLayout.addWidget(self.SendMessage)
        self.SendTextBox.setLayout(SendBoxLayout)

    def createReceiveTextBox(self):
        self.ReceiveTextBox = QGroupBox("Receiving Text")

        self.ReceiveMessage = QTextEdit()
        self.ReceiveMessage.setPlainText("")
        self.ReceiveMessage.setReadOnly(True)
        ReceiveBoxLayout = QHBoxLayout()
        ReceiveBoxLayout.setContentsMargins(5, 5, 5, 5)
        ReceiveBoxLayout.addWidget(self.ReceiveMessage)
        self.ReceiveTextBox.setLayout(ReceiveBoxLayout)

    def createSendButton(self):
        layout = QVBoxLayout()
        self.SendButton = QPushButton("Send")
        self.SendButton.setCheckable(True)
        self.SendButton.setEnabled(False)
        self.SendButton.setAutoDefault(True)
        self.SendButton.toggle()
        self.SendButton.clicked.connect(
            lambda: self.SendButtonFunction(self.SendMessage))
        self.SendButton.clicked.connect(
            lambda: self.ClearButtonSendBoxFunction())
        layout.addWidget(self.SendButton)

    def createConnectButton(self):
        layout = QVBoxLayout()
        self.ButtonState = STATE_CONNECTED
        self.ConnectButton = QPushButton("Connect")
        self.ConnectButton.setCheckable(False)
        self.ConnectButton.toggle()
        self.ConnectButton.clicked.connect(
            lambda: self.ConnectButtonFunction())
        self.ConnectButton.clicked.connect(
            lambda: self.ClearButtonReceiveBoxFunction())
        layout.addWidget(self.ConnectButton)

    def createClearSendButton(self):
        self.ClearSendButtonBox = QGroupBox("Sending Mode")

        layout = QGridLayout()
        self.ClearSendButton = QRadioButton("Clear")
        self.StaySendButton = QRadioButton("Stay")
        self.ClearSendButton.setChecked(True)

        SendMode = QButtonGroup()
        SendMode.addButton(self.ClearSendButton)
        SendMode.addButton(self.StaySendButton)

        layout.addWidget(self.ClearSendButton, 0, 0)
        layout.addWidget(self.StaySendButton, 1, 0)
        self.ClearSendButtonBox.setLayout(layout)

    def createClearReceiveButton(self):
        self.ClearReceiveButtonBox = QGroupBox("Receiving Mode")

        layout = QGridLayout()
        self.ClearReceiveButton = QRadioButton("Clear")
        self.StayReceiveButton = QRadioButton("Stay")
        self.ClearReceiveButton.setChecked(True)

        ReceiveMode = QButtonGroup()
        ReceiveMode.addButton(self.ClearReceiveButton)
        ReceiveMode.addButton(self.StayReceiveButton)

        layout.addWidget(self.ClearReceiveButton, 0, 0)
        layout.addWidget(self.StayReceiveButton, 1, 0)
        self.ClearReceiveButtonBox.setLayout(layout)

    def ClearButtonSendBoxFunction(self):
        if self.ClearSendButton.isChecked() == True:
            self.SendMessage.clear()
        else:
            return

    def ClearButtonReceiveBoxFunction(self):
        if self.ButtonState == STATE_CONNECTED:
            if self.ClearReceiveButton.isChecked() == True:
                self.ReceiveMessage.clear()
            else:
                return
        else:
            return

    def SendButtonFunction(self, b):
        self.MessageSent = b.toPlainText()
        bytesToSend = self.MessageSent.encode("utf-8")
        self.NetworkC.UDPMySocket.sendto(bytesToSend, self.serverAddressPort)

    def EnterPressed(self, b):
        if self.ButtonState == STATE_DISCONNECTED:
            bytesToSend = b.encode("utf-8")
            PortNumber = int(self.ConnectD.PortNumber)
            self.serverAddressPort = (self.ConnectD.IpAddress, PortNumber)
            self.NetworkC.UDPMySocket.sendto(bytesToSend,
                                             self.serverAddressPort)
        else:
            return

    def ConnectButtonFunction(self):
        if self.ButtonState == STATE_CONNECTED:
            self.SendButton.setEnabled(False)
            self.ConnectD = ConnectDialog()
            self.ConnectD.show()
            self.ConnectD.exec_()
            if self.ConnectD.ButtonPressed == CONNECT_TRY:
                self.SendButton.setEnabled(True)
                PortNumber = int(self.ConnectD.PortNumber)
                self.NetworkC = NetworkConnect()
                self.serverAddressPort = (self.ConnectD.IpAddress, PortNumber)
                self.NetworkC.run(self.ReceiveMessage)
                self.ConnectButton.setText("Disconnect")
                self.ButtonState = STATE_DISCONNECTED
        else:
            self.SendButton.setEnabled(False)
            self.NetworkC._receiving = False
            self.NetworkC.Receiving.join()
            self.NetworkC.UDPMySocket.close()
            self.ConnectButton.setText("Connect")
            self.ButtonState = STATE_CONNECTED
Esempio n. 37
0
class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin, Logger):
    _active_window = None

    def __init__(self, main_window, exctype, value, tb):
        BaseCrashReporter.__init__(self, exctype, value, tb)
        self.main_window = main_window

        QWidget.__init__(self)
        self.setWindowTitle('Electrum - ' + _('An Error Occurred'))
        self.setMinimumSize(600, 300)

        Logger.__init__(self)

        main_box = QVBoxLayout()

        heading = QLabel('<h2>' + BaseCrashReporter.CRASH_TITLE + '</h2>')
        main_box.addWidget(heading)
        main_box.addWidget(QLabel(BaseCrashReporter.CRASH_MESSAGE))

        main_box.addWidget(QLabel(BaseCrashReporter.REQUEST_HELP_MESSAGE))

        collapse_info = QPushButton(_("Show report contents"))
        # FIXME if traceback contains special HTML characters, e.g. '<'
        #       then formatting issues arise (due to rich_text=True)
        collapse_info.clicked.connect(
            lambda: self.msg_box(QMessageBox.NoIcon,
                                 self,
                                 _("Report contents"),
                                 self.get_report_string(),
                                 rich_text=True))

        main_box.addWidget(collapse_info)

        main_box.addWidget(QLabel(BaseCrashReporter.DESCRIBE_ERROR_MESSAGE))

        self.description_textfield = QTextEdit()
        self.description_textfield.setFixedHeight(50)
        self.description_textfield.setPlaceholderText(
            _("Do not enter sensitive/private information here. "
              "The report will be visible on the public issue tracker."))
        main_box.addWidget(self.description_textfield)

        main_box.addWidget(QLabel(BaseCrashReporter.ASK_CONFIRM_SEND))

        buttons = QHBoxLayout()

        report_button = QPushButton(_('Send Bug Report'))
        report_button.clicked.connect(self.send_report)
        report_button.setIcon(read_QIcon("tab_send.png"))
        buttons.addWidget(report_button)

        never_button = QPushButton(_('Never'))
        never_button.clicked.connect(self.show_never)
        buttons.addWidget(never_button)

        close_button = QPushButton(_('Not Now'))
        close_button.clicked.connect(self.close)
        buttons.addWidget(close_button)

        main_box.addLayout(buttons)

        self.setLayout(main_box)
        self.show()

    def send_report(self):
        def on_success(response):
            # note: 'response' coming from (remote) crash reporter server.
            # It contains a URL to the GitHub issue, so we allow rich text.
            self.show_message(parent=self,
                              title=_("Crash report"),
                              msg=response,
                              rich_text=True)
            self.close()

        def on_failure(exc_info):
            e = exc_info[1]
            self.logger.error(
                'There was a problem with the automatic reporting',
                exc_info=exc_info)
            self.show_critical(
                parent=self,
                msg=(
                    _('There was a problem with the automatic reporting:') +
                    '<br/>' + repr(e)[:120] + '<br/>' +
                    _("Please report this issue manually") +
                    f' <a href="{constants.GIT_REPO_ISSUES_URL}">on GitHub</a>.'
                ),
                rich_text=True)

        proxy = self.main_window.network.proxy
        task = lambda: BaseCrashReporter.send_report(
            self, self.main_window.network.asyncio_loop, proxy)
        msg = _('Sending crash report...')
        WaitingDialog(self, msg, task, on_success, on_failure)

    def on_close(self):
        Exception_Window._active_window = None
        self.close()

    def show_never(self):
        self.main_window.config.set_key(BaseCrashReporter.config_key, False)
        self.close()

    def closeEvent(self, event):
        self.on_close()
        event.accept()

    def get_user_description(self):
        return self.description_textfield.toPlainText()

    def get_wallet_type(self):
        return self.main_window.wallet.wallet_type
Esempio n. 38
0
    def keyboard(self):        
        self.setWindowTitle('KeyBoard Test Tool Beta1.0')
        
        self.savedStdout = sys.stdout
        self.savedStderr = sys.stderr
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)  # 重新定义系统标准输出
        sys.stderr = EmittingStream(textWritten=self.normalOutputWritten)  # 重新定义系统标准错误'''
        
        mainLayout=QGridLayout()
        serailLayout=QGridLayout()

        line1Layout=QHBoxLayout()
        line2Layout=QHBoxLayout()
        line3Layout=QHBoxLayout()
        line4Layout=QHBoxLayout()
        line5Layout=QHBoxLayout()
        line6Layout=QHBoxLayout()
        line7Layout=QHBoxLayout()

        self.Serial_chose_Widget=QGroupBox('')
        self.TxtWidget=QTextEdit()
        self.Txtline=QLineEdit()
        self.Txtline.setFont(QFont("Roman times",13))
        
        self.runbutton=QPushButton('RUN')
        
        self.serial_name_label=QLabel(' 串口')
        self.serial_name_widget=QComboBox()

        self.serial_name_widget.addItem("COM1")
        self.serial_name_widget.addItem("COM2")
        self.serial_name_widget.addItem("COM3")
        self.serial_name_widget.addItem("COM4")
        self.serial_name_widget.addItem("COM5")
        self.serial_name_widget.addItem("COM6")
        self.serial_name_widget.addItem("COM7")
        self.serial_name_widget.addItem("COM8")
        self.serial_name_widget.addItem("COM9")
        self.serial_name_widget.addItem("COM10")

        self.serail_baudrate_label=QLabel("波特率")
        self.serial_lineedit = QLineEdit()
        
        
        self.Serial_chose_Widget.setLayout(serailLayout)
        serailLayout.addWidget(self.serial_name_label,0,0,1,2)
        serailLayout.addWidget(self.serial_name_widget, 0,2,1,3)
        serailLayout.addWidget(self.serail_baudrate_label,1,0,1,2)
        serailLayout.addWidget(self.serial_lineedit,1,2,1,3)


        self.line1widget=QWidget()
        self.line1widget.setLayout(line1Layout)
        self.line2widget=QWidget()
        self.line2widget.setLayout(line2Layout)
        self.line3widget=QWidget()
        self.line3widget.setLayout(line3Layout)
        self.line4widget=QWidget()
        self.line4widget.setLayout(line4Layout)
        self.line5widget=QWidget()
        self.line5widget.setLayout(line5Layout)
        self.line6widget=QWidget()
        self.line6widget.setLayout(line6Layout)
        self.line7widget=QWidget()
        self.line7widget.setLayout(line7Layout)
        
        MainWindow=QWidget()
        MainWindow.setLayout(mainLayout)
        self.setCentralWidget(MainWindow)

        mainLayout.addWidget(self.Serial_chose_Widget,0,0,1,1)
        mainLayout.addWidget(self.TxtWidget,0,1,1,18)
        mainLayout.addWidget(self.runbutton,1,0,1,1)
        mainLayout.addWidget(self.Txtline,1,1,1,18)
        key_line1=['Esc','F1','F2','F3','F4','F5','F6','F7','F8','F9','F10','F11','F12','Home','End','Insert','Delete']
        key_line2=['~\n·\n','!\n1\n','@\n2\n','#\n3\n','$\n4\n','%\n5\n','^\n6\n','&&\n7\n','*\n8\n','(\n9\n',')\n0\n','-\n-\n','+\n=\n','\nBackspace\n']
        key_line3=['\nTab\n','\nQ\n','\nW\n','\nE\n','\nR\n','\nT\n','\nY\n','\nU\n','\nI\n','\nO\n','\nP\n','{\n[\n','}\n]\n','|\n\\\n']
        key_line4=['\nCaps Lock\n','\nA\n','\nS\n','\nD\n','\nF\n','\nG\n','\nH\n','\nJ\n','\nK\n','\nL\n',':\n;\n','"\n\'\n','\nEnter\n']
        key_line5=['\nShift\n','\nZ\n','\nX\n','\nC\n','\nV\n','\nB\n','\nN\n','\nM\n','<\n,\n','>\n.\n','?\n/\n','\nShift\n']
        key_line6=['\nFn\n','\nCtrl\n','\n▆▇\n▇▇','\nAlt\n','\n------------------------------------------------------------------\n','\nAlt\n','\nPrtScn\n','\nCtrl\n','\nPgUp\n','\n↑\n','\nPgDn\n']
        key_line7=['←','↓','→']
        
        key_line=[]
        key_line.append(key_line1)
        key_line.append(key_line2)
        key_line.append(key_line3)
        key_line.append(key_line4)
        key_line.append(key_line5)
        key_line.append(key_line6)
        key_line.append(key_line7)
        
        self.button=locals()
        
        positions1= [ j for j in range(17)]
        for position,key in zip(positions1,key_line1):
            self.button['button1_%s'%position]=QPushButton(key)
            self.button['button1_%s'%position].setFont(QFont("Roman times",8,QFont.Bold))
            #self.button['button1_%s'%position].setCheckable(True)
            #self.button['button1_%s'%position].setAutoExclusive(True)
            line1Layout.addWidget(self.button['button1_%s'%position],position)
        mainLayout.addWidget(self.line1widget,2,0,1,19)
              
        positions2= [ j for j in range(14)]
        for position,key in zip(positions2,key_line2):
            self.button['button2_%s'%position]=QPushButton(key)
            self.button['button2_%s'%position].setFont(QFont("Roman times",9,QFont.Bold))
            line2Layout.addWidget(self.button['button2_%s'%position],position)
            line2Layout.setSpacing(8)
        mainLayout.addWidget(self.line2widget,3,0,1,19) 
        
        positions3= [ j for j in range(14)]
        for position,key in zip(positions3,key_line3):
            self.button['button3_%s'%position]=QPushButton(key)
            self.button['button3_%s'%position].setFont(QFont("Roman times",9,QFont.Bold))
            line3Layout.addWidget(self.button['button3_%s'%position],position)
            line3Layout.setSpacing(10)
        mainLayout.addWidget(self.line3widget,4,0,1,19)

        positions4= [ j for j in range(13)]
        for position,key in zip(positions4,key_line4):
            self.button['button4_%s'%position]=QPushButton(key)
            self.button['button4_%s'%position].setFont(QFont("Roman times",9,QFont.Bold))
            line4Layout.addWidget(self.button['button4_%s'%position],position)
            line4Layout.setSpacing(13)
        mainLayout.addWidget(self.line4widget,5,0,1,19)

        positions5= [ j for j in range(12)]
        for position,key in zip(positions5,key_line5):
            self.button['button5_%s'%position]=QPushButton(key)
            self.button['button5_%s'%position].setFont(QFont("Roman times",9,QFont.Bold))
            line5Layout.addWidget(self.button['button5_%s'%position],position)
            line5Layout.setSpacing(15)
        mainLayout.addWidget(self.line5widget,6,0,1,19)


        positions6= [ j for j in range(11)]
        for position,key in zip(positions6,key_line6):
            self.button['button6_%s'%position]=QPushButton(key)
            self.button['button6_%s'%position].setFont(QFont("Roman times",9,QFont.Bold))
            if key=='\n------------------------------------------------------------------\n':
                self.button['button6_%s'%position].setStyleSheet('''
                QPushButton{
                color: rgb(211,211,211) ;
                }
                ''')

            line6Layout.addWidget(self.button['button6_%s'%position],position)
            line6Layout.setSpacing(12)
        mainLayout.addWidget(self.line6widget,7,0,1,19)

        positions7= [ j for j in range(3)]
        for position,key in zip(positions7,key_line7):
            self.button['button7_%s'%position]=QPushButton(key)
            self.button['button7_%s'%position].setFont(QFont("Roman times",9,QFont.Bold))

            line7Layout.addWidget(self.button['button7_%s'%position],position+8)
            line7Layout.setSpacing(12)
        mainLayout.addWidget(self.line7widget,8,14,1,5)
        
        self.move(300,150)
        self.show()
Esempio n. 39
0
 def __init__(self, parent):
     print(self, parent)
     QTextEdit.__init__(self)
     self.parent = parent
     self.currentStr = ""
     self.prevStr = ""
Esempio n. 40
0
class ErrorWindow(QWidget):
    def __init__(self, text):
        super().__init__()
        # finding windows_size
        self.setMinimumSize(QtCore.QSize(363, 300))
        self.setWindowIcon(
            QIcon.fromTheme('persepolis', QIcon(':/persepolis.svg')))
        self.setWindowTitle('Persepolis Download Manager')

        verticalLayout = QVBoxLayout(self)
        horizontalLayout = QHBoxLayout()
        horizontalLayout.addStretch(1)

        self.text_edit = QTextEdit(self)
        self.text_edit.setReadOnly(True)
        self.text_edit.insertPlainText(text)

        verticalLayout.addWidget(self.text_edit)

        self.label2 = QLabel(self)
        self.label2.setText(
            'Reseting persepolis may solving problem.\nDo not panic!If you add your download links again,\npersepolis will resume your downloads\nPlease copy this error message and press "Report Issue" button\nand open a new issue in Github for it.\nWe answer you as soon as possible. \nreporting this issue help us to improve persepolis.\nThank you!'
        )
        verticalLayout.addWidget(self.label2)

        self.report_pushButton = QPushButton(self)
        self.report_pushButton.setText("Report Issue")
        horizontalLayout.addWidget(self.report_pushButton)

        self.reset_persepolis_pushButton = QPushButton(self)
        self.reset_persepolis_pushButton.clicked.connect(
            self.resetPushButtonPressed)
        self.reset_persepolis_pushButton.setText('Reset Persepolis')
        horizontalLayout.addWidget(self.reset_persepolis_pushButton)

        self.close_pushButton = QPushButton(self)
        self.close_pushButton.setText('close')
        horizontalLayout.addWidget(self.close_pushButton)

        verticalLayout.addLayout(horizontalLayout)

        self.report_pushButton.clicked.connect(self.reportPushButtonPressed)
        self.close_pushButton.clicked.connect(self.closePushButtonPressed)

    def reportPushButtonPressed(self, button):
        osCommands.xdgOpen('https://github.com/persepolisdm/persepolis/issues')

    def closePushButtonPressed(self, button):
        self.close()

    def resetPushButtonPressed(self, button):
        # create an object for PersepolisDB
        persepolis_db = PersepolisDB()

        # Reset data base
        persepolis_db.resetDataBase()

        # close connections
        persepolis_db.closeConnections()

        # Reset persepolis_setting
        persepolis_setting = QSettings('persepolis_download_manager',
                                       'persepolis')
        persepolis_setting.clear()
        persepolis_setting.sync()
class VentanaChat(QWidget):
    """
    Representa la ventana de chat de la interfaz gráfica.
    Permite comunicarse con otros usuarios (clients) por medio de una interfaz
    de mensajería instantánea.
    """
    sendto_client_signal = pyqtSignal(dict)

    def __init__(self, room, user, *args, **kwargs):
        super().__init__()
        self.room = room
        self.user = user
        self.init_gui()
        self.show()

    def init_gui(self):
        """
        Inicializa la interfaz gráfica
        """
        self.setWindowTitle(self.room.nombre)
        self.setGeometry(50, 50, 700, 650)
        self.setFixedSize(700, 650)

        # Logo
        path_logo = PARAMETROS["path"]["logo"]
        logo_pixmap = QPixmap(path_logo)
        self.logo = QLabel(self)
        self.logo.setPixmap(logo_pixmap)

        # Fondo
        path_fondo = random.choice(PARAMETROS["path"]["fondos"])
        fondo_pixmap = QPixmap(path_fondo).scaled(700, 300)
        self.fondo = QLabel(self)
        self.fondo.setPixmap(fondo_pixmap)

        # Screen
        self.text_screen = QTextEdit(self)
        self.text_screen.setReadOnly(True)
        self.text_screen.move(5, 305)
        self.text_screen.setFixedSize(690, 245)

        # Line Input
        self.line_input = QLineEdit(self)
        self.line_input.setFixedSize(525, 25)
        self.line_input.move(5, 555)
        self.line_input.returnPressed.connect(self.enter_text_input)

        # Enter Button
        self.enter_button = QPushButton("Enter", self)
        self.enter_button.move(550, 555)
        self.enter_button.setFixedSize(145, 25)
        self.enter_button.clicked.connect(self.enter_text_input)

        # Exit button
        self.exit_button = QPushButton("Salir", self)
        self.exit_button.move(300, 600)
        self.exit_button.clicked.connect(self.exit_click)
        # Interactive

        # Object Placement
        self.fondo.move(0, 0)

        # main_vbox = QVBoxLayout()
        # main_vbox.addStretch(1)

        # hbox1 = QHBoxLayout()
        # hbox1.addStretch(1)
        # hbox1.addWidget(self.logo)
        # hbox1.addStretch(1)
        # main_vbox.addLayout(hbox1)


        # self.setLayout(main_vbox)

    def handle_client(self, dict_):
        """
        Método conectado a señal, recibe diccionario desde el client
        """
        command = dict_["command"]
        if command == "receive_message":
            self.display_message(dict_["text"])

    def exit_click(self):
        dict_ = {
            "command": "exit_room",
            "text": self.line_input.text(),
            "room": self.room,
        }
        exit()


    def enter_text_input(self):
        if self.line_input.text().strip() != "":
            dict_ = {
                "command": "enter_text",
                "text": self.line_input.text(),
                "room": self.room,

            }
            self.sendto_client_signal.emit(dict_)
        self.line_input.clear()

    def display_message(self, text):
        self.text_screen.append(text)
Esempio n. 42
0
class AIGameWindow(QMainWindow):
    """Application window for the baby AI game"""
    def __init__(self, env):
        super().__init__()
        self.initUI()

        # By default, manual stepping only
        self.fpsLimit = 0

        self.env = env
        self.lastObs = None

        self.resetEnv()

        self.stepTimer = QTimer()
        self.stepTimer.setInterval(0)
        self.stepTimer.setSingleShot(False)
        self.stepTimer.timeout.connect(self.stepClicked)

        # Pointing and naming data
        self.pointingData = []

    def initUI(self):
        """Create and connect the UI elements"""

        self.resize(512, 512)
        self.setWindowTitle('Baby AI Game')

        # Full render view (large view)
        self.imgLabel = ImgWidget(self)
        self.imgLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        leftBox = QVBoxLayout()
        leftBox.addStretch(1)
        leftBox.addWidget(self.imgLabel)
        leftBox.addStretch(1)

        # Area on the right of the large view
        rightBox = self.createRightArea()

        # Arrange widgets horizontally
        hbox = QHBoxLayout()
        hbox.addLayout(leftBox)
        hbox.addLayout(rightBox)

        # Create a main widget for the window
        mainWidget = QWidget(self)
        self.setCentralWidget(mainWidget)
        mainWidget.setLayout(hbox)

        # Show the application window
        self.show()
        self.setFocus()

    def createRightArea(self):
        # Agent render view (partially observable)
        self.obsImgLabel = QLabel()
        self.obsImgLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        miniViewBox = QHBoxLayout()
        miniViewBox.addStretch(1)
        miniViewBox.addWidget(self.obsImgLabel)
        miniViewBox.addStretch(1)

        self.missionBox = QTextEdit()
        self.missionBox.setMinimumSize(500, 100)
        self.missionBox.textChanged.connect(self.missionEdit)

        buttonBox = self.createButtons()

        self.stepsLabel = QLabel()
        self.stepsLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.stepsLabel.setAlignment(Qt.AlignCenter)
        self.stepsLabel.setMinimumSize(60, 10)
        resetBtn = QPushButton("Reset")
        resetBtn.clicked.connect(self.resetEnv)
        stepsBox = QHBoxLayout()
        stepsBox.addStretch(1)
        stepsBox.addWidget(QLabel("Steps remaining"))
        stepsBox.addWidget(self.stepsLabel)
        stepsBox.addWidget(resetBtn)
        stepsBox.addStretch(1)

        hline2 = QFrame()
        hline2.setFrameShape(QFrame.HLine)
        hline2.setFrameShadow(QFrame.Sunken)

        # Stack everything up in a vetical layout
        vbox = QVBoxLayout()
        vbox.addLayout(miniViewBox)
        vbox.addLayout(stepsBox)
        vbox.addWidget(hline2)
        vbox.addWidget(QLabel("Mission"))
        vbox.addWidget(self.missionBox)
        vbox.addLayout(buttonBox)

        return vbox

    def createButtons(self):
        """Create the row of UI buttons"""

        stepButton = QPushButton("Step")
        stepButton.clicked.connect(self.stepClicked)

        minusButton = QPushButton("- Reward")
        minusButton.clicked.connect(self.minusReward)

        plusButton = QPushButton("+ Reward")
        plusButton.clicked.connect(self.plusReward)

        slider = QSlider(Qt.Horizontal, self)
        slider.setFocusPolicy(Qt.NoFocus)
        slider.setMinimum(0)
        slider.setMaximum(100)
        slider.setValue(0)
        slider.valueChanged.connect(self.setFrameRate)

        self.fpsLabel = QLabel("Manual")
        self.fpsLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.fpsLabel.setAlignment(Qt.AlignCenter)
        self.fpsLabel.setMinimumSize(80, 10)

        # Assemble the buttons into a horizontal layout
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(stepButton)
        hbox.addWidget(slider)
        hbox.addWidget(self.fpsLabel)
        hbox.addStretch(1)
        hbox.addWidget(minusButton)
        hbox.addWidget(plusButton)
        hbox.addStretch(1)

        return hbox

    def keyPressEvent(self, e):
        # Manual agent control
        actions = self.env.unwrapped.actions

        if e.key() == Qt.Key_Left:
            self.stepEnv(actions.left)
        elif e.key() == Qt.Key_Right:
            self.stepEnv(actions.right)
        elif e.key() == Qt.Key_Up:
            self.stepEnv(actions.forward)

        elif e.key() == Qt.Key_PageUp:
            self.stepEnv(actions.pickup)
        elif e.key() == Qt.Key_PageDown:
            self.stepEnv(actions.drop)
        elif e.key() == Qt.Key_Space:
            self.stepEnv(actions.toggle)
        elif e.key() == Qt.Key_Return:
            self.stepEnv(actions.done)
        elif e.key() == Qt.Key_Shift:
            self.stepEnv()

        elif e.key() == Qt.Key_Backspace:
            self.resetEnv()
        elif e.key() == Qt.Key_Escape:
            self.close()

    def mousePressEvent(self, event):
        """
        Clear the focus of the text boxes and buttons if somewhere
        else on the window is clicked
        """

        # Set the focus on the full render image
        self.imgLabel.setFocus()

        QMainWindow.mousePressEvent(self, event)

    def imageClick(self, x, y):
        """
        Pointing and naming logic
        """

        # Set the focus on the full render image
        self.imgLabel.setFocus()

        env = self.env.unwrapped
        imgW = self.imgLabel.size().width()
        imgH = self.imgLabel.size().height()

        i = (env.grid.width * x) // imgW
        j = (env.grid.height * y) // imgH
        assert i < env.grid.width
        assert j < env.grid.height

        print('grid clicked: i=%d, j=%d' % (i, j))

        desc, ok = QInputDialog.getText(self, 'Pointing & Naming',
                                        'Enter Description:')
        desc = str(desc)

        if not ok or len(desc) == 0:
            return

        pointObj = env.grid.get(i, j)

        if pointObj is None:
            return

        print('description: "%s"' % desc)
        print('object: %s %s' % (pointObj.color, pointObj.type))

        viewSz = minigrid.AGENT_VIEW_SIZE

        NUM_TARGET = 50
        numItrs = 0
        numPos = 0
        numNeg = 0

        while (numPos < NUM_TARGET or numNeg < NUM_TARGET) and numItrs < 300:
            env2 = copy.deepcopy(env)

            # Randomly place the agent around the selected point
            x, y = i, j
            x += random.randint(-viewSz, viewSz)
            y += random.randint(-viewSz, viewSz)
            x = max(0, min(x, env2.grid.width - 1))
            y = max(0, min(y, env2.grid.height - 1))
            env2.agent_pos = (x, y)
            env2.agent_dir = random.randint(0, 3)

            # Don't want to place the agent on top of something
            if env2.grid.get(*env2.agent_pos) != None:
                continue

            agent_sees = env2.agent_sees(i, j)

            obs = env2.gen_obs()
            img = obs['image'] if isinstance(obs, dict) else obs
            obsGrid = minigrid.Grid.decode(img)

            datum = {
                'desc': desc,
                'img': img,
                'pos': (i, j),
                'present': agent_sees
            }

            if agent_sees and numPos < NUM_TARGET:
                self.pointingData.append(datum)
                numPos += 1

            if not agent_sees and numNeg < NUM_TARGET:
                # Don't want identical object in mismatch examples
                if (pointObj.color, pointObj.type) not in obsGrid:
                    self.pointingData.append(datum)
                    numNeg += 1

            numItrs += 1

        print('positive examples: %d' % numPos)
        print('negative examples: %d' % numNeg)
        print('total examples: %d' % len(self.pointingData))

    def missionEdit(self):
        # The agent will get the mission as an observation
        # before performing the next action
        text = self.missionBox.toPlainText()
        self.lastObs['mission'] = text

    def plusReward(self):
        print('+reward')
        self.env.setReward(1)

    def minusReward(self):
        print('-reward')
        self.env.setReward(-1)

    def stepClicked(self):
        self.stepEnv(action=None)

    def setFrameRate(self, value):
        """Set the frame rate limit. Zero for manual stepping."""

        print('Set frame rate: %s' % value)

        self.fpsLimit = int(value)

        if value == 0:
            self.fpsLabel.setText("Manual")
            self.stepTimer.stop()

        elif value == 100:
            self.fpsLabel.setText("Fastest")
            self.stepTimer.setInterval(0)
            self.stepTimer.start()

        else:
            self.fpsLabel.setText("%s FPS" % value)
            self.stepTimer.setInterval(int(1000 / self.fpsLimit))
            self.stepTimer.start()

    def resetEnv(self):
        obs = self.env.reset()

        self.agent = BotAgent(self.env)

        self.lastObs = obs
        self.showEnv(obs)

    def showEnv(self, obs):
        unwrapped = self.env.unwrapped

        # Render and display the environment
        pixmap = self.env.render(mode='pixmap')
        self.imgLabel.setPixmap(pixmap)

        # Render and display the agent's view
        image = obs['image']
        obsPixmap = unwrapped.get_obs_render(image)
        self.obsImgLabel.setPixmap(obsPixmap)

        # Get the optimal action from the bot
        self.bot_action = self.agent.act()['action']

        # Update the mission text
        mission = obs['mission']
        self.missionBox.setPlainText(mission)

        self.missionBox.append('\nOptimal Action: {}'.format(self.bot_action))

        # Set the steps remaining
        stepsRem = unwrapped.steps_remaining
        self.stepsLabel.setText(str(stepsRem))

    def stepEnv(self, action=None):
        # If no manual action was specified by the user
        if action is None:
            action = self.bot_action

        obs, reward, done, info = self.env.step(action)

        self.showEnv(obs)
        self.lastObs = obs

        if done:
            self.resetEnv()
Esempio n. 43
0
class MatplotlibWidget(QWidget):
    def __init__(self, parent=None):
        super(MatplotlibWidget, self).__init__(parent)
        self.initUi()

    def initUi(self):
        self.canvas = MyMplCanvas(self)
        self.canvas.start_static_plot()  # 初始化的时候就呈现静态图

        self.pos_edit = QLineEdit("")
        self.pos_edit.setPlaceholderText("输入位置 如:3 0")

        self.button_cacul = QPushButton("输入")
        self.button_clear = QPushButton("清空")
        self.textEdit = QTextEdit()

        self.type_cb = QComboBox()  # 类型选择框
        self.type_cb.addItem("1-1")
        self.type_cb.addItem("1-2")
        self.type_cb.addItem("2-1")
        self.type_cb.addItem("2-2")
        self.type_cb.addItem("2-3")
        self.type_cb.addItem("2-4")
        self.type_cb.addItem("3-1")
        self.type_cb.addItem("3-2")
        self.type_cb.addItem("3-3")
        self.type_cb.addItem("3-4")
        self.type_cb.addItem("4-1")

        # 连接事件
        self.button_cacul.clicked.connect(self.Caculate)
        self.button_clear.clicked.connect(self.Clear)

        # 设置布局
        wlayout = QHBoxLayout()  # 全局布局
        vlayout1 = QVBoxLayout()  # 局部布局
        vlayout2 = QVBoxLayout()

        wg1 = QWidget()  # 控件,设置局部布局
        wg2 = QWidget()
        vlayout1.addWidget(self.canvas)
        vlayout2.addStretch(1)
        vlayout2.addWidget(self.type_cb)
        vlayout2.addStretch(1)
        vlayout2.addWidget(self.pos_edit)
        vlayout2.addStretch(1)
        vlayout2.addWidget(self.button_cacul)
        vlayout2.addWidget(self.button_clear)
        vlayout2.addStretch(1)
        vlayout2.addWidget(self.textEdit)

        wg1.setLayout(vlayout1)
        wg2.setLayout(vlayout2)
        wlayout.addWidget(wg1)  # 控件添加到全局布局
        wlayout.addWidget(wg2)
        self.setLayout(wlayout)

    def Caculate(self):
        pass

    def Clear(self):
        self.canvas.b = np.zeros((self.canvas.row, self.canvas.col))
        self.textEdit.setPlainText(" ")
        self.canvas.start_static_plot()
Esempio n. 44
0
 def keyPressEvent(self, event):
     if event.key() == Qt.Key_Tab:
         tc = self.textCursor()
         tc.insertText("    ")
         return
     return QTextEdit.keyPressEvent(self, event)
Esempio n. 45
0
    def initUI(self):
        # ---------------------按钮和窗体鼠标放上去显示提示信息
        # 这种静态的方法设置一个用于显示工具提示的字体。我们使用10px滑体字体。
        # QToolTip.setFont(QFont('SansSerif', 10))
        # # 创建一个提示,我们称之为settooltip()方法。我们可以使用丰富的文本格式
        # self.setToolTip('This is a <b>QWidget</b> widget')
        # # 创建一个PushButton并为他设置一个tooltip
        # btn = QPushButton('Button', self)
        # btn.setToolTip('This is a <b>QPushButton</b> widget')
        # # btn.sizeHint()显示默认尺寸
        # btn.resize(btn.sizeHint())
        # btn.move(50,50)

        # ------------------退出按钮
        # qtbn=QPushButton('quit',self)
        # qtbn.clicked.connect(QCoreApplication.instance().quit)
        # qtbn.resize(qtbn.sizeHint())
        # qtbn.move(80,80)

        #绝对定位  ---------标签
        # lbl1=QLabel('Zetcode',self)
        # lbl1.move(10,10)
        # lbl2=QLabel('tutorials',self)
        # lbl2.move(10,20)
        # lbl3=QLabel('for programers',self)
        # lbl3.move(10,30)
        #框布局---------确定和取消按钮
        # okbutton=QPushButton('ok')
        # canclebutton=QPushButton('cancel')
        #     # 水平布局 添加一个伸展因子和两个按钮
        # hbox=QHBoxLayout()
        # hbox.addStretch(1)
        # hbox.addWidget(okbutton)
        # hbox.addWidget(canclebutton)
        #     # 垂直布局
        # vbox=QVBoxLayout()
        # vbox.addStretch(1)#添加伸展因子
        # vbox.addLayout(hbox)
            #设置窗口的布局界面
        # self.setLayout(vbox)

        #表格布局qgridlayout------计算器实例
        # grid=QGridLayout()
        # self.setLayout(grid)
        # names=['Cls','Bck','','Close',
        #        '7', '8', '9', '/',
        #        '4', '5', '6', '*',
        #        '1', '2', '3', '-',
        #        '0', '.', '=', '+']
        # positons=[(i,j) for i in range(5) for j in range(4)]
        # for positon,name in zip(positons,names):
        #     if name=='':
        #         continue
        #     button=QPushButton(name)
        #     grid.addWidget(button,*positon)

        # -----------------------------评论
        # title=QLabel('Title')

        # author=QLabel('Author')
        # review=QLabel('Review')
        #
        # titleEdit=QLineEdit()
        # authorEdit=QLineEdit()
        # reviewEdit=QLineEdit()
        #
        # grid=QGridLayout()#创建方格布局
        # grid.setSpacing(10)#设置每行空白间隔
        #
        # grid.addWidget(title,1,0)
        # grid.addWidget(titleEdit,1,1)
        #
        # grid.addWidget(author,2,0)
        # grid.addWidget(authorEdit,2,1)
        #
        # grid.addWidget(review,3,0)
        # grid.addWidget(reviewEdit, 3, 1, 5, 1)#reviewEdit控件跨度5行
        #
        # self.setLayout(grid)

        textEdit=QTextEdit()
        self.setCentralWidget(textEdit)

        exitAction=QAction(QIcon('class.png'),'&Exit',self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')#提示信息
        exitAction.triggered.connect(self.close)

        self.statusBar()
        menubar=self.menuBar()
        filemenu=menubar.addMenu('&File')
        filemenu.addAction(exitAction)


        self.toolbar=self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)



        self.setGeometry(300,300,300,220)#x,y,w,h
        # self.center()#居中显示
        # self.statusBar().showMessage('Ready')#状态栏
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))
        self.show()
Esempio n. 46
0
class CrawlWindow(QWidget):
    def __init__(self):
        super(CrawlWindow, self).__init__()
        self.resize(600, 700)
        self.setWindowTitle('汽车之家口碑数据')
        self.setWindowIcon(QIcon(':reson/maoyan.ico'))

        # 初始化输出文本框
        self.log_browser = QTextBrowser(self)
        # 初始化车型ID文本框 多行文本框
        self.price = QTextEdit(self)
        # 初始化查询本地数据按钮
        self.save_combobox = QPushButton(self)
        # 初始化更新数据库按钮
        self.update_database = QPushButton(self)
        # 初始化启动按钮
        self.start_btn = QPushButton(self)
        # 初始化表格控件
        self.table = QTableWidget(self)
        # 初始化暂停按钮
        self.stop = QPushButton(self)
        # 初始化写入车型ID复选框
        self.model_id = QCheckBox('写入车型ID', self)
        # 初始化IP代理复选框
        self.checkbox = QCheckBox('启用代理', self)
        # 初始化多线程复选框
        self.start_thread = QCheckBox('启用多线程', self)

        # 界面布局 全局控件(注意参数self),用于承载全局布局
        wwg = QWidget(self)
        self.w_layout = QHBoxLayout(wwg)  # 初始化全局布局为水平模式(全局布局)
        self.h_layout = QHBoxLayout()  # 初始化水平布局(局部布局)
        self.v_layout = QVBoxLayout()  # 初始化垂直布局(局部布局)
        self.g_layout = QGridLayout()  # 初始化网格布局(局部布局)
        # self.f_layout = QFormLayout()  # 初始化表单布局(局部布局)

        # 初始化音频播放
        self.btn_sound = QSound(':reson/btn.wav', self)
        self.finish_sound = QSound(':reson/finish.wav', self)

        # 实例化线程
        self.worker = MyThread()

        # 实例化控件默认配置
        self.movie_init()  # 关键词
        self.combobox_init()  # 查询本地数据按钮
        self.update_database_init()  # 更新数据库按钮
        self.start_btn_init()  # 启动按钮
        self.table_init()  # 表格控件
        self.stop_init()  # 暂停按钮
        self.layout_init()  # 页面布局
        self.set_log_init()  # 输出控件
        self.model_id_init()  # 写入车型ID复选框
        self.checkbox_init()  # IP代理复选框
        self.start_thread_init()  # 启用多线程代理复选框

        self.ini_init()  # 初始化配置文件参数
        self.count = True  # 是否清空输入框中的文本

    def ini_init(self):
        """config.ini 配置文件初始化"""
        self.log_browser.append('GUI界面启动中...')
        self.log_browser.append('GUI界面启动成功')
        self.log_browser.append('检查配置文件...')
        self.log_browser.append('初始化配置文件')
        self.red_ini('Status', 'proxy', '0')  # 设置IP代理为不可用
        self.red_ini('Status', 'thread', '0')  # 设置多线程关闭
        self.red_ini('Version', 'model', 'None')  # 设置车型ID为空
        self.log_browser.append('初始化配置文件成功')
        self.log_browser.append('<font color="green">系统启动成功</font>')

    def movie_init(self):
        """添加车系ID输入框 初始化配置"""
        # 文本框尺寸
        self.price.setFixedSize(220, 100)
        # 设置默认显示文本
        self.price.setPlainText("输入车系ID,多个ID以英文','隔开")
        # 输入内容时清空默认显示文本内容 selectionChanged:点击文本框时发射信号
        self.price.selectionChanged.connect(self.price_clear)

    def price_clear(self):
        """清空输入框中的默认显示文本"""
        if self.count:
            self.price.setPlainText('')
        self.count = False

    def combobox_init(self):
        """查询本地数据按钮 初始化配置"""
        self.save_combobox.setText('查询本地数据')
        self.save_combobox.setEnabled(True)
        # TODO 查询本地数据信号槽
        self.save_combobox.clicked.connect(self.combobox_btn_slot)

    def update_database_init(self):
        """更新数据库按钮 初始化配置"""
        self.update_database.setText('更新数据库')
        self.update_database.setEnabled(True)
        # TODO 启动爬虫
        self.update_database.clicked.connect(self.update_database_btn_slot)

    def start_btn_init(self):
        """启动按钮 初始化配置"""
        self.start_btn.setText('启动')
        self.start_btn.setEnabled(True)
        # self.start_btn.setFixedSize(300, 30)
        self.start_btn.clicked.connect(self.start_btn_slot)

    def table_init(self):
        """表格控件 配置"""
        self.table.setColumnCount(34)
        self.table.setHorizontalHeaderLabels(['用户ID', '用户姓名', '车系ID', '车型ID', '品牌名称', '车系名称', '购买车型', '购买地点(省)', '购买地点(市)',
                                                '购车经销商', '购买时间', '裸车购买价', '油耗(百公里)', '目前行驶', '满意内容', '不满意内容', '空间(评分)', '空间内容',
                                                '动力(评分)', '动力内容', '操控(评分)', '操控内容', '油耗(评分)', '油耗内容', '舒适性(评分)', '舒适性内容',
                                                '外观(评分)', '外观内容', '内饰(评分)', '内饰内容', '性价比(评分)', '性价比内容', '购车目的', 'eid'])
        # 设置水平方向表格为自适应的伸缩模式
        # self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

    def stop_init(self):
        """暂停按钮 初始化配置"""
        self.stop.setText('停止')
        self.stop.setEnabled(False)
        self.stop.clicked.connect(self.stop_slot)

    def set_log_init(self):
        """输出控件 初始化配置"""
        self.log_browser.setFixedSize(600, 150)
        # 输出至输出文本框
        self.worker.log_signal.connect(self.set_log_slot)
        # 输出至表格控件
        self.worker.result_signal.connect(self.set_table_slot)
        # 调用清屏槽
        # self.worker.start_q.connect(self.set_start_slot)
        # 改变按钮状态
        self.worker.start_q.connect(self.set_enabled_slot)

    def model_id_init(self):
        """写入车型ID复选框 初始化配置"""
        self.model_id.stateChanged.connect(self.model_id_slot)

    def checkbox_init(self):
        """IP代理复选框 初始化配置"""
        # 复选框默认选中
        # self.checkbox.toggle()
        self.checkbox.stateChanged.connect(self.checkbox_slot)

    def start_thread_init(self):
        """开启多线程复选框 初始化配置"""
        self.start_thread.stateChanged.connect(self.start_thread_slot)

    def layout_init(self):
        """页面布局"""
        # 输出控件设置为垂直布局方式
        self.v_layout.addWidget(self.table)
        self.v_layout.addWidget(self.log_browser)

        # 局部布局 关键词输入控件、添加关键词按钮、启动按钮、暂停按钮 水平布局+网格布局方式
        self.h_layout.addWidget(self.price)  # 关键词输入控件设置为水平布局
        self.g_layout.addWidget(self.model_id, 0, 0)
        self.g_layout.addWidget(self.start_thread, 0, 1)
        self.g_layout.addWidget(self.checkbox, 0, 2)
        self.g_layout.addWidget(self.save_combobox, 1, 0)  # 添加关键词按钮设置为网格布局指定位置为第一行第一个位置
        self.g_layout.addWidget(self.update_database, 1, 1)  # 添加关键词按钮设置为网格布局指定位置为第一行第二个位置
        self.g_layout.addWidget(self.start_btn, 2, 0)  # 启动按钮设置为网格布局指定位置为第二行第一个位置
        self.g_layout.addWidget(self.stop, 2, 1)  # 暂停按钮设置为网格布局指定职位只第二行第二个位置
        self.h_layout.addLayout(self.g_layout)  # 将局部网格布局嵌套进局部水平布局(关键词输入控件、添加关键词按钮、启动按钮、暂停按钮 绑定在一起)
        self.v_layout.addLayout(self.h_layout)  # 将局部水平布局嵌套进局部垂直布局(将上一步整合的布局和输出控件平级,设置成垂直布局)

        # 将局部布局添加到全局布局中
        self.w_layout.addLayout(self.v_layout)
        # 将布局应用到窗口
        self.setLayout(self.w_layout)

    def program_btn(self, program_name):
        """程序启动"""
        # 判断添加关键词 按钮状态, True:可按,False:不可按。 isEnabled():返回控件状态
        if not self.model_id.isChecked():
            self.log_browser.append('<font color="red">请填写车型ID!!!</font>')
            return None
        self.btn_sound.play()
        self.log_browser.append('<font color="green">{}程序启动{}</font>'.format('*'*20, '*'*20))
        # 启动线程
        self.worker.name = program_name
        self.worker.start()
        # self.finish_sound.play()
        # 初始化各个按钮状态
        self.update_database.setEnabled(False)  # 更新数据库按钮
        self.price.setEnabled(False)  # 输入框
        self.save_combobox.setEnabled(False)  # 添加关键字按钮
        self.checkbox.setEnabled(False)  # IP代理复选框
        self.start_thread.setEnabled(False)  # 开启多线程复选框
        self.start_btn.setEnabled(False)  # 启动按钮
        self.stop.setEnabled(True)  # 暂停按钮

    def start_btn_slot(self):
        """启动按钮 信号槽"""
        program_name = r'DatabaseQuery.py'
        self.program_btn(program_name)


    def stop_slot(self):
        """暂停 信号槽"""
        # 改变程序状态
        self.worker.stop = True
        # 改变各按钮状态
        self.price.setEnabled(True)  # 输入框
        self.save_combobox.setEnabled(True)  # 添加关键字按钮
        self.checkbox.setEnabled(True)  # IP代理复选框
        self.start_thread.setEnabled(True)  # 开启多线程复选框
        self.start_btn.setEnabled(True)  # 启动按钮
        self.stop.setEnabled(False)  # 暂停按钮

    def model_id_slot(self):
        """车系ID输入控件 信号槽"""
        # 取消选中时的设置
        if not self.model_id.isChecked():
            # 改变输入框输入状态
            self.price.setEnabled(True)
            return
        words = self.get_words()
        if not words:
            return
        # GUI界面输入的车型ID写入文件
        words = words.replace(',', ',').replace('\n', '')
        val = self.red_ini('Version', 'model', words)
        self.log_browser.append(f'<font color="green">车型ID:[{val}]添加成功</font>')
        # 改变输入框输入状态
        self.price.setEnabled(False)

    def get_words(self):
        """提取输入框文本信息 信号槽"""
        words = self.price.toPlainText()
        if not words or "输入车系ID,多个ID以英文','隔开" in words:
            self.log_browser.append('<font color="red">请正确填写车型ID!!!</font>')
            return
        return words

    def combobox_btn_slot(self):
        """查询本地数据按钮 信号槽"""
        program_name = r'DatabaseQuery.py'
        self.program_btn(program_name)

    def update_database_btn_slot(self):
        """更新数据库按钮 信号槽"""
        program_name = r'model_koubei.py'
        self.program_btn(program_name)

    def checkbox_slot(self):
        """IP代理复选框 信号槽"""
        if self.checkbox.isChecked():
            self.red_ini('Status', 'proxy', '1')
            self.log_browser.append('<font color="green">开启IP代理</font>')
            return None
        self.red_ini('Status', 'proxy', '0')
        self.log_browser.append('<font color="red">关闭IP代理</font>')

    def start_thread_slot(self):
        """多线程复选框 信号槽"""
        if self.start_thread.isChecked():
            self.red_ini('Status', 'thread', '1')
            self.log_browser.append('<font color="green">开启多线程</font>')
            return None
        self.red_ini('Status', 'thread', '0')
        self.log_browser.append('<font color="red">关闭多线程</font>')

    def set_enabled_slot(self, status):
        """子程序结束改变按钮状态"""
        if not status:
            self.price.setEnabled(True)  # 输入框
            self.save_combobox.setEnabled(True)  # 添加关键字按钮
            self.checkbox.setEnabled(True)  # IP代理
            self.start_thread.setEnabled(True)  # 开启多线程复选框
            self.start_btn.setEnabled(True)  # 启动按钮
            self.update_database.setEnabled(True)
            self.stop.setEnabled(False)  # 暂停按钮

    def set_log_slot(self, log):
        """添加输出控件显示内容 信号槽"""
        self.log_browser.append(log)

    def set_table_slot(self, userId, eid, userName, model, specid, brandname, seriesname, specname, boughtprovincename, \
            boughtcityname, dealername, boughtdate, boughtPrice, actualOilConsumption, drivekilometer, \
            satisfaction_content, Dissatisfied_content, spaceScene, space_content, powerScene, \
            power_content, maneuverabilityScene, Control_content, oilScene, oilScene_content, \
            comfortablenessScene, Comfort_content, apperanceScene, Exterior_content, internalScene, \
            Interior_content, costefficientScene, Costeffective_content, purpose):
        """表格控件输出"""
        row = self.table.rowCount()
        self.table.insertRow(row)
        self.table.setItem(row, 0, QTableWidgetItem(userId))
        self.table.setItem(row, 1, QTableWidgetItem(userName))
        self.table.setItem(row, 2, QTableWidgetItem(model))
        self.table.setItem(row, 3, QTableWidgetItem(specid))
        self.table.setItem(row, 4, QTableWidgetItem(brandname))
        self.table.setItem(row, 5, QTableWidgetItem(seriesname))
        self.table.setItem(row, 6, QTableWidgetItem(specname))
        self.table.setItem(row, 7, QTableWidgetItem(boughtprovincename))
        self.table.setItem(row, 8, QTableWidgetItem(boughtcityname))
        self.table.setItem(row, 9, QTableWidgetItem(dealername))
        self.table.setItem(row, 10, QTableWidgetItem(boughtdate))
        self.table.setItem(row, 11, QTableWidgetItem(boughtPrice))
        self.table.setItem(row, 12, QTableWidgetItem(actualOilConsumption))
        self.table.setItem(row, 13, QTableWidgetItem(drivekilometer))
        self.table.setItem(row, 14, QTableWidgetItem(satisfaction_content))
        self.table.setItem(row, 15, QTableWidgetItem(Dissatisfied_content))
        self.table.setItem(row, 16, QTableWidgetItem(spaceScene))
        self.table.setItem(row, 17, QTableWidgetItem(space_content))
        self.table.setItem(row, 18, QTableWidgetItem(powerScene))
        self.table.setItem(row, 19, QTableWidgetItem(power_content))
        self.table.setItem(row, 20, QTableWidgetItem(maneuverabilityScene))
        self.table.setItem(row, 21, QTableWidgetItem(Control_content))
        self.table.setItem(row, 22, QTableWidgetItem(oilScene))
        self.table.setItem(row, 23, QTableWidgetItem(oilScene_content))
        self.table.setItem(row, 24, QTableWidgetItem(comfortablenessScene))
        self.table.setItem(row, 25, QTableWidgetItem(Comfort_content))
        self.table.setItem(row, 26, QTableWidgetItem(apperanceScene))
        self.table.setItem(row, 27, QTableWidgetItem(Exterior_content))
        self.table.setItem(row, 28, QTableWidgetItem(internalScene))
        self.table.setItem(row, 29, QTableWidgetItem(Interior_content))
        self.table.setItem(row, 30, QTableWidgetItem(costefficientScene))
        self.table.setItem(row, 31, QTableWidgetItem(Costeffective_content))
        self.table.setItem(row, 32, QTableWidgetItem(purpose))
        self.table.setItem(row, 33, QTableWidgetItem(eid))

    def set_start_slot(self):
        """输出框窗口清空 信号槽"""
        self.log_browser.clear()

    def red_ini(self, section, name, val):
        """读取、修改 ini配置文件"""
        file = PATH + '\config.ini'  # 文件路径
        cp = ConfigParser()  # 实例化
        cp.read(file, encoding='utf-8')  # 读取文件
        cp.set(section, name, val)  # 修改数据
        # 写入新数据
        with open(file, 'w', encoding='utf-8') as f:
            cp.write(f)

        # 读取修改后数据
        val = cp.get(section, name)
        return val

    def closeEvent(self, event):
        """程序退出确认弹窗"""
        reply = QMessageBox.question(self, '信息', '确认退出吗?',
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
Esempio n. 47
0
class Ui_Dialog(QWidget):

    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        # 窗口大小
        # Dialog.resize(1050, 930)
        Dialog.setFixedSize(1150, 920)
        # 窗口名称
        Dialog.setWindowTitle("IP Scrap Tool")
        # 窗口图标
        Dialog.setWindowIcon(QtGui.QIcon('Data/Icon/icon_spider.png'))
        # 窗口居中
        self.windowCenter()
        # 字体
        font = QtGui.QFont()
        font.setFamily('Fira code')
        # 数据库连接配置
        self.DB_CONFIG = {
            'host': 'localhost',
            'port': 3306,
            'user': '******',
            'password': '******',
            'charset': 'utf8mb4',
            'cursorclass': pymysql.cursors.DictCursor
        }
        self.DB_NAME = 'ippool'
        self.targetUrl = 'https://www.xicidaili.com'

        # 结果显示框布局参数
        self.resBrowX = 550
        self.resBrowY = 240
        self.resBrowHeigh = 570
        self.resBrowWidth = 590

        self.statusLabY = 30
        self.statusLabHeigh = 30
        self.statusLabWidth = 120
        self.statusLabX = \
            self.resBrowX + self.resBrowWidth / 2 - self.statusLabWidth / 2

        self.staTxtBrowY = 70
        self.staTxtBrowHeigh = 110
        self.staTxtBrowWidth = 300
        self.staTxtBrowX = self.resBrowX + \
            self.resBrowWidth / 2 - self.staTxtBrowWidth / 2

        self.resLabY = 200
        self.resLabHeigh = 30
        self.resLabWidth = 122
        self.resLabX = \
            self.resBrowX + self.resBrowWidth / 2 - self.resLabWidth / 2

        # HTML文本框
        self.htmlLabel = QLabel(Dialog)
        self.htmlLabel.setGeometry(QtCore.QRect(185, 30, 150, 30))
        self.htmlLabel.setObjectName("htmlLabel")
        self.htmlLabel.setText("HTML文本框")
        self.htmlLabel.setStyleSheet('''
            QLabel#htmlLabel{
                background: #C35;
                padding: 28px;
                color: #FFF;
                font: 900 黑体;
                font-size: 14px;
                }
            ''')
        # ’浏览器‘按钮
        self.browserButton = QPushButton(Dialog)
        self.browserButton.setGeometry(QtCore.QRect(350, 30, 32, 32))
        self.browserButton.setObjectName("browserButton")
        self.browserButton.setFlat(1)
        self.browserButton.setToolTip('打开浏览器')
        self.browserButton.setIcon(QtGui.QIcon('Data/Icon/browser.png'))
        self.browserButton.setIconSize(QtCore.QSize(32, 32))
        self.browserButton.setStyleSheet('''
            QpushButton#browserButton{
                background: transparent;
                boder-radius: 16px;
            }
            ''')
        self.browserButton.clicked.connect(self.openBrowser)

        self.htmlTextEdit = QTextEdit(Dialog)
        self.htmlTextEdit.setFont(font)
        self.htmlTextEdit.setGeometry(QtCore.QRect(30, 70, 490, 760))
        self.htmlTextEdit.setMouseTracking(True)
        self.htmlTextEdit.setObjectName("htmlTextEdit")
        self.htmlTextEdit.setPlaceholderText("输入原始HTML文本")
        self.htmlTextEdit.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.htmlTextEdit.setHorizontalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        with open("Data/ScrollBar.qss", "rb") as fp:
            content = fp.read()
            encoding = chardet.detect(content) or {}
            content = content.decode(encoding.get("encoding") or "utf-8")
        # self.htmlTextEdit.setText(content)
        self.htmlTextEdit.setStyleSheet(content)

        # ‘抓取’按钮
        self.scrapButton = QPushButton(Dialog)
        self.scrapButton.setGeometry(QtCore.QRect(
            self.resBrowX, self.staTxtBrowY, 50, 42))
        self.scrapButton.setObjectName("scrapButton")
        self.scrapButton.setText("爬取")
        self.scrapButton.setIcon(
            QtGui.QIcon(QtGui.QPixmap("Data/Icon/extract.png")))
        self.scrapButton.clicked.connect(self.scrapEvent)
        self.scrapButton.setStyleSheet('''
            QPushButton#scrapButton{
                border-style: outset;
                border-width: 2px;
                border-radius: 10px;
                border-color: beige;
                font: bold 16px;
                color: #FFF;
                min-width: 5em;
                padding: 6px;
                border-radius: 20px;
                background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                         stop: 0 #1DB4E1,
                                         stop: 1.0 #428BBC);
            }
            QPushButton#scrapButton:hover {
                background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                         stop: 0 #34C,
                                         stop: 1.0 #A0ADDF);
            }
            QPushButton#scrapButton:pressed {
                background-color: #2B0DF1;
                border-style: inset;
            }
                ''')

        # ‘清空’按钮
        self.cleanButton = QPushButton(Dialog)
        self.cleanButton.setGeometry(QtCore.QRect(
            self.resBrowX, self.staTxtBrowY + self.staTxtBrowHeigh - 42,
            50, 42))
        self.cleanButton.setObjectName("cleanButton")
        self.cleanButton.setText("清空")
        self.cleanButton.setIcon(
            QtGui.QIcon(QtGui.QPixmap("Data/Icon/clean_text.png")))
        self.cleanButton.clicked.connect(self.cleanEvent)
        self.cleanButton.setStyleSheet('''
            QPushButton#cleanButton{
            border-style: outset;
            border-width: 2px;
            border-radius: 10px;
            border-color: beige;
            font: bold 16px;
            color: #FFF;
            min-width: 5em;
            padding: 6px;
            border-radius: 20px;
            background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                         stop: 0 #1DB4E1,
                                         stop: 1.0 #428BBC);
            }
            QPushButton#cleanButton:hover{
            background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                             stop: 1.0 #428BBC,
                                             stop: 0 #465EFB);
            }
            QPushButton#cleanButton:pressed {
                background-color: #00F;
                border-style: inset;
            }
        ''')

        # 状态显示框

        self.statusLabel = QLabel(Dialog)
        self.statusLabel.setGeometry(QtCore.QRect(self.statusLabX,
                                                  self.statusLabY,
                                                  self.statusLabWidth,
                                                  self.statusLabHeigh))
        self.statusLabel.setObjectName("statusLabel")
        self.statusLabel.setText("状态显示")
        self.statusLabel.setStyleSheet('''
            QLabel#statusLabel{
            background:#C35;
            padding: 28px;
            color:#FFF;
            font: 900 黑体;
            font-size: 14px;
            }
            ''')

        self.statusTextBrowser = QTextBrowser(Dialog)
        self.statusTextBrowser.setFont(font)
        self.statusTextBrowser.setGeometry(QtCore.QRect(self.staTxtBrowX,
                                                        self.staTxtBrowY,
                                                        self.staTxtBrowWidth,
                                                        self.staTxtBrowHeigh
                                                        ))
        self.statusTextBrowser.setObjectName("statusTextBrowser")
        self.statusTextBrowser.setText('')

        # 数据库查询结果文本显示框

        self.resultLabel = QLabel(Dialog)
        self.resultLabel.setGeometry(QtCore.QRect(self.resLabX,
                                                  self.resLabY,
                                                  self.resLabWidth,
                                                  self.resLabHeigh))
        # self.resultLabel.setGeometry(QtCore.QRect(724, 200, 150, 30))
        self.resultLabel.setObjectName("resultLabel")
        self.resultLabel.setText("数据显示")
        self.resultLabel.setStyleSheet('''QLabel#resultLabel{
                background:#C35;
                padding: 28px;
                color: #FFF;
                font: 900 黑体;
                font-size: 14px;}
            ''')
        self.resTextBrowser = QTextBrowser(Dialog)
        self.resTextBrowser.setFont(font)
        self.resTextBrowser.setGeometry(QtCore.QRect(self.resBrowX,
                                                     self.resBrowY,
                                                     self.resBrowHeigh,
                                                     self.resBrowWidth))
        self.resTextBrowser.setObjectName("resTextBrowser")
        self.resTextBrowser.setPlaceholderText('数据显示')
        self.resTextBrowser.setText('')
        self.resTextBrowser.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.resTextBrowser.setHorizontalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        with open("Data/ScrollBar.qss", "rb") as fp:
            content = fp.read()
            encoding = chardet.detect(content) or {}  # 检测编码
            content = content.decode(encoding.get("encoding") or "utf-8")
        # self.htmlTextEdit.setText(content)
        self.resTextBrowser.setStyleSheet(content)

        # ‘查询’按钮
        self.showAllButton = QPushButton(Dialog)
        self.showAllButton.setGeometry(QtCore.QRect(920, 200, 30, 30))
        self.showAllButton.setObjectName("showAllButton")
        self.showAllButton.setToolTip('查询所有数据')
        self.showAllButton.setFlat(1)
        self.showAllButton.setStyleSheet('''
            QpushButton#showAllButton{
            border-radius: 13px;
            }
            ''')
        self.showAllButton.setIcon(QtGui.QIcon('Data/Icon/showAll.png'))
        self.showAllButton.setIconSize(QtCore.QSize(35, 35))
        self.showAllButton.clicked.connect(self.showAllRecords)

        self.checkConnection()
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def windowCenter(self):
        """ 窗口居中 """
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def closeEvent(self, event):  # 函数名固定不可变
        reply = QMessageBox.question(
            self, u'警告', u'确认退出?',
            QMessageBox.Yes,
            QMessageBox.No)
        # QMessageBox.question(self,u'弹窗名',u'弹窗内容',选项1,选项2)
        if reply == QtGui.QMessageBox.Yes:
            event.accept()  # 关闭窗口
        else:
            event.ignore()  # 忽视点击X事件

    # ‘爬取’按钮点击调用
    @QtCore.pyqtSlot()
    def scrapEvent(self):
        """
        获取HTML文本框中的文本,提取IP信息,保存到数据库
        """
        try:
            pymysql.connect(**self.DB_CONFIG)
            conn = pymysql.connect(**self.DB_CONFIG)
            conn.autocommit(1)
            cursor = conn.cursor()
            # Table_NAME = 'ipinfo'
            IPAddr = ''
            serverAddr = ''
            port = 0
            text = self.htmlTextEdit.toPlainText()
            # print(text, type(text))
            if text:
                # <table id="ip_list">
                htmlCheck = re.match(r'[<table id="ip_list">]', text)
                if htmlCheck:
                    try:
                        conn.select_db(self.DB_NAME)
                        self.statusTextBrowser.setText('[INFO]: 连接数据库')
                        self.statusTextBrowser.setAlignment(
                            QtCore.Qt.AlignCenter)
                        html = Selector(text=text)
                        self.htmlTextEdit.setHtml(text)
                        # self.resTextBrowser.setText(str(html))
                        self.resTextBrowser.setText('')
                        preRecordNum = cursor.execute(
                            'SELECT DISTINCT * FROM IPINFO;')
                        for tr in html.xpath('//tr[@class]'):
                            IPAddr = tr.xpath('td[2]/text()').extract_first()
                            port = int(
                                tr.xpath('td[3]/text()').extract_first())
                            serverAddr = tr.xpath(
                                'td[4]/a/text()').extract_first()
                            cursor.execute("INSERT INTO ipinfo values(%d, %d, "
                                           "'%s'); " % (
                                               self.IPSwapLong(IPAddr),
                                               port,
                                               serverAddr))
                            self.resTextBrowser.append(
                                'IP地址: %15s, 端口: %5d, 服务器地址: %s' %
                                (IPAddr, port, serverAddr))
                        # 查询数据条目
                        recordNum = cursor.execute(
                            'SELECT DISTINCT * FROM IPINFO;')
                        self.statusTextBrowser.setText(' [INFO]: 数据获取成功')
                        self.statusTextBrowser.setAlignment(
                            QtCore.Qt.AlignCenter)
                        self.statusTextBrowser.append(
                            '新插入数据数目:%d条' % (recordNum - preRecordNum))
                        self.statusTextBrowser.setAlignment(
                            QtCore.Qt.AlignCenter)
                        self.statusTextBrowser.append(
                            '数据库数据数目:%d条' % recordNum)
                        self.statusTextBrowser.setAlignment(
                            QtCore.Qt.AlignCenter)

                    except Exception:
                        import traceback
                        traceback.print_exc()
                        conn.rollback()
                        self.statusTextBrowser.append(
                            '✘[EEEOR]: 出现错误,数据库回滚')
                        self.statusTextBrowser.setAlignment(
                            QtCore.Qt.AlignCenter)
                        self.resTextBrowser.setText('')
                    finally:
                        # 关闭游标连接
                        cursor.close()
                        self.statusTextBrowser.append(
                            ' [INFO]: 关闭游标连接')
                        # 关闭数据库连接
                        conn.close()
                        self.statusTextBrowser.append(
                            ' [INFO]: 关闭数据库连接')

                # 文本格式错误
                else:
                    self.statusTextBrowser.setText(
                        '✘[EEEOR]: 文本格式错误')
                    self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)

            # 无内容
            else:
                self.statusTextBrowser.setText(' [WARNING]: 无内容')
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
        except Exception:
            self.statusTextBrowser.setText('')
            self.statusTextBrowser.append(
                '✘[EEEOR]: 由于目标计算机积极拒绝,无法连接')
            self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
            self.statusTextBrowser.append(
                '[INFO]: 请检查数据库连接状态')
            self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
        finally:
            pass

    # ‘清空’按钮点击调用
    @QtCore.pyqtSlot()
    def cleanEvent(self):
        """
        清空所有内容
        """
        self.htmlTextEdit.setText('')
        self.statusTextBrowser.setText('')
        self.resTextBrowser.setText('')

    # ‘查询’按钮点击调用
    @QtCore.pyqtSlot()
    def showAllRecords(self):
        """
            获取数据库所有数据
        """
        self.resTextBrowser.setText('')
        try:
            pymysql.connect(**self.DB_CONFIG)
            try:
                conn = pymysql.connect(**self.DB_CONFIG)
                self.statusTextBrowser.append('[INFO]: 连接数据库')
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
                conn.autocommit(1)
                cursor = conn.cursor()
                conn.select_db(self.DB_NAME)
                recordNum = cursor.execute('SELECT DISTINCT * FROM IPINFO;')
                self.statusTextBrowser.append('数据库数据数目:%d条' % recordNum)
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)

                table_records = cursor.fetchall()
                for each_record in table_records:
                    res = 'IP地址: %15s, 端口: %5d, 服务器地址: %s' % (
                        self.IPSwapLong(each_record['IP地址']),
                        each_record['端口'],
                        each_record['服务器地址'])
                    self.resTextBrowser.append(res)
                self.statusTextBrowser.append('[INFO]: 查询成功')
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
            except Exception:
                import traceback
                traceback.print_exc()
                conn.rollback()
                self.statusTextBrowser.append(
                    '✘[EEEOR]: 出现错误,数据库回滚')
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
                self.resTextBrowser.setText('')
            finally:
                # 关闭游标连接
                cursor.close()
                self.statusTextBrowser.append(
                    ' [INFO]: 关闭游标连接')
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
                # 关闭数据库连接
                conn.close()
                self.statusTextBrowser.append(
                    ' [INFO]: 关闭数据库连接')
                self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
        except Exception:
            self.statusTextBrowser.setTextColor('#FF0000')
            self.statusTextBrowser.append(
                '✘[EEEOR]: 由于目标计算机积极拒绝,无法连接')
            self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
            self.statusTextBrowser.append(
                '[INFO]: 请检查数据库连接状态')
            self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
        finally:
            pass

    # ‘浏览器’按钮点击调用
    @QtCore.pyqtSlot()
    def openBrowser(self):
        """
            打开浏览器
        """
        webbrowser.open(self.targetUrl)

    def checkConnection(self):
        """
        检查数据库是否连接
        """
        try:
            pymysql.connect(**self.DB_CONFIG)
        except Exception as err:
            self.statusTextBrowser.append(
                '✘[EEEOR]: 由于目标计算机积极拒绝,无法连接')
            self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
            self.statusTextBrowser.append(
                '[INFO]: 请检查数据库连接状态')
            self.statusTextBrowser.setAlignment(QtCore.Qt.AlignCenter)
        finally:
            pass

    def IPSwapLong(self, IPorLong):
        """
        IP地址和长整型数转换
        参数 IPorLong (str) ='255.255.255.255' 返回值 (int): 4294967295
        参数 IPorLong (int) = 1873914904       返回值 (str): 111.177.172.24
        """
        if isinstance(IPorLong, str):
            res = re.findall(r'[\d]+', IPorLong)
            longRes = (int(res[0]) << 24) + (int(res[1]) << 16) + \
                (int(res[2]) << 8) + int(res[3])
            return longRes
        else:
            IPRes = str(IPorLong >> 24) + '.' + str((IPorLong >> 16) & 255) + \
                '.' + str((IPorLong >> 8) & 255) + '.' + str(IPorLong & 255)
            return IPRes
Esempio n. 48
0
class MyWindow(QWidget):

    sig_abort_workers = pyqtSignal()#关闭信号

    def __init__(self):
        super(MyWindow, self).__init__()
        self.setWindowTitle("智能识别")
        self.resize(800,450)

        self.txt_print = QTextEdit()
        self.start_btn = QPushButton()
        self.stop_btn = QPushButton()
        self.Camera_label = QLabel()
        self.wait_label = QLabel()

        # self.txt_log.setText("点击'开始‘ 开始识别")
        self.start_btn.setText("开始识别")
        self.stop_btn.setText("停止识别")
        self.stop_btn.setDisabled(True)
        self.Camera_label.setText("未开始")
        self.wait_label.setText("等待中")
        self.start_btn.clicked.connect(self.start_workers)
        self.stop_btn.clicked.connect(self.abort_workers)

        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.start_btn,1,0)
        grid.addWidget(self.stop_btn,2,0)
        grid.addWidget(self.txt_print,4,0)
        grid.addWidget(self.wait_label,3,0)
        grid.addWidget(self.Camera_label,1,1,4,4)
        self.setLayout(grid)

        QThread.currentThread().setObjectName('main')
        self.__workers_done = None
        self.__threads = None

    def start_workers(self):
        self.start_btn.setDisabled(True)
        self.stop_btn.setEnabled(True)
        self.txt_print.clear()
        self.txt_print.append("识别中..")
        self.__workers_done = 0
        self.__threads = []
        self.thread_ID=["txt_print","Camera_label","wait_label"]
        for idx in range(len(self.thread_ID)):
            worker = Worker(idx)
            thread = QThread()
            thread.setObjectName(self.thread_ID[idx])
            self.__threads.append((thread,worker))
            worker.moveToThread(thread)
            worker.sig_working.connect(self.on_woker_working)
            worker.sig_finished.connect(self.on_worker_finished)

            self.sig_abort_workers.connect(worker.abort)
            thread.started.connect(worker.work)
            thread.start()

    @pyqtSlot(str,str)
    def on_woker_working(self,worker_id:str,data:str):

        if(worker_id == 'txt_print'):
            self.txt_print.clear()
            self.txt_print.append(data)
        if(worker_id == 'Camera_label'):
            self.Camera_label.setPixmap(QPixmap("img_data.jpg"))
        if(worker_id == 'wait_label'):
            wait_imag = 'D:\pycharmProject\plantREC\loadImag\\fish-%s.png'%data
            self.wait_label.setPixmap(QPixmap(wait_imag))

    @pyqtSlot()
    def abort_workers(self):
        self.sig_abort_workers.emit()

    @pyqtSlot(int)
    def on_worker_finished(self,worker_id):
        print("wait shutdwon")
        self.__workers_done += 1
        print('shutdown no'+str(self.__workers_done))
        thread,worker = self.__threads[worker_id]
        thread.quit()
        thread.wait()

        if self.__workers_done == len(self.thread_ID):
            self.stop_btn.setDisabled(True)
            self.start_btn.setEnabled(True)
Esempio n. 49
0
    def __init__(self, parent=None):
        super().__init__(parent)

        # Initialize word database        
        self.word = Word('words.txt')

        # Hangman display window
        self.hangmanWindow = QTextEdit()
        self.hangmanWindow.setReadOnly(True)
        self.hangmanWindow.setAlignment(Qt.AlignLeft)
        font = self.hangmanWindow.font()
        font.setFamily('Courier New')
        self.hangmanWindow.setFont(font)

        # Layout
        hangmanLayout = QGridLayout()
        hangmanLayout.addWidget(self.hangmanWindow, 0, 0)

        # Status Layout creation
        statusLayout = QGridLayout()

         # Display widget for current status
        self.currentWord = QLineEdit()
        self.currentWord.setReadOnly(True)
        
        # 화면에 표시되는 폭을 조절하는 방식 선택 / method 사용 x
        self.currentWord.setMaxLength(len(self.secretWord) * 2)
        self.currentWord.setAlignment(Qt.AlignCenter)
        font = self.currentWord.font()
        font.setPointSize(font.pointSize() + 8)
        self.currentWord.setFont(font)
        statusLayout.addWidget(self.currentWord, 0, 0, 1, 2)
        # Display widget for already used characters
        self.guessedChars = QLineEdit()
        self.guessedChars.setReadOnly(True)
        self.guessedChars.setAlignment(Qt.AlignLeft)
        self.guessedChars.setMaxLength(52)
        statusLayout.addWidget(self.guessedChars, 1, 0, 1, 2)

        # Display widget for message output
        self.message = QLineEdit()
        self.message.setReadOnly(True)
        self.message.setAlignment(Qt.AlignLeft)
        self.message.setMaxLength(52)
        statusLayout.addWidget(self.message, 2, 0, 1, 2)

        # Input widget for user selected characters
        self.charInput = QLineEdit()
        self.charInput.setMaxLength(1)
        statusLayout.addWidget(self.charInput, 3, 0)

        # Button for submitting a character
        self.guessButton = QToolButton()
        self.guessButton.setText('Guess!')
        self.guessButton.clicked.connect(self.guessClicked)
        statusLayout.addWidget(self.guessButton, 3, 1)

        # Button for a new game
        self.newGameButton = QToolButton()
        self.newGameButton.setText('New Game')
        self.newGameButton.clicked.connect(self.startGame)
        statusLayout.addWidget(self.newGameButton, 4, 0)

        # Layout placement
        mainLayout = QGridLayout()
        mainLayout.setSizeConstraint(QLayout.SetFixedSize)
        mainLayout.addLayout(hangmanLayout, 0, 0)
        mainLayout.addLayout(statusLayout, 0, 1)

        self.setLayout(mainLayout)

        self.setWindowTitle('Hangman Game')

        # Start a new game on application launch!
        self.startGame()
Esempio n. 50
0
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        # 窗口大小
        # Dialog.resize(1050, 930)
        Dialog.setFixedSize(1150, 920)
        # 窗口名称
        Dialog.setWindowTitle("IP Scrap Tool")
        # 窗口图标
        Dialog.setWindowIcon(QtGui.QIcon('Data/Icon/icon_spider.png'))
        # 窗口居中
        self.windowCenter()
        # 字体
        font = QtGui.QFont()
        font.setFamily('Fira code')
        # 数据库连接配置
        self.DB_CONFIG = {
            'host': 'localhost',
            'port': 3306,
            'user': '******',
            'password': '******',
            'charset': 'utf8mb4',
            'cursorclass': pymysql.cursors.DictCursor
        }
        self.DB_NAME = 'ippool'
        self.targetUrl = 'https://www.xicidaili.com'

        # 结果显示框布局参数
        self.resBrowX = 550
        self.resBrowY = 240
        self.resBrowHeigh = 570
        self.resBrowWidth = 590

        self.statusLabY = 30
        self.statusLabHeigh = 30
        self.statusLabWidth = 120
        self.statusLabX = \
            self.resBrowX + self.resBrowWidth / 2 - self.statusLabWidth / 2

        self.staTxtBrowY = 70
        self.staTxtBrowHeigh = 110
        self.staTxtBrowWidth = 300
        self.staTxtBrowX = self.resBrowX + \
            self.resBrowWidth / 2 - self.staTxtBrowWidth / 2

        self.resLabY = 200
        self.resLabHeigh = 30
        self.resLabWidth = 122
        self.resLabX = \
            self.resBrowX + self.resBrowWidth / 2 - self.resLabWidth / 2

        # HTML文本框
        self.htmlLabel = QLabel(Dialog)
        self.htmlLabel.setGeometry(QtCore.QRect(185, 30, 150, 30))
        self.htmlLabel.setObjectName("htmlLabel")
        self.htmlLabel.setText("HTML文本框")
        self.htmlLabel.setStyleSheet('''
            QLabel#htmlLabel{
                background: #C35;
                padding: 28px;
                color: #FFF;
                font: 900 黑体;
                font-size: 14px;
                }
            ''')
        # ’浏览器‘按钮
        self.browserButton = QPushButton(Dialog)
        self.browserButton.setGeometry(QtCore.QRect(350, 30, 32, 32))
        self.browserButton.setObjectName("browserButton")
        self.browserButton.setFlat(1)
        self.browserButton.setToolTip('打开浏览器')
        self.browserButton.setIcon(QtGui.QIcon('Data/Icon/browser.png'))
        self.browserButton.setIconSize(QtCore.QSize(32, 32))
        self.browserButton.setStyleSheet('''
            QpushButton#browserButton{
                background: transparent;
                boder-radius: 16px;
            }
            ''')
        self.browserButton.clicked.connect(self.openBrowser)

        self.htmlTextEdit = QTextEdit(Dialog)
        self.htmlTextEdit.setFont(font)
        self.htmlTextEdit.setGeometry(QtCore.QRect(30, 70, 490, 760))
        self.htmlTextEdit.setMouseTracking(True)
        self.htmlTextEdit.setObjectName("htmlTextEdit")
        self.htmlTextEdit.setPlaceholderText("输入原始HTML文本")
        self.htmlTextEdit.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.htmlTextEdit.setHorizontalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        with open("Data/ScrollBar.qss", "rb") as fp:
            content = fp.read()
            encoding = chardet.detect(content) or {}
            content = content.decode(encoding.get("encoding") or "utf-8")
        # self.htmlTextEdit.setText(content)
        self.htmlTextEdit.setStyleSheet(content)

        # ‘抓取’按钮
        self.scrapButton = QPushButton(Dialog)
        self.scrapButton.setGeometry(QtCore.QRect(
            self.resBrowX, self.staTxtBrowY, 50, 42))
        self.scrapButton.setObjectName("scrapButton")
        self.scrapButton.setText("爬取")
        self.scrapButton.setIcon(
            QtGui.QIcon(QtGui.QPixmap("Data/Icon/extract.png")))
        self.scrapButton.clicked.connect(self.scrapEvent)
        self.scrapButton.setStyleSheet('''
            QPushButton#scrapButton{
                border-style: outset;
                border-width: 2px;
                border-radius: 10px;
                border-color: beige;
                font: bold 16px;
                color: #FFF;
                min-width: 5em;
                padding: 6px;
                border-radius: 20px;
                background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                         stop: 0 #1DB4E1,
                                         stop: 1.0 #428BBC);
            }
            QPushButton#scrapButton:hover {
                background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                         stop: 0 #34C,
                                         stop: 1.0 #A0ADDF);
            }
            QPushButton#scrapButton:pressed {
                background-color: #2B0DF1;
                border-style: inset;
            }
                ''')

        # ‘清空’按钮
        self.cleanButton = QPushButton(Dialog)
        self.cleanButton.setGeometry(QtCore.QRect(
            self.resBrowX, self.staTxtBrowY + self.staTxtBrowHeigh - 42,
            50, 42))
        self.cleanButton.setObjectName("cleanButton")
        self.cleanButton.setText("清空")
        self.cleanButton.setIcon(
            QtGui.QIcon(QtGui.QPixmap("Data/Icon/clean_text.png")))
        self.cleanButton.clicked.connect(self.cleanEvent)
        self.cleanButton.setStyleSheet('''
            QPushButton#cleanButton{
            border-style: outset;
            border-width: 2px;
            border-radius: 10px;
            border-color: beige;
            font: bold 16px;
            color: #FFF;
            min-width: 5em;
            padding: 6px;
            border-radius: 20px;
            background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                         stop: 0 #1DB4E1,
                                         stop: 1.0 #428BBC);
            }
            QPushButton#cleanButton:hover{
            background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                             stop: 1.0 #428BBC,
                                             stop: 0 #465EFB);
            }
            QPushButton#cleanButton:pressed {
                background-color: #00F;
                border-style: inset;
            }
        ''')

        # 状态显示框

        self.statusLabel = QLabel(Dialog)
        self.statusLabel.setGeometry(QtCore.QRect(self.statusLabX,
                                                  self.statusLabY,
                                                  self.statusLabWidth,
                                                  self.statusLabHeigh))
        self.statusLabel.setObjectName("statusLabel")
        self.statusLabel.setText("状态显示")
        self.statusLabel.setStyleSheet('''
            QLabel#statusLabel{
            background:#C35;
            padding: 28px;
            color:#FFF;
            font: 900 黑体;
            font-size: 14px;
            }
            ''')

        self.statusTextBrowser = QTextBrowser(Dialog)
        self.statusTextBrowser.setFont(font)
        self.statusTextBrowser.setGeometry(QtCore.QRect(self.staTxtBrowX,
                                                        self.staTxtBrowY,
                                                        self.staTxtBrowWidth,
                                                        self.staTxtBrowHeigh
                                                        ))
        self.statusTextBrowser.setObjectName("statusTextBrowser")
        self.statusTextBrowser.setText('')

        # 数据库查询结果文本显示框

        self.resultLabel = QLabel(Dialog)
        self.resultLabel.setGeometry(QtCore.QRect(self.resLabX,
                                                  self.resLabY,
                                                  self.resLabWidth,
                                                  self.resLabHeigh))
        # self.resultLabel.setGeometry(QtCore.QRect(724, 200, 150, 30))
        self.resultLabel.setObjectName("resultLabel")
        self.resultLabel.setText("数据显示")
        self.resultLabel.setStyleSheet('''QLabel#resultLabel{
                background:#C35;
                padding: 28px;
                color: #FFF;
                font: 900 黑体;
                font-size: 14px;}
            ''')
        self.resTextBrowser = QTextBrowser(Dialog)
        self.resTextBrowser.setFont(font)
        self.resTextBrowser.setGeometry(QtCore.QRect(self.resBrowX,
                                                     self.resBrowY,
                                                     self.resBrowHeigh,
                                                     self.resBrowWidth))
        self.resTextBrowser.setObjectName("resTextBrowser")
        self.resTextBrowser.setPlaceholderText('数据显示')
        self.resTextBrowser.setText('')
        self.resTextBrowser.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.resTextBrowser.setHorizontalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        with open("Data/ScrollBar.qss", "rb") as fp:
            content = fp.read()
            encoding = chardet.detect(content) or {}  # 检测编码
            content = content.decode(encoding.get("encoding") or "utf-8")
        # self.htmlTextEdit.setText(content)
        self.resTextBrowser.setStyleSheet(content)

        # ‘查询’按钮
        self.showAllButton = QPushButton(Dialog)
        self.showAllButton.setGeometry(QtCore.QRect(920, 200, 30, 30))
        self.showAllButton.setObjectName("showAllButton")
        self.showAllButton.setToolTip('查询所有数据')
        self.showAllButton.setFlat(1)
        self.showAllButton.setStyleSheet('''
            QpushButton#showAllButton{
            border-radius: 13px;
            }
            ''')
        self.showAllButton.setIcon(QtGui.QIcon('Data/Icon/showAll.png'))
        self.showAllButton.setIconSize(QtCore.QSize(35, 35))
        self.showAllButton.clicked.connect(self.showAllRecords)

        self.checkConnection()
        QtCore.QMetaObject.connectSlotsByName(Dialog)
class MyApp(QWidget):

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

    def initUI(self):
        grid = QGridLayout()
        self.setLayout(grid)

        '''btn = QPushButton('Quit', self)
        btn.move(50, 50)
        btn.resize(btn.sizeHint())
        btn.clicked.connect(sys.exit())'''

        select = QLabel('파일: ')
        bpmModeLabel = QLabel('소용돌이 모드: ')

        self.fileSelected = QLineEdit()
        self.fileSelected.setReadOnly(True)
        self.fileSelected.setPlaceholderText('선택된 파일이 없습니다.')

        fileMenu = QPushButton('열기')
        fileMenu.clicked.connect(self.showDialog)

        self.dir = ''

        self.run = QPushButton('승수 넣기')
        self.run.setEnabled(False)
        self.run.clicked.connect(self.makeBpm)

        self.bpmMode = QComboBox()
        self.bpmMode.addItem('소용돌이 X')
        self.bpmMode.addItem('안으로 돌기')
        self.bpmMode.addItem('밖으로 돌기')
        #bpmMode.addItem('사용자 지정')

        statusLabel = QLabel('상태: ')
        self.status = QTextEdit()
        self.status.setReadOnly(True)

        grid.addWidget(select, 0, 0)
        grid.addWidget(self.fileSelected, 0, 1)
        grid.addWidget(fileMenu, 0, 2)

        grid.addWidget(bpmModeLabel, 1, 0)
        grid.addWidget(self.run, 1, 2)
        grid.addWidget(self.bpmMode, 1, 1)

        grid.addWidget(statusLabel, 2, 0)
        grid.addWidget(self.status, 2, 1)

        os.system('cls')
        self.setWindowTitle('Magicshape BPM Multiplier')
        self.setGeometry(300, 300, 450, 120)
        self.setFixedSize(450, 140)
        self.show()

    def showDialog(self):
        filters = "ADOFAI Custom Files (*.adofai)"
        fname = QFileDialog.getOpenFileName(self, 'Open file', './', filters)
        if fname[0]:
            self.fileSelected.setText(fname[0])
            self.dir = fname[0]
        if str(fname[0]).endswith('.adofai'):
            self.run.setEnabled(True)
        else:
            self.run.setEnabled(False)

    def makeBpm(self):
        global angle
        try:
            data = open(self.dir, mode='r', encoding='utf-8-sig').read()
            data = data.replace(', }', ' }')
            data = data.replace(' }\n', ' },\n')
            data = data.replace(' },\n	]',' }\n	]')
            data = json.loads(data)
            pathData = data['pathData']
            pathList = []
            for i in range(len(pathData) - 1):
                try:
                    pre = theAngle[pathData[i]]
                    lat = theAngle[pathData[i+1]]
                    pathList.append(getAngle(pre, lat))
                except KeyError as e:
                    print('Warning: Unsupported angle! ({})'.format(e))
                    pathList.append(180)
            actions = data['actions']
            tmp = 0
            twirl = 0
            direction = 0
            for i in pathList:
                if self.bpmMode.currentText() == '소용돌이 X':
                    actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp]/pathList[tmp-1] },)
                elif self.bpmMode.currentText() == '안으로 돌기':
                    if direction % 2 == 0:
                        angle = pathList[tmp]
                    else:
                        angle = (((359 - pathList[tmp]) % 360) + 1)
                    if angle <= 180:
                        if direction % 2 == 0:
                            actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp]/pathList[tmp-1] },) # 기본모드
                        else:
                            actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": (((359 - pathList[tmp]) % 360) + 1) / (((359 - pathList[tmp-1]) % 360) + 1) },)
                        twirl = 0
                    else:
                        actions.append({ "floor": tmp + 1, "eventType": "Twirl" },)
                        if direction % 2 == 0:
                            if twirl == 0:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": (((359 - pathList[tmp]) % 360) + 1) / pathList[tmp-1] },)
                            else:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": (((359 - pathList[tmp]) % 360) + 1) / pathList[tmp-1] },)
                        else:
                            if twirl == 0:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp] / pathList[tmp-1] },)
                                
                            else:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp] / (((359 - pathList[tmp-1]) % 360) + 1) },)
                        direction += 1
                        twirl = 1
                elif self.bpmMode.currentText() == '밖으로 돌기':
                    if direction % 2 == 0:
                        angle = pathList[tmp]
                    else:
                        angle = (((359 - pathList[tmp]) % 360) + 1)
                    if angle >= 180:
                        if direction % 2 == 0:
                            actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp]/pathList[tmp-1] },) # 기본모드
                        else:
                            actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": (((359 - pathList[tmp]) % 360) + 1) / (((359 - pathList[tmp-1]) % 360) + 1) },)
                        twirl = 0
                    else:
                        actions.append({ "floor": tmp + 1, "eventType": "Twirl" },)
                        if direction % 2 == 0:
                            if twirl == 0:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": (((359 - pathList[tmp]) % 360) + 1) / pathList[tmp-1] },)
                            else:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": (((359 - pathList[tmp]) % 360) + 1) / pathList[tmp-1] },)
                        else:
                            if twirl == 0:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp] / pathList[tmp-1] },)
                                
                            else:
                                actions.append({ "floor": tmp + 1, "eventType": "SetSpeed", "speedType": "Multiplier", "beatsPerMinute": 100, "bpmMultiplier": pathList[tmp] / (((359 - pathList[tmp-1]) % 360) + 1) },)
                        direction += 1
                        twirl = 1
                tmp += 1
            #print(actions)

            settings = data['settings']
            settings['madewith'] = 'BPM Multiplier by PAPER_PPT_'
            filedata = {}
            filedata['pathData'] = pathData
            filedata['settings'] = settings
            filedata['actions'] = actions

            #print(json.dumps(filedata))
            file = open(self.dir + '_multiplied.adofai', mode='w')
            file.write(json.dumps(filedata, indent=4))
            
            self.status.setText(self.dir + '_multiplied.adofai에 파일이 저장되었습니다.')
        except Exception as e:
            self.status.setText('예외 발생: {}'.format(e))
            raise e
Esempio n. 52
0
class MainWidget(QWidget):
    """Main widget."""

    # images opened in program
    files = []
    image_added_signal = pyqtSignal(str)
    image_boxes = []
    images = []

    def __init__(self):
        """Init."""
        super().__init__()
        self.init_ui()

    def init_ui(self):
        """Initialize UI."""
        # import config
        self.config = import_config()

        self.resize(self.config["width"], self.config["height"])

        self.textbox = QTextEdit(self)

        # layout is made up by three layers of boxes,
        # the lowest layer is hboxes, then above them is vboxes.
        # Above vboxes there is a single top box top_hbox
        self.image_hbox = QHBoxLayout()
        self.vbox = QVBoxLayout()
        self.top_hbox = QHBoxLayout()

        self.vbox.addLayout(self.image_hbox)
        self.vbox.addStretch(0)
        self.vbox.addWidget(self.textbox)
        self.top_hbox.addLayout(self.vbox)

        for count in [0, 1, 2, 3]:
            self.image_boxes.append(
                ImageBox(self.config["default-image"], self))

        self.relayout()

    def relayout(self):
        """Redraw the whole display."""
        self.setLayout(self.top_hbox)

    def change_image(self, image_box):
        """Open a file explorer and change image."""
        file_path = self.open_filename_dialog()
        image_box.change_image(file_path)
        self.relayout()

    def open_filename_dialog(self):
        """Open a file explorer to open a file."""
        options = QFileDialog.Options()
        # options |= QFileDialog.DontUseNativeDialog
        # All Files (*);;
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Open File",
            ".",
            "Images (*.png *.jpg *.jpeg)",
            options=options)
        return filename

    def log_text_change_image(self, text):
        """Print log imformation in text box."""
        for image_box in self.image_boxes:
            image_box.change_image_after_function()
        # debug
        print("log_text:", text)
        self.textbox.append(text)
Esempio n. 53
0
    def __init__(self, parent=None):
        super(Modifier, self).__init__(parent)

        self.plotter = parent.plotterw  # This is where the plotting takes place (need to inform this widget about changes in the data)
        self.mdbinfo = parent.mdbinfo

        self.lblselect = QLabel('Select modifier:')
        self.cmbselect = QComboBox()
        self.lblcreate = QLabel('Create modifier:')
        self.txtcreate = QLineEdit('Modifier name')
        self.btncreate = QPushButton('Create')
        self.editor = QTextEdit()
        self.console = QTextEdit()
        self.btnapply = QPushButton('Apply')
        self.btndelete = QPushButton('Delete modifier')
        self.btnmakedefault = QPushButton('Make default')
        self.btnsave = QPushButton('Save modifier')

        # disable editing console
        self.console.setReadOnly(True)

        # configure "code" font
        font = QFont()
        font.setFamily('Courier')
        font.setStyleHint(QFont.Monospace)
        font.setFixedPitch(True)
        font.setPointSize(12)
        self.editor.setFont(font)

        # set up tab length to 4 spaces
        metrics = QFontMetrics(font)
        self.editor.setTabStopWidth(4 * metrics.width(' '))

        self.editor.setStyleSheet('font-family: Courier;')
        self.editor.setAcceptRichText(False)

        self.cmbselect.currentIndexChanged[int].connect(self.changemod)
        self.btnapply.clicked.connect(self.apply)
        self.btnsave.clicked.connect(self.save)
        self.btndelete.clicked.connect(self.delete)
        self.btncreate.clicked.connect(self.create)
        self.btnmakedefault.clicked.connect(self.makedefault)

        h2 = QHBoxLayout()
        h2.addWidget(self.lblcreate)
        h2.addWidget(self.txtcreate)
        h2.addWidget(self.btncreate)

        h = QHBoxLayout()
        h.addWidget(self.btndelete)
        h.addWidget(self.btnsave)
        h.addWidget(self.btnmakedefault)
        h.addWidget(self.btnapply)

        l = QVBoxLayout()
        l.addWidget(self.cmbselect)
        l.addLayout(h2)
        l.addWidget(self.editor)
        l.addWidget(self.console)
        l.addLayout(h)

        self.setLayout(l)
Esempio n. 54
0
class HangmanGame(QWidget):

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

        # Initialize word database        
        self.word = Word('words.txt')

        # Hangman display window
        self.hangmanWindow = QTextEdit()
        self.hangmanWindow.setReadOnly(True)
        self.hangmanWindow.setAlignment(Qt.AlignLeft)
        font = self.hangmanWindow.font()
        font.setFamily('Courier New')
        self.hangmanWindow.setFont(font)

        # Layout
        hangmanLayout = QGridLayout()
        hangmanLayout.addWidget(self.hangmanWindow, 0, 0)

        # Status Layout creation
        statusLayout = QGridLayout()

         # Display widget for current status
        self.currentWord = QLineEdit()
        self.currentWord.setReadOnly(True)
        
        # 화면에 표시되는 폭을 조절하는 방식 선택 / method 사용 x
        self.currentWord.setMaxLength(len(self.secretWord) * 2)
        self.currentWord.setAlignment(Qt.AlignCenter)
        font = self.currentWord.font()
        font.setPointSize(font.pointSize() + 8)
        self.currentWord.setFont(font)
        statusLayout.addWidget(self.currentWord, 0, 0, 1, 2)
        # Display widget for already used characters
        self.guessedChars = QLineEdit()
        self.guessedChars.setReadOnly(True)
        self.guessedChars.setAlignment(Qt.AlignLeft)
        self.guessedChars.setMaxLength(52)
        statusLayout.addWidget(self.guessedChars, 1, 0, 1, 2)

        # Display widget for message output
        self.message = QLineEdit()
        self.message.setReadOnly(True)
        self.message.setAlignment(Qt.AlignLeft)
        self.message.setMaxLength(52)
        statusLayout.addWidget(self.message, 2, 0, 1, 2)

        # Input widget for user selected characters
        self.charInput = QLineEdit()
        self.charInput.setMaxLength(1)
        statusLayout.addWidget(self.charInput, 3, 0)

        # Button for submitting a character
        self.guessButton = QToolButton()
        self.guessButton.setText('Guess!')
        self.guessButton.clicked.connect(self.guessClicked)
        statusLayout.addWidget(self.guessButton, 3, 1)

        # Button for a new game
        self.newGameButton = QToolButton()
        self.newGameButton.setText('New Game')
        self.newGameButton.clicked.connect(self.startGame)
        statusLayout.addWidget(self.newGameButton, 4, 0)

        # Layout placement
        mainLayout = QGridLayout()
        mainLayout.setSizeConstraint(QLayout.SetFixedSize)
        mainLayout.addLayout(hangmanLayout, 0, 0)
        mainLayout.addLayout(statusLayout, 0, 1)

        self.setLayout(mainLayout)

        self.setWindowTitle('Hangman Game')

        # Start a new game on application launch!
        self.startGame()


    def startGame(self):
        self.hangman = Hangman()
        self.guess = Guess(self.word.randFromDB())
        self.gameOver = False

        self.hangmanWindow.setPlaceholderText(self.hangman.currentShape())
        self.currentWord.setText(self.guess.displayCurrent())
        self.guessedChars.setText(self.guess.displayGuessed())
        self.message.clear()


    def guessClicked(self):
        guessedChar = self.charInput.text()
        self.charInput.clear()
        self.message.clear()

        if self.gameOver == True:
            return self.message.setText()
            # 메시지 출력하고 - message.setText() - 리턴

        if len(self.charInput.text()) > 1:
            return self.message.setText("Error!")  # 입력의 길이가 1 인지를 판단하고, 아닌 경우 메시지 출력, 리턴

        if not self.charInput.text() in guessedChar:
            return self.message.setText("Error!")
        # 이미 사용한 글자인지를 판단하고, 아닌 경우 메시지 출력, 리턴

        success = self.guess.guess(guessedChar)
        if success == False:
            self.hangman.remainingLives -= 1
            # 남아 있는 목숨을 1 만큼 감소
            self.message.setText("Wrong char")
            # 메시지 출력

        self.hangmanWindow.setText(self.hangman.currentShape())
        # hangmanWindow 에 현재 hangman 상태 그림을 출력
        self.currentWord.setText(self.guess.currentStatus)
        # currentWord 에 현재까지 부분적으로 맞추어진 단어 상태를 출력
        self.guessedChars.setText(guessedChar)
        # guessedChars 에 지금까지 이용한 글자들의 집합을 출력

        if self.guess.finished():
            self.message.setText("Success!")
            self.gameOver = True
            # 메시지 ("Success!") 출력하고, self.gameOver는 True로

        elif self.hangman.getRemainingLives() == 0:
            self.message.setText("Fail" + " / " + self.guess.secretWord)
            self.gameOver = True
Esempio n. 55
0
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.console = QTextEdit()
        self.headers = []
        self.contents = []
        self.outlook = win32.Dispatch('outlook.application')
        self.initAct()
        self.initUI()
        # for debug only, turn off line below for product use
        self.parse_input_excel('./assets/input_example.xlsx')

    def initAct(self):
        exitAct = QAction('&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)
        openAct = QAction(QIcon('assets/excel.ico'), '&Open Excel', self)
        openAct.setShortcut('Ctrl+O')
        openAct.setStatusTip('Open Excel as input')
        openAct.triggered.connect(self.on_open_excel)
        sendAct = QAction(QIcon('assets/send.ico'), '&Send Mails', self)
        sendAct.setShortcut('Ctrl+Shit+S')
        sendAct.setStatusTip('Send mail')
        sendAct.triggered.connect(self.on_send_mail)
        helpAct = QAction('&Help', self)
        helpAct.setShortcut('Ctrl+H')
        helpAct.triggered.connect(self.on_help)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openAct)
        fileMenu.addAction(sendAct)
        fileMenu.addAction(exitAct)
        helpMenu = menubar.addMenu('&Help')
        helpMenu.addAction(helpAct)

        self.toolbar = self.addToolBar('toolbar')
        self.toolbar.addAction(openAct)
        self.toolbar.addAction(sendAct)

    def initUI(self):
        self.statusBar().showMessage('Ready')
        self.setGeometry(300, 300, 640, 400)
        self.setWindowTitle('MailBot')
        self.setWindowIcon(QIcon('assets/app.ico'))
        self.setCentralWidget(self.console)
        self.console.setReadOnly(True)
        self.show()

    def log_to_console(self, log_text):
        self.console.insertPlainText(log_text + '\n')

    def on_open_excel(self):
        file_name, _ = QFileDialog.getOpenFileName(
            self,
            "Select Excel File",
            os.path.expanduser("~/Desktop"),  # 选择Excel文件对话框默认在桌面
            "Excel File(*.xlsx)"
        )
        if file_name and os.path.splitext(file_name)[-1] == '.xlsx':
            self.parse_input_excel(file_name)

    def parse_input_excel(self, file_name):
        """解析输入的Excel文档
        :param file_name: Excel文档路径
        """
        excel_handle = load_workbook(file_name)  # 打开Excel文档
        worksheet = excel_handle.worksheets[0]  # 默认只支持从第一个页签加载数据
        for idx,row in enumerate(worksheet.rows):
            row_content = [cell.value for cell in row]
            if idx == 0:
                self.parse_header(row_content)
            else:
                self.append_content(row_content)
        self.log_to_console('Ready to send!')

    def parse_header(self, row_content):
        """解析表头行
        :param row_content: 表头行list
        """
        for idx,title in enumerate(row_content):
            if title.strip() == '邮箱':
                self.mail_col_idx = idx
        self.headers = row_content

    def append_content(self, row_content):
        """解析内容行, 并存储
        :param row_content: 内容行list
        """
        self.contents.append((
            row_content[self.mail_col_idx],
            row_content
        ))

    def on_send_mail(self):
        for idx,content in enumerate(self.contents):
            mail = self.outlook.CreateItem(0)
            if not content[0]:
                continue
            mail.To = content[0]
            content_value = content[1]
            for i in range(len(content_value)):
                if type(content_value[i]) is datetime.datetime:
                    content_value[i] = content_value[i].strftime('%Y-%m-%d')
            self.log_to_console('#{}: send to {}'.format(idx+1, mail.To))
            mail.Subject = '【重要请核对】请您核对已有信息,截止时间:2018年11月21日17:00前,谢谢 :)'  # 邮件主题
            # 接下来填入邮件正文(HTML)
            mail.HTMLBody = '<p>各位员工:</p>'
            mail.HTMLBody += '<p>为了进一步提升公司员工关怀的服务质量,请您核对如下个人相关信息,如缺失或错误请补充改正,直接回复此邮件修改即可,谢谢您的支持~</p>'
            mail.HTMLBody += '<table style="table-layout:fixed;" cellpadding="0" cellspacing="0" border="1">'
            mail.HTMLBody += ('<tr>' + '<th style="white-space:nowrap;">{}</th>' * (len(self.headers)-2) + '</tr>').format(*self.headers[:-2])
            mail.HTMLBody += ('<tr>' + '<th style="white-space:nowrap;">{}</th>' * (len(content_value)-2) + '</tr>').format(*content_value[:-2])
            mail.HTMLBody += '</table>'
            mail.HTMLBody += '<p>OnceMore2020</p>'
            mail.Send()
        self.log_to_console('发送完成')

    def on_help(self):
        self.log_to_console('{}\nDark Powered Mail Bot\nAuthor:OnceMore2020\n{}'.format('* + '*10, '* + '*10))
Esempio n. 56
0
class PageHints(Page):
    def __init__(self, pages : AllPages,windowSize:QSize,printerService:PrinterService):
        super().__init__(pages,windowSize)
        self.printerService = printerService
        vbox = QVBoxLayout()
        vbox.setContentsMargins(0, 0, 0, 0)
        self.setLayout(vbox)

        #Titel
        vbox.addWidget(self.getTitleAsQLabel(TextKey.PAGE_HINTS_TITLE))

        #Hinweise
        self.textArea = QTextEdit()
        vbox.addWidget(self.textArea)
        self.textArea.setReadOnly(True)
        self.setHints()

        #Navigationbuttons
        navigationBox = QHBoxLayout()
        vbox.addLayout(navigationBox)

        pictureManagerButton = QPushButton(textValue[TextKey.PAGE_HINTS_PICTURE_MANAGER_BUTTON])
        pictureManagerButton.clicked.connect(self.backPageEvent)
        self.setNavigationbuttonStyle(pictureManagerButton)
        navigationBox.addWidget(pictureManagerButton)

        self.nextButton = QPushButton(textValue[TextKey.PAGE_HINTS_NEXTBUTTON])
        self.nextButton.clicked.connect(self.nextPageEvent)
        self.setNavigationbuttonStyle(self.nextButton)
        navigationBox.addWidget(self.nextButton)
        self.disableNextButton()



    def executeBefore(self):
        self.setHints()
        self.disableNextButton()

    def disableNextButton(self):
        if((CameraService.existPiCamera() or CameraService.existCameras())
                and self.hasPageTitlePicturePictures()
                and self.hasPageCapturePhotoLastPicture()
                and self.hasPageCapturePhotoLoadungGifs()):
            self.nextButton.setDisabled(False)
        else:
            self.nextButton.setDisabled(True)

    def setHints(self):
        self.textArea.clear()
        self.textArea.append(textValue[TextKey.PAGE_HINTS_ESCAPE_HINT])
        self.textArea.append("")
        self.textArea.append(textValue[TextKey.PAGE_HINTS_RECONFIG_HINT])
        self.textArea.append("")

        if not CameraService.existCameras() and not CameraService.existPiCamera():
            self.textArea.append(textValue[TextKey.PAGE_HINTS_NO_CAMERA_WARN])
            self.textArea.append("")
        elif not CameraService.existSelectedCamera() and not CameraService.existPiCamera():
            self.textArea.append(textValue[TextKey.PAGE_HINTS_NO_SELECTED_CAMERA_WARN])
            self.textArea.append("")
            #Erfolgsfaelle###########################################################################
        elif CameraService.existPiCamera():
            cameraInfoText = textValue[TextKey.PAGE_HINTS_SELECTED_PICAMERA_HINT]
            self.textArea.append(cameraInfoText)
            self.textArea.append("")
        else:
            cameraInfoText = textValue[TextKey.PAGE_HINTS_SELECTED_CAMERA_HINT] % (str(CameraService.getCameraIndex()),CameraService.getCameraName(), CameraService.getCameraDescription())
            self.textArea.append(cameraInfoText)
            self.textArea.append("")

        if not FileFolderService.hasFolderContent(CfgService.get(CfgKey.PAGE_TITLEPICTURE_BUTTON_IMAGE_FOLDER)):
            warn = textValue[TextKey.PAGE_HINTS_NO_PICTURES_FOUND_WARN] % (CfgService.get(CfgKey.PAGE_TITLEPICTURE_BUTTON_IMAGE_FOLDER))
            self.textArea.append(warn)
            self.textArea.append("")

        if not FileFolderService.hasFolderContent(CfgService.get(CfgKey.PAGE_CAPTUREPHOTO_LAST_IMAGE_FOLDER)):
            warn = textValue[TextKey.PAGE_HINTS_NO_PICTURES_FOUND_WARN] % (CfgService.get(CfgKey.PAGE_CAPTUREPHOTO_LAST_IMAGE_FOLDER))
            self.textArea.append(warn)
            self.textArea.append("")

        if not FileFolderService.hasFolderContent(CfgService.get(CfgKey.PAGE_CAPTUREPHOTO_LOADING_GIF_FOLDER)):
            warn = textValue[TextKey.PAGE_HINTS_NO_PICTURES_FOUND_WARN] % (CfgService.get(CfgKey.PAGE_CAPTUREPHOTO_LOADING_GIF_FOLDER))
            self.textArea.append(warn)
            self.textArea.append("")

        #Printer hint
        self.textArea.append(textValue[TextKey.PAGE_HINTS_PRINTER_STATUS_LABEL]+self.printerService.getPrinterStatus())

    def hasPageTitlePicturePictures(self):
        return FileFolderService.hasFolderContent(CfgService.get(CfgKey.PAGE_TITLEPICTURE_BUTTON_IMAGE_FOLDER))

    def hasPageCapturePhotoLastPicture(self):
        return FileFolderService.hasFolderContent(CfgService.get(CfgKey.PAGE_CAPTUREPHOTO_LAST_IMAGE_FOLDER))

    def hasPageCapturePhotoLoadungGifs(self):
        return FileFolderService.hasFolderContent(CfgService.get(CfgKey.PAGE_CAPTUREPHOTO_LOADING_GIF_FOLDER))
Esempio n. 57
0
    def __init__(self, handler, data, *, client: 'Ledger_Client'):
        '''Ask user for 2nd factor authentication. Support text and security card methods.
        Use last method from settings, but support downgrade.
        '''
        QDialog.__init__(self, handler.top_level_window())
        self.handler = handler
        self.txdata = data
        self.idxs = self.txdata[
            'keycardData'] if self.txdata['confirmationType'] > 1 else ''
        self.setMinimumWidth(650)
        self.setWindowTitle(_("Ledger Wallet Authentication"))
        self.cfg = copy.deepcopy(self.handler.win.wallet.get_keystore().cfg)
        self.dongle = client.dongleObject.dongle
        self.pin = ''

        self.devmode = self.getDevice2FAMode()
        if self.devmode == 0x11 or self.txdata['confirmationType'] == 1:
            self.cfg['mode'] = 0

        vbox = QVBoxLayout()
        self.setLayout(vbox)

        def on_change_mode(idx):
            self.cfg[
                'mode'] = 0 if self.devmode == 0x11 else idx if idx > 0 else 1
            if self.cfg['mode'] > 0:
                self.handler.win.wallet.get_keystore().cfg = self.cfg
                self.handler.win.wallet.save_keystore()
            self.update_dlg()

        def return_pin():
            self.pin = self.pintxt.text(
            ) if self.txdata['confirmationType'] == 1 else self.cardtxt.text()
            if self.cfg['mode'] == 1:
                self.pin = ''.join(chr(int(str(i), 16)) for i in self.pin)
            self.accept()

        self.modebox = QWidget()
        modelayout = QHBoxLayout()
        self.modebox.setLayout(modelayout)
        modelayout.addWidget(QLabel(_("Method:")))
        self.modes = QComboBox()
        modelayout.addWidget(self.modes, 2)
        modelayout.addStretch(1)
        self.modebox.setMaximumHeight(50)
        vbox.addWidget(self.modebox)

        self.populate_modes()
        self.modes.currentIndexChanged.connect(on_change_mode)

        self.helpmsg = QTextEdit()
        self.helpmsg.setStyleSheet(
            "QTextEdit { color:black; background-color: lightgray; }")
        self.helpmsg.setReadOnly(True)
        vbox.addWidget(self.helpmsg)

        self.pinbox = QWidget()
        pinlayout = QHBoxLayout()
        self.pinbox.setLayout(pinlayout)
        self.pintxt = PasswordLineEdit()
        self.pintxt.setMaxLength(4)
        self.pintxt.returnPressed.connect(return_pin)
        pinlayout.addWidget(QLabel(_("Enter PIN:")))
        pinlayout.addWidget(self.pintxt)
        pinlayout.addWidget(QLabel(_("NOT DEVICE PIN - see above")))
        pinlayout.addStretch(1)
        self.pinbox.setVisible(self.cfg['mode'] == 0)
        vbox.addWidget(self.pinbox)

        self.cardbox = QWidget()
        card = QVBoxLayout()
        self.cardbox.setLayout(card)
        self.addrtext = QTextEdit()
        self.addrtext.setStyleSheet('''
            QTextEdit {
                color:blue; background-color:lightgray; padding:15px 10px; border:none;
                font-size:20pt; font-family: "Courier New", monospace; }
        ''')
        self.addrtext.setReadOnly(True)
        self.addrtext.setMaximumHeight(130)
        card.addWidget(self.addrtext)

        def pin_changed(s):
            if len(s) < len(self.idxs):
                i = self.idxs[len(s)]
                addr = self.txdata['address']
                if not constants.net.TESTNET:
                    text = addr[:i] + '<u><b>' + addr[
                        i:i + 1] + '</u></b>' + addr[i + 1:]
                else:
                    # pin needs to be created from mainnet address
                    addr_mainnet = bitcoin.script_to_address(
                        bitcoin.address_to_script(addr),
                        net=constants.BitcoinMainnet)
                    addr_mainnet = addr_mainnet[:i] + '<u><b>' + addr_mainnet[
                        i:i + 1] + '</u></b>' + addr_mainnet[i + 1:]
                    text = str(addr) + '\n' + str(addr_mainnet)
                self.addrtext.setHtml(str(text))
            else:
                self.addrtext.setHtml(_("Press Enter"))

        pin_changed('')
        cardpin = QHBoxLayout()
        cardpin.addWidget(QLabel(_("Enter PIN:")))
        self.cardtxt = PasswordLineEdit()
        self.cardtxt.setMaxLength(len(self.idxs))
        self.cardtxt.textChanged.connect(pin_changed)
        self.cardtxt.returnPressed.connect(return_pin)
        cardpin.addWidget(self.cardtxt)
        cardpin.addWidget(QLabel(_("NOT DEVICE PIN - see above")))
        cardpin.addStretch(1)
        card.addLayout(cardpin)
        self.cardbox.setVisible(self.cfg['mode'] == 1)
        vbox.addWidget(self.cardbox)

        self.update_dlg()
Esempio n. 58
0
class Modifier(QWidget):
    def __init__(self, parent=None):
        super(Modifier, self).__init__(parent)

        self.plotter = parent.plotterw  # This is where the plotting takes place (need to inform this widget about changes in the data)
        self.mdbinfo = parent.mdbinfo

        self.lblselect = QLabel('Select modifier:')
        self.cmbselect = QComboBox()
        self.lblcreate = QLabel('Create modifier:')
        self.txtcreate = QLineEdit('Modifier name')
        self.btncreate = QPushButton('Create')
        self.editor = QTextEdit()
        self.console = QTextEdit()
        self.btnapply = QPushButton('Apply')
        self.btndelete = QPushButton('Delete modifier')
        self.btnmakedefault = QPushButton('Make default')
        self.btnsave = QPushButton('Save modifier')

        # disable editing console
        self.console.setReadOnly(True)

        # configure "code" font
        font = QFont()
        font.setFamily('Courier')
        font.setStyleHint(QFont.Monospace)
        font.setFixedPitch(True)
        font.setPointSize(12)
        self.editor.setFont(font)

        # set up tab length to 4 spaces
        metrics = QFontMetrics(font)
        self.editor.setTabStopWidth(4 * metrics.width(' '))

        self.editor.setStyleSheet('font-family: Courier;')
        self.editor.setAcceptRichText(False)

        self.cmbselect.currentIndexChanged[int].connect(self.changemod)
        self.btnapply.clicked.connect(self.apply)
        self.btnsave.clicked.connect(self.save)
        self.btndelete.clicked.connect(self.delete)
        self.btncreate.clicked.connect(self.create)
        self.btnmakedefault.clicked.connect(self.makedefault)

        h2 = QHBoxLayout()
        h2.addWidget(self.lblcreate)
        h2.addWidget(self.txtcreate)
        h2.addWidget(self.btncreate)

        h = QHBoxLayout()
        h.addWidget(self.btndelete)
        h.addWidget(self.btnsave)
        h.addWidget(self.btnmakedefault)
        h.addWidget(self.btnapply)

        l = QVBoxLayout()
        l.addWidget(self.cmbselect)
        l.addLayout(h2)
        l.addWidget(self.editor)
        l.addWidget(self.console)
        l.addLayout(h)

        self.setLayout(l)

    def setfile(self, filename):
        self.filename = filename

        # tidy up
        self.cmbselect.blockSignals(
            True)  # otherwise the combobox is too talkative when we modify it

        self.cmbselect.clear()
        self.editor.clear()

        self.cmbselect.addItem('None')

        # load existing modifiers
        if filename in self.mdbinfo.files:
            self.fileinfo = self.mdbinfo.files[filename]
        else:
            self.fileinfo = FileInfo()
        for mod in self.fileinfo.modifiers:
            self.cmbselect.addItem(mod.name)

        self.cmbselect.blockSignals(False)

        self.changemod(self.fileinfo.defaultmod)

    def setheader(self, header):
        self.orgheader = header  # save original header
        self.plotter.setheader(header)

    def setdata(self, data):
        self.orgdata = data  # save original data
        self.plotter.setdata(data)

        self.apply()

    # right now the cycle is setfile, setheader, setdata (they are executed in series)
    # TODO: it would be much more logical to combine setfile, setheader and setdata in some way

    def changemod(self, i):  # i referring to index in Combobox!
        if i:
            self.cmbselect.setCurrentIndex(i)  # (first entry is "None")
            self.editor.setText(self.fileinfo.modifiers[i - 1].code)
            self.editor.setEnabled(True)
            self.btnsave.setEnabled(True)
            self.btndelete.setEnabled(True)
        else:  # no modifier to apply
            self.editor.clear()
            self.editor.setEnabled(False)
            self.btnsave.setEnabled(False)
            self.btndelete.setEnabled(False)

    def makedefault(self):
        self.fileinfo.defaultmod = self.cmbselect.currentIndex()
        self.mdbinfo.files[self.filename] = self.fileinfo
        self.mdbinfo.save()

    def apply(self):
        # restore original header and data
        header = self.orgheader
        data = self.orgdata

        # back up stdout and stderr
        oldstdout = sys.stdout
        oldstderr = sys.stderr

        s = ConsoleStream()
        s.messageWritten.connect(self.console.insertPlainText)
        sys.stdout = s
        sys.stderr = s

        # execute user code
        exec(str(self.editor.toPlainText()))

        # restore stdout and stderr
        sys.stdout = oldstdout
        sys.stderr = oldstderr

        # update plot
        self.plotter.setheader(header)
        self.plotter.setdata(data)

    def save(self):
        mod = Mod()
        mod.name = str(self.cmbselect.currentText())
        mod.code = self.editor.toPlainText()
        self.fileinfo.modifiers[self.cmbselect.currentIndex() - 1] = mod
        self.mdbinfo.files[self.filename] = self.fileinfo
        self.mdbinfo.save()

    def delete(self):
        i = self.cmbselect.currentIndex()
        del self.fileinfo.modifiers[i - 1]
        if self.fileinfo.defaultmod == i:  # check if we're deleting the default modifier
            self.fileinfo.defaultmod = 0  # if true, set default modifier to "None"
        self.mdbinfo.files[self.filename] = self.fileinfo
        self.setfile(self.filename)  # re-initialise

    def create(self):
        mod = Mod()
        mod.name = str(self.txtcreate.text())
        mod.code = ''
        self.fileinfo.modifiers.append(mod)
        self.mdbinfo.files[self.filename] = self.fileinfo
        self.mdbinfo.save()
        self.cmbselect.addItem(self.txtcreate.text())
        self.changemod(self.cmbselect.count() - 1)
Esempio n. 59
0
class LedgerAuthDialog(QDialog):
    def __init__(self, handler, data):
        '''Ask user for 2nd factor authentication. Support text and security card methods.
        Use last method from settings, but support downgrade.
        '''
        QDialog.__init__(self, handler.top_level_window())
        self.handler = handler
        self.txdata = data
        self.idxs = self.txdata[
            'keycardData'] if self.txdata['confirmationType'] > 1 else ''
        self.setMinimumWidth(650)
        self.setWindowTitle(_("Ledger Wallet Authentication"))
        self.cfg = copy.deepcopy(self.handler.win.wallet.get_keystore().cfg)
        self.dongle = self.handler.win.wallet.get_keystore().get_client(
        ).dongle
        self.pin = ''

        self.devmode = self.getDevice2FAMode()
        if self.devmode == 0x11 or self.txdata['confirmationType'] == 1:
            self.cfg['mode'] = 0

        vbox = QVBoxLayout()
        self.setLayout(vbox)

        def on_change_mode(idx):
            self.cfg[
                'mode'] = 0 if self.devmode == 0x11 else idx if idx > 0 else 1
            if self.cfg['mode'] > 0:
                self.handler.win.wallet.get_keystore().cfg = self.cfg
                self.handler.win.wallet.save_keystore()
            self.update_dlg()

        def return_pin():
            self.pin = self.pintxt.text(
            ) if self.txdata['confirmationType'] == 1 else self.cardtxt.text()
            if self.cfg['mode'] == 1:
                self.pin = ''.join(chr(int(str(i), 16)) for i in self.pin)
            self.accept()

        self.modebox = QWidget()
        modelayout = QHBoxLayout()
        self.modebox.setLayout(modelayout)
        modelayout.addWidget(QLabel(_("Method:")))
        self.modes = QComboBox()
        modelayout.addWidget(self.modes, 2)
        modelayout.addStretch(1)
        self.modebox.setMaximumHeight(50)
        vbox.addWidget(self.modebox)

        self.populate_modes()
        self.modes.currentIndexChanged.connect(on_change_mode)

        self.helpmsg = QTextEdit()
        self.helpmsg.setStyleSheet(
            "QTextEdit { color:black; background-color: lightgray; }")
        self.helpmsg.setReadOnly(True)
        vbox.addWidget(self.helpmsg)

        self.pinbox = QWidget()
        pinlayout = QHBoxLayout()
        self.pinbox.setLayout(pinlayout)
        self.pintxt = PasswordLineEdit()
        self.pintxt.setMaxLength(4)
        self.pintxt.returnPressed.connect(return_pin)
        pinlayout.addWidget(QLabel(_("Enter PIN:")))
        pinlayout.addWidget(self.pintxt)
        pinlayout.addWidget(QLabel(_("NOT DEVICE PIN - see above")))
        pinlayout.addStretch(1)
        self.pinbox.setVisible(self.cfg['mode'] == 0)
        vbox.addWidget(self.pinbox)

        self.cardbox = QWidget()
        card = QVBoxLayout()
        self.cardbox.setLayout(card)
        self.addrtext = QTextEdit()
        self.addrtext.setStyleSheet('''
            QTextEdit {
                color:blue; background-color:lightgray; padding:15px 10px; border:none;
                font-size:20pt; font-family: "Courier New", monospace; }
        ''')
        self.addrtext.setReadOnly(True)
        self.addrtext.setMaximumHeight(130)
        card.addWidget(self.addrtext)

        def pin_changed(s):
            if len(s) < len(self.idxs):
                i = self.idxs[len(s)]
                addr = self.txdata['address']
                if not constants.net.TESTNET:
                    text = addr[:i] + '<u><b>' + addr[
                        i:i + 1] + '</u></b>' + addr[i + 1:]
                else:
                    # pin needs to be created from mainnet address
                    addr_mainnet = bitgesell.script_to_address(
                        bitgesell.address_to_script(addr),
                        net=constants.BitgesellMainnet)
                    addr_mainnet = addr_mainnet[:i] + '<u><b>' + addr_mainnet[
                        i:i + 1] + '</u></b>' + addr_mainnet[i + 1:]
                    text = str(addr) + '\n' + str(addr_mainnet)
                self.addrtext.setHtml(str(text))
            else:
                self.addrtext.setHtml(_("Press Enter"))

        pin_changed('')
        cardpin = QHBoxLayout()
        cardpin.addWidget(QLabel(_("Enter PIN:")))
        self.cardtxt = PasswordLineEdit()
        self.cardtxt.setMaxLength(len(self.idxs))
        self.cardtxt.textChanged.connect(pin_changed)
        self.cardtxt.returnPressed.connect(return_pin)
        cardpin.addWidget(self.cardtxt)
        cardpin.addWidget(QLabel(_("NOT DEVICE PIN - see above")))
        cardpin.addStretch(1)
        card.addLayout(cardpin)
        self.cardbox.setVisible(self.cfg['mode'] == 1)
        vbox.addWidget(self.cardbox)

        self.update_dlg()

    def populate_modes(self):
        self.modes.blockSignals(True)
        self.modes.clear()
        self.modes.addItem(
            _("Summary Text PIN (requires dongle replugging)"
              ) if self.txdata['confirmationType'] ==
            1 else _("Summary Text PIN is Disabled"))
        if self.txdata['confirmationType'] > 1:
            self.modes.addItem(_("Security Card Challenge"))
        self.modes.blockSignals(False)

    def update_dlg(self):
        self.modes.setCurrentIndex(self.cfg['mode'])
        self.modebox.setVisible(True)
        self.helpmsg.setText(helpTxt[self.cfg['mode']])
        self.helpmsg.setMinimumHeight(180 if self.txdata['confirmationType'] ==
                                      1 else 100)
        self.helpmsg.setVisible(True)
        self.pinbox.setVisible(self.cfg['mode'] == 0)
        self.cardbox.setVisible(self.cfg['mode'] == 1)
        self.pintxt.setFocus(
            True) if self.cfg['mode'] == 0 else self.cardtxt.setFocus(True)
        self.setMaximumHeight(400)

    def getDevice2FAMode(self):
        apdu = [0xe0, 0x24, 0x01, 0x00, 0x00, 0x01]  # get 2fa mode
        try:
            mode = self.dongle.exchange(bytearray(apdu))
            return mode
        except BGLhipException as e:
            _logger.debug('Device getMode Failed')
        return 0x11
Esempio n. 60
0
 def __init__(self, parent=None):
     super(FeedbackHelp, self).__init__(parent)
     self.setWindowTitle('反馈与帮助')
     hlay = QHBoxLayout()
     text = QTextEdit()
     text.append('不管您是使用该程序,还是想拿这个项目练手的coder。')
     text.append('如果有任何关于该软件使用、环境配置、源码求助等问题,有以下两种方式联系到作者:')
     text.append('   1. 发送邮件,邮箱地址:[email protected]')
     text.append(
         '   2. 发布Issue,地址:https://github.com/iroan/PythonChat/issues')
     text.append('\n欢迎骚扰!!!')
     hlay.addWidget(text)
     self.setLayout(hlay)