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()
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())
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())
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)
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()
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()
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")
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")
def __init__(self): super().__init__() self.inputText = QTextEdit() self.outputText = QTextEdit() self.outputText2 = QTextEdit() self.runButton = QPushButton('分解') self.init_ui()
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)
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)
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()
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()
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)
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_()
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>")
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)
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()
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)
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
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()
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)
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
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)))
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")
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)
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)
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)
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)
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())
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
def init_messeges(self): self.messages = QTextEdit() self.messages.setReadOnly(True)
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)
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
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
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()
def __init__(self, parent): print(self, parent) QTextEdit.__init__(self) self.parent = parent self.currentStr = "" self.prevStr = ""
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)
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()
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()
def keyPressEvent(self, event): if event.key() == Qt.Key_Tab: tc = self.textCursor() tc.insertText(" ") return return QTextEdit.keyPressEvent(self, event)
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()
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()
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
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)
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 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
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)
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)
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
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))
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))
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()
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)
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
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)