def license_(self): lic = QTextEdit(self) lic.setWindowFlags(Qt.Window) lic.setWindowTitle("QReduce FreeBSD License") font = lic.font() font.setFamily('') font.setFixedPitch(True) font.setKerning(0) font.setWeight(QFont.Normal) font.setItalic(False) lic.setFont(font) lic.setText( 'Copyright (c) 2009-2014 T. Sturm, 2010 C. Zengler' '<p>' 'All rights reserved.' '<p>' 'Redistribution and use in source and binary forms, with ' 'or without modification, are permitted provided that the ' 'following conditions are met:' '<ol>' '<li>Redistributions of source code must retain the relevant ' 'copyright notice, this list of conditions and the following ' 'disclaimer. ' '<p>' '<li>Redistributions in binary form must reproduce the above ' 'copyright notice, this list of conditions and the following ' 'disclaimer in the documentation and/or other materials ' 'provided with the distribution. ' '</ol>' '<p>' 'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND ' 'CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, ' 'INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ' 'MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ' 'DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNERS OR ' 'CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ' 'SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ' 'NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ' 'LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ' 'HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ' 'CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ' 'OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ' 'SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.' '</span>') lic.setReadOnly(True) w = 66 * lic.fontMetrics().width('m') h = 36 * lic.fontMetrics().height() lic.resize(w,h) lic.show() lic.raise_()
class AppWindow(QMainWindow): # ===================== # The Main Window Class # ===================== def __init__(self): # ==================== # Constructor Function # ==================== QMainWindow.__init__(self) self.setWindowTitle("Virtua Text Editor") self.setGeometry(300, 300, 1024, 768) QToolTip.setFont(QFont("Ubuntu", 10, QFont.Normal)) self.setToolTip('Application Window') # ================================ # Function to setup menus, etc etc # ================================ self.textEdit = QTextEdit() self.textEdit.setFont(QFont("Ubuntu", 12, QFont.Normal)) self.setCentralWidget(self.textEdit) self.create_menus() self.create_actions() self.fileMenu.addAction(self.newAction) self.fileMenu.addAction(self.openAction) self.fileMenu.addAction(self.saveAction) self.fileMenu.addAction(self.saveasAction) self.fileMenu.addSeparator() self.fileMenu.addAction(self.printAction) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAction) self.editMenu.addAction(self.undoAction) self.editMenu.addAction(self.redoAction) self.editMenu.addAction(self.cutAction) self.editMenu.addAction(self.copyAction) self.editMenu.addAction(self.pasteAction) self.editMenu.addSeparator() self.editMenu.addAction(self.selectallAction) self.editMenu.addAction(self.deselectallAction) self.editMenu.addSeparator() self.editMenu.addAction(self.findAction) self.editMenu.addAction(self.findReplaceAction) self.helpMenu.addAction(self.aboutAction) self.app_status_bar = QStatusBar() self.app_status_bar.showMessage('Ready, v0.2', 10000) self.setStatusBar(self.app_status_bar) self.create_toolbar() self.toolbar.addAction(self.newAction) self.toolbar.addSeparator() self.toolbar.addAction(self.cutAction) self.toolbar.addAction(self.copyAction) self.toolbar.addAction(self.pasteAction) self.toolbar.addSeparator() self.toolbar.addAction(self.printAction) self.toolbar.addSeparator() self.toolbar.addAction(self.undoAction) self.toolbar.addAction(self.redoAction) self.toolbar.addSeparator() self.toolbar.addAction(self.findAction) self.toolbar.addAction(self.findReplaceAction) def create_toolbar(self): # =============================== # Function to create the toolbar. # =============================== self.toolbar = self.addToolBar('Main') self.toolbar.setToolButtonStyle(PySide.QtCore.Qt.ToolButtonTextUnderIcon) def newfile(self): self.textEdit.setText('') # TODO: Create the file/open method def openfile(self): print "Open File Menu Selected" # TODO: Create the file/save method def savefile(self): print "Save File Menu Selected" # TODO: Create the file/saveas method def saveasfile(self): print "Save As File Menu Selected" # TODO: Create the print method def print_page(self): print "Print Page Selected" # TODO: Create the find method def find_text(self): print "Find text option selected" # TODO: Create the replace method def find_replace_text(self): print "Replace text selected" def create_actions(self): # ========================================= # Function to create actions for menu items # ========================================= self.newAction = QAction(QIcon('digital_assets/document-new.svg'), 'New', self) self.newAction.setShortcut(QKeySequence.New) self.newAction.setStatusTip("Create a New File") self.newAction.setIconText("New") self.newAction.triggered.connect(self.newfile) self.openAction = QAction(QIcon('digital_assets/document-open.svg'), 'Open', self) self.openAction.setShortcut(QKeySequence.Open) self.openAction.setStatusTip("Open a file") self.openAction.triggered.connect(self.openfile) self.saveAction = QAction(QIcon('digital_assets/document-save.svg'), 'Save', self) self.saveAction.setShortcut(QKeySequence.Save) self.saveAction.setStatusTip("Save a file") self.saveAction.triggered.connect(self.savefile) self.saveasAction = QAction(QIcon('digital_assets/document-save-as.svg'), 'Save As', self) self.saveasAction.setShortcut(QKeySequence.SaveAs) self.saveasAction.setStatusTip("Save a File As....") self.saveasAction.triggered.connect(self.saveasfile) self.printAction = QAction(QIcon('digital_assets/document-print.svg'), 'Print', self) self.printAction.setShortcut(QKeySequence.Print) self.printAction.setStatusTip("Print") self.printAction.triggered.connect(self.print_page) self.exitAction = QAction(QIcon('digital_assets/application-exit.svg'), 'Exit', self) self.exitAction.setShortcut(QKeySequence.Quit) self.exitAction.setStatusTip("Exit the Application") self.exitAction.triggered.connect(self.quit_application) self.undoAction = QAction(QIcon('digital_assets/undo.svg'), 'Undo', self) self.undoAction.setShortcut(QKeySequence.Undo) self.undoAction.setStatusTip("Undo") self.undoAction.triggered.connect(self.textEdit.undo) self.redoAction = QAction(QIcon('digital_assets/redo.svg'), 'Redo', self) self.redoAction.setShortcut(QKeySequence.Redo) self.redoAction.setStatusTip("Redo") self.redoAction.triggered.connect(self.textEdit.redo) self.cutAction = QAction(QIcon('digital_assets/edit-cut.svg'), 'Cut', self) self.cutAction.setShortcut(QKeySequence.Cut) self.cutAction.setStatusTip("Cut") self.cutAction.setEnabled(False) self.cutAction.triggered.connect(self.textEdit.cut) self.copyAction = QAction(QIcon('digital_assets/edit-copy.svg'), 'Copy', self) self.copyAction.setShortcut(QKeySequence.Copy) self.copyAction.setStatusTip("Copy") self.copyAction.setEnabled(False) self.copyAction.triggered.connect(self.textEdit.copy) self.pasteAction = QAction(QIcon('digital_assets/edit-paste.svg'), 'Paste', self) self.pasteAction.setShortcut(QKeySequence.Paste) self.pasteAction.setStatusTip("Paste") self.pasteAction.setEnabled(False) self.pasteAction.triggered.connect(self.textEdit.paste) self.selectallAction = QAction(QIcon('digital_assets/edit-select-all.svg'), 'Select All', self) self.selectallAction.setShortcut(QKeySequence.SelectAll) self.selectallAction.setStatusTip("Select All") self.selectallAction.triggered.connect(self.textEdit.selectAll) self.deselectallAction = QAction(QIcon('digital_assets/edit-select-all.svg'), 'Deselect All', self) self.deselectallAction.setShortcut("Shift+Ctrl+A") self.deselectallAction.setStatusTip("Deselect All") self.deselectallAction.triggered.connect(self.deselect_all_text) self.findAction = QAction(QIcon('digital_assets/edit-find.svg'), 'Find', self) self.findAction.setShortcut(QKeySequence.Find) self.findAction.setStatusTip("Find") self.findAction.triggered.connect(self.find_text) self.findReplaceAction = QAction(QIcon('digital_assets/edit-find-replace.svg'), 'Replace', self) self.findReplaceAction.setShortcut(QKeySequence.Replace) self.findReplaceAction.setShortcut("Replace") self.findReplaceAction.triggered.connect(self.find_replace_text) self.aboutAction = QAction(QIcon('digital_assets/AppIcon.png'), 'About', self) self.aboutAction.setStatusTip("Displays info about the application") self.aboutAction.triggered.connect(self.show_about) def deselect_all_text(self): text_cursor = self.textEdit.textCursor() text_cursor.clearSelection() self.textEdit.setTextCursor(text_cursor) def create_menus(self): # ================================ # Function to create the menu bar. # ================================ self.fileMenu = self.menuBar().addMenu("File") self.fileMenu.setFont(QFont("Ubuntu", 10, QFont.Normal)) self.editMenu = self.menuBar().addMenu("Edit") self.editMenu.setFont(QFont("Ubuntu", 10, QFont.Normal)) self.helpMenu = self.menuBar().addMenu("Help") self.helpMenu.setFont(QFont("Ubuntu", 10, QFont.Normal)) def set_icon(self): # =============================== # Function to set the Window Icon # =============================== appicon = QIcon('digital_assets/AppIcon.png') self.setWindowIcon(appicon) def quit_application(self): # ================================ # Function to quit the application # ================================ userinfo = QMessageBox.question(self, "Confirmation", "This will quit, Do you want to continue?", QMessageBox.Yes | QMessageBox.No) if userinfo == QMessageBox.Yes: templateApp.quit() if userinfo == QMessageBox.No: pass def show_about(self): QMessageBox.about(self, "About Virtua Text Editor", "<b><h3>Virtua Text Editor</h3></b>" "<p><h4>Virtua Text Editor has been written to serve as a template" " that can be used as a basis for creating a working application." " All of the components that make up the core functions of an" " application, the main window, a status bar, menus and dialogs" " are provided here as a basis for writing something new and interesting</h4></p>") def center_application(self): # ============================================ # Function to center the Application on screen # ============================================ qrect = self.frameGeometry() centerpoint = QDesktopWidget().availableGeometry().center() qrect.moveCenter(centerpoint) self.move(qrect.topLeft())
class MainWindow(QMainWindow): def __init__(self): # QMainWindow.__init__(self) super().__init__() # use super() to avoid explicit dependency on the base class name # Note: must not pass the self reference to __init__ in this case! self.resize(800, 600) # Create the main content widget mainWidget = QWidget(self) self.setCentralWidget(mainWidget) # Create a text component at the top area of the main widget self.output = QTextEdit(mainWidget) self.output.setReadOnly(True) self.output.setLineWrapMode(QTextEdit.NoWrap); # set the font font = self.output.font() font.setFamily("Courier") font.setPointSize(10) self.output.setFont(font) # Set the background color # self.output.setTextBackgroundColor(Qt.red) # Only sets the background color for the text itself, not for the whole widget pal = self.output.palette() pal.setColor(QPalette.Base, Qt.black) self.output.setPalette(pal) mainLayout = QVBoxLayout(mainWidget) mainLayout.addWidget(self.output) # Create buttons in a grid layout below the top area buttonWidget = QWidget(mainWidget) self.buttonLayout = QGridLayout(buttonWidget) mainLayout.addWidget(buttonWidget) # Add some buttons to execute python code self.row = 0 self.column = 0 self.addButton("Clear console", lambda : self.output.clear()) self.newRow() # Add buttons for all the examples - attention: do not make "examples" # a local variable - otherwise, the Examples object would be destroyed # at the end of __init__ !!! self.examples = samplePackage.SampleModule.Examples(self) for example in self.examples.getExamples(): if example is None: self.newRow() else: self.addButton(example.label, example.function) # In a Python program, sys.excepthook is called just before the program exits. # So we can catch all fatal, uncaught exceptions and log them. # NOTE: we must be sure not to set the excepthook BEFORE we an actually # log something!! sys.excepthook = self.logException self.writelnColor(Qt.magenta, "Python version: {0}.{1}.{2} ({3})".format( sys.version_info[0], sys.version_info[1], sys.version_info[2], sys.version_info[3])) self.writelnColor(Qt.magenta, "Qt version : {0}".format(qVersion())) def logException(self, exctype, value, tb): self.writelnColor(Qt.red, ("\nFATAL ERROR: Uncaught exception\n" " {}: {}\n" "{}\n".format(exctype.__name__, value, ''.join(traceback.format_tb(tb)))) ) def addButton(self, label, function): theButton = QPushButton(label) theButton.clicked.connect(function) self.buttonLayout.addWidget(theButton, self.row, self.column) self.column += 1 def newRow(self): self.row += 1 self.column = 0 def writeColor(self, color, *text): theText = ' '.join(map(str, text)) self.output.setTextColor(color) # Note: append() adds a new paragraph! #self.output.append(theText) self.output.textCursor().movePosition(QTextCursor.End) self.output.insertPlainText(theText) # scroll console window to bottom sb = self.output.verticalScrollBar() sb.setValue(sb.maximum()) def write(self, *text): self.writeColor(Qt.green, *text) def writelnColor(self, color, *text): self.writeColor(color, *text) self.write('\n') def writeln(self, *text): self.writelnColor(Qt.green, *text)
class QLogger(logging.Handler): '''Code from: https://stackoverflow.com/questions/28655198/best-way-to-display-logs-in-pyqt ''' def __init__(self, parent=None, format=settings.log_fmt, level=logging.INFO): logging.Handler.__init__(self) # Initialize a log handler as the super class self.setFormatter(logging.Formatter(format)) # Set the formatter for the logger self.setLevel(level) # Set the logging level self.frame = QFrame(parent) # Initialize a QFrame to place other widgets in self.frame2 = QFrame(parent) # Initialize frame2 for the label and checkbox self.label = QLabel('Logs') # Define a label for the frame self.check = QCheckBox('Debugging') # Checkbox to enable debugging logging self.check.clicked.connect(self.__changeLevel) # Connect checkbox clicked to the __changeLevel method self.log_widget = QTextEdit() # Initialize a QPlainTextWidget to write logs to self.log_widget.verticalScrollBar().minimum() # Set a vertical scroll bar on the log widget self.log_widget.horizontalScrollBar().minimum() # Set a horizontal scroll bar on the log widget self.log_widget.setLineWrapMode(self.log_widget.NoWrap) # Set line wrap mode to no wrapping self.log_widget.setFont(QFont("Courier", 12)) # Set the font to a monospaced font self.log_widget.setReadOnly(True) # Set log widget to read only layout = QHBoxLayout() # Initialize a horizontal layout scheme for the label and checkbox frame layout.addWidget(self.label) # Add the label to the layout scheme layout.addWidget(self.check) # Add the checkbox to the layout scheme self.frame2.setLayout(layout) # Set the layout for frame to the horizontal layout layout = QVBoxLayout() # Initialize a layout scheme for the widgets layout.addWidget(self.frame2) # Add the label/checkbox frame to the layout scheme layout.addWidget(self.log_widget) # Add the text widget to the layout scheme self.frame.setLayout(layout) # Set the layout of the fram to the layout scheme defined ############################################################################## def emit(self, record): ''' Overload the emit method so that it prints to the text widget ''' msg = self.format(record) # Format the message for logging if record.levelno >= logging.CRITICAL: # If the log level is critical self.log_widget.setTextColor(Qt.red) # Set text color to red elif record.levelno >= logging.ERROR: # Elif level is error self.log_widget.setTextColor(Qt.darkMagenta) # Set text color to darkMagenta elif record.levelno >= logging.WARNING: # Elif level is warning self.log_widget.setTextColor(Qt.darkCyan) # Set text color to darkCyan else: # Else self.log_widget.setTextColor(Qt.black) # Set text color to black self.log_widget.append(msg) # Add the log to the text widget ############################################################################## def write(self, m): ''' Overload the write method so that it does nothing ''' pass ############################################################################## def __changeLevel(self, *args): ''' Private method to change logging level ''' if self.check.isChecked(): self.setLevel(logging.DEBUG) # Get the Meso1819 root logger and add the handler to it else: self.setLevel(logging.INFO)