PyQt5是Digia的一套Qt5应用框架与python的结合,同时支持2.x和3.x。Qt库由Riverbank Computing开发,是最强大的GUI库之一。

>>> 今天,我们将尝试用pyqt5写一个文本编辑器。

效果如图:

支持以下功能:复制、剪切、粘帖、保存、全选、读取、撤回、前进、加粗、斜体、下划线、字体、字号、左中右对齐、打印。

>>> Tips:完整代码在本页最后~


一、安装模块

使用pip安装pyqt5:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5

二、导入模块

导入所需模块:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *import os
import sys
import uuid

三、初始化定义

首先,我们先初始化定义一些后文所需函数。这里如果有看不懂,看到后文就可以理解了。

FONT_SIZES = [7, 8, 9, 10, 11, 12, 13, 14, 18, 24, 36, 48, 64, 72, 96, 144, 288]
IMAGE_EXTENSIONS = ['.jpg','.png','.bmp']
HTML_EXTENSIONS = ['.htm', '.html']def hexuuid():return uuid.uuid4().hexdef splitext(p):return os.path.splitext(p)[1].lower()class TextEdit(QTextEdit):def canInsertFromMimeData(self, source):if source.hasImage():return Trueelse:return super(TextEdit, self).canInsertFromMimeData(source)def insertFromMimeData(self, source):cursor = self.textCursor()document = self.document()if source.hasUrls():for u in source.urls():file_ext = splitext(str(u.toLocalFile()))if u.isLocalFile() and file_ext in IMAGE_EXTENSIONS:image = QImage(u.toLocalFile())document.addResource(QTextDocument.ImageResource, u, image)cursor.insertImage(u.toLocalFile())else:breakelse:returnelif source.hasImage():image = source.imageData()uuid = hexuuid()document.addResource(QTextDocument.ImageResource, uuid, image)cursor.insertImage(uuid)returnsuper(TextEdit, self).insertFromMimeData(source)

四、设置主窗口

开始使用pyqt5,建立一个主窗口,添加按钮等元素位置。

class MainWindow(QMainWindow):def __init__(self, *args, **kwargs):super(MainWindow, self).__init__(*args, **kwargs)layout = QVBoxLayout()self.editor = TextEdit()self.editor.setAutoFormatting(QTextEdit.AutoAll)self.editor.selectionChanged.connect(self.update_format)font = QFont('Times', 12)self.editor.setFont(font)self.editor.setFontPointSize(12)self.path = Nonelayout.addWidget(self.editor)container = QWidget()container.setLayout(layout)self.setCentralWidget(container)self.status = QStatusBar()self.setStatusBar(self.status)file_toolbar = QToolBar("文件")file_toolbar.setIconSize(QSize(14, 14))self.addToolBar(file_toolbar)file_menu = self.menuBar().addMenu("&文件")open_file_action = QAction(QIcon(os.path.join('images', 'blue-folder-open-document.png')), "打开文件", self)open_file_action.setStatusTip("从本地磁盘中读取文件..")open_file_action.triggered.connect(self.file_open)file_menu.addAction(open_file_action)file_toolbar.addAction(open_file_action)save_file_action = QAction(QIcon(os.path.join('images', 'disk.png')), "保存", self)save_file_action.setStatusTip("保存到本地磁盘..")save_file_action.triggered.connect(self.file_save)file_menu.addAction(save_file_action)file_toolbar.addAction(save_file_action)saveas_file_action = QAction(QIcon(os.path.join('images', 'disk--pencil.png')), "另存为", self)saveas_file_action.setStatusTip("另存为文件..")saveas_file_action.triggered.connect(self.file_saveas)file_menu.addAction(saveas_file_action)file_toolbar.addAction(saveas_file_action)print_action = QAction(QIcon(os.path.join('images', 'printer.png')), "打印", self)print_action.setStatusTip("打印本页..")print_action.triggered.connect(self.file_print)file_menu.addAction(print_action)file_toolbar.addAction(print_action)edit_toolbar = QToolBar("编辑")edit_toolbar.setIconSize(QSize(16, 16))self.addToolBar(edit_toolbar)edit_menu = self.menuBar().addMenu("&编辑")undo_action = QAction(QIcon(os.path.join('images', 'arrow-curve-180-left.png')), "撤回", self)undo_action.setStatusTip("撤回上一个操作..")undo_action.triggered.connect(self.editor.undo)edit_menu.addAction(undo_action)redo_action = QAction(QIcon(os.path.join('images', 'arrow-curve.png')), "重做", self)redo_action.setStatusTip("重做撤回的操作..")redo_action.triggered.connect(self.editor.redo)edit_toolbar.addAction(redo_action)edit_menu.addAction(redo_action)edit_menu.addSeparator()cut_action = QAction(QIcon(os.path.join('images', 'scissors.png')), "剪切", self)cut_action.setStatusTip("剪切选定内容..")cut_action.setShortcut(QKeySequence.Cut)cut_action.triggered.connect(self.editor.cut)edit_toolbar.addAction(cut_action)edit_menu.addAction(cut_action)copy_action = QAction(QIcon(os.path.join('images', 'document-copy.png')), "复制", self)copy_action.setStatusTip("复制选定内容..")cut_action.setShortcut(QKeySequence.Copy)copy_action.triggered.connect(self.editor.copy)edit_toolbar.addAction(copy_action)edit_menu.addAction(copy_action)paste_action = QAction(QIcon(os.path.join('images', 'clipboard-paste-document-text.png')), "粘帖", self)paste_action.setStatusTip("从剪贴板粘帖..")cut_action.setShortcut(QKeySequence.Paste)paste_action.triggered.connect(self.editor.paste)edit_toolbar.addAction(paste_action)edit_menu.addAction(paste_action)select_action = QAction(QIcon(os.path.join('images', 'selection-input.png')), "全选", self)select_action.setStatusTip("全选所有文字..")cut_action.setShortcut(QKeySequence.SelectAll)select_action.triggered.connect(self.editor.selectAll)edit_menu.addAction(select_action)edit_menu.addSeparator()wrap_action = QAction(QIcon(os.path.join('images', 'arrow-continue.png')), "自动换行", self)wrap_action.setStatusTip("当文字长度超过边框大小时自动换行..")wrap_action.setCheckable(True)wrap_action.setChecked(True)wrap_action.triggered.connect(self.edit_toggle_wrap)edit_menu.addAction(wrap_action)format_toolbar = QToolBar("格式")format_toolbar.setIconSize(QSize(16, 16))self.addToolBar(format_toolbar)format_menu = self.menuBar().addMenu("&格式")self.fonts = QFontComboBox()self.fonts.currentFontChanged.connect(self.editor.setCurrentFont)format_toolbar.addWidget(self.fonts)self.fontsize = QComboBox()self.fontsize.addItems([str(s) for s in FONT_SIZES])self.fontsize.currentIndexChanged[str].connect(lambda s: self.editor.setFontPointSize(float(s)) )format_toolbar.addWidget(self.fontsize)self.bold_action = QAction(QIcon(os.path.join('images', 'edit-bold.png')), "加粗", self)self.bold_action.setStatusTip("加粗选定内容..")self.bold_action.setShortcut(QKeySequence.Bold)self.bold_action.setCheckable(True)self.bold_action.toggled.connect(lambda x: self.editor.setFontWeight(QFont.Bold if x else QFont.Normal))format_toolbar.addAction(self.bold_action)format_menu.addAction(self.bold_action)self.italic_action = QAction(QIcon(os.path.join('images', 'edit-italic.png')), "斜体", self)self.italic_action.setStatusTip("将选定内容设为斜体..")self.italic_action.setShortcut(QKeySequence.Italic)self.italic_action.setCheckable(True)self.italic_action.toggled.connect(self.editor.setFontItalic)format_toolbar.addAction(self.italic_action)format_menu.addAction(self.italic_action)self.underline_action = QAction(QIcon(os.path.join('images', 'edit-underline.png')), "下划线", self)self.underline_action.setStatusTip("将选定内容加下划线..")self.underline_action.setShortcut(QKeySequence.Underline)self.underline_action.setCheckable(True)self.underline_action.toggled.connect(self.editor.setFontUnderline)format_toolbar.addAction(self.underline_action)format_menu.addAction(self.underline_action)format_menu.addSeparator()self.alignl_action = QAction(QIcon(os.path.join('images', 'edit-alignment.png')), "靠左对齐", self)self.alignl_action.setStatusTip("将文本靠左对齐..")self.alignl_action.setCheckable(True)self.alignl_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignLeft))format_toolbar.addAction(self.alignl_action)format_menu.addAction(self.alignl_action)self.alignc_action = QAction(QIcon(os.path.join('images', 'edit-alignment-center.png')), "居中对齐", self)self.alignc_action.setStatusTip("将文本居中对齐..")self.alignc_action.setCheckable(True)self.alignc_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignCenter))format_toolbar.addAction(self.alignc_action)format_menu.addAction(self.alignc_action)self.alignr_action = QAction(QIcon(os.path.join('images', 'edit-alignment-right.png')), "靠右对齐", self)self.alignr_action.setStatusTip("将文本靠右对齐..")self.alignr_action.setCheckable(True)self.alignr_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignRight))format_toolbar.addAction(self.alignr_action)format_menu.addAction(self.alignr_action)self.alignj_action = QAction(QIcon(os.path.join('images', 'edit-alignment-justify.png')), "对齐", self)self.alignj_action.setStatusTip("分散对齐文本..")self.alignj_action.setCheckable(True)self.alignj_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignJustify))format_toolbar.addAction(self.alignj_action)format_menu.addAction(self.alignj_action)format_group = QActionGroup(self)format_group.setExclusive(True)format_group.addAction(self.alignl_action)format_group.addAction(self.alignc_action)format_group.addAction(self.alignr_action)format_group.addAction(self.alignj_action)format_menu.addSeparator()self._format_actions = [self.fonts,self.fontsize,self.bold_action,self.italic_action,self.underline_action]self.update_format()self.update_title()self.show()

五、定义功能

也是在window的class里,我们定义保存等等的功能

    def block_signals(self, objects, b):for o in objects:o.blockSignals(b)def update_format(self):self.block_signals(self._format_actions, True)self.fonts.setCurrentFont(self.editor.currentFont())self.fontsize.setCurrentText(str(int(self.editor.fontPointSize())))self.italic_action.setChecked(self.editor.fontItalic())self.underline_action.setChecked(self.editor.fontUnderline())self.bold_action.setChecked(self.editor.fontWeight() == QFont.Bold)self.alignl_action.setChecked(self.editor.alignment() == Qt.AlignLeft)self.alignc_action.setChecked(self.editor.alignment() == Qt.AlignCenter)self.alignr_action.setChecked(self.editor.alignment() == Qt.AlignRight)self.alignj_action.setChecked(self.editor.alignment() == Qt.AlignJustify)self.block_signals(self._format_actions, False)def dialog_critical(self, s):dlg = QMessageBox(self)dlg.setText(s)dlg.setIcon(QMessageBox.Critical)dlg.show()def file_open(self):path, _ = QFileDialog.getOpenFileName(self, "Open file", "", "HTML documents (*.html);Text documents (*.txt);All files (*.*)")try:with open(path, 'rU') as f:text = f.read()except Exception as e:self.dialog_critical(str(e))else:self.path = pathself.editor.setText(text)self.update_title()def file_save(self):if self.path is None:return self.file_saveas()text = self.editor.toHtml() if splitext(self.path) in HTML_EXTENSIONS else self.editor.toPlainText()try:with open(self.path, 'w') as f:f.write(text)except Exception as e:self.dialog_critical(str(e))def file_saveas(self):path, _ = QFileDialog.getSaveFileName(self, "Save file", "", "HTML documents (*.html);Text documents (*.txt);All files (*.*)")if not path:returntext = self.editor.toHtml() if splitext(path) in HTML_EXTENSIONS else self.editor.toPlainText()try:with open(path, 'w') as f:f.write(text)except Exception as e:self.dialog_critical(str(e))else:self.path = pathself.update_title()def file_print(self):dlg = QPrintDialog()if dlg.exec_():self.editor.print_(dlg.printer())def update_title(self):self.setWindowTitle("%s - 轩氏记事本 XuanNotepad" % (os.path.basename(self.path) if self.path else "Untitled"))def edit_toggle_wrap(self):self.editor.setLineWrapMode( 1 if self.editor.lineWrapMode() == 0 else 0 )

六、生成窗口

最后一步,生成窗口(这里的applicationname你可以改掉):

if __name__ == '__main__':app = QApplication(sys.argv)app.setApplicationName("轩氏记事本 XuanNotepad")window = MainWindow()window.resize(1300,750)app.exec_()

七、最终效果

运行程序,我们来看一下效果如何!


完整代码

最后送上完整代码:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *import os
import sys
import uuidFONT_SIZES = [7, 8, 9, 10, 11, 12, 13, 14, 18, 24, 36, 48, 64, 72, 96, 144, 288]
IMAGE_EXTENSIONS = ['.jpg','.png','.bmp']
HTML_EXTENSIONS = ['.htm', '.html']def hexuuid():return uuid.uuid4().hexdef splitext(p):return os.path.splitext(p)[1].lower()class TextEdit(QTextEdit):def canInsertFromMimeData(self, source):if source.hasImage():return Trueelse:return super(TextEdit, self).canInsertFromMimeData(source)def insertFromMimeData(self, source):cursor = self.textCursor()document = self.document()if source.hasUrls():for u in source.urls():file_ext = splitext(str(u.toLocalFile()))if u.isLocalFile() and file_ext in IMAGE_EXTENSIONS:image = QImage(u.toLocalFile())document.addResource(QTextDocument.ImageResource, u, image)cursor.insertImage(u.toLocalFile())else:breakelse:returnelif source.hasImage():image = source.imageData()uuid = hexuuid()document.addResource(QTextDocument.ImageResource, uuid, image)cursor.insertImage(uuid)returnsuper(TextEdit, self).insertFromMimeData(source)class MainWindow(QMainWindow):def __init__(self, *args, **kwargs):super(MainWindow, self).__init__(*args, **kwargs)layout = QVBoxLayout()self.editor = TextEdit()self.editor.setAutoFormatting(QTextEdit.AutoAll)self.editor.selectionChanged.connect(self.update_format)font = QFont('Times', 12)self.editor.setFont(font)self.editor.setFontPointSize(12)self.path = Nonelayout.addWidget(self.editor)container = QWidget()container.setLayout(layout)self.setCentralWidget(container)self.status = QStatusBar()self.setStatusBar(self.status)file_toolbar = QToolBar("文件")file_toolbar.setIconSize(QSize(14, 14))self.addToolBar(file_toolbar)file_menu = self.menuBar().addMenu("&文件")open_file_action = QAction(QIcon(os.path.join('images', 'blue-folder-open-document.png')), "打开文件", self)open_file_action.setStatusTip("从本地磁盘中读取文件..")open_file_action.triggered.connect(self.file_open)file_menu.addAction(open_file_action)file_toolbar.addAction(open_file_action)save_file_action = QAction(QIcon(os.path.join('images', 'disk.png')), "保存", self)save_file_action.setStatusTip("保存到本地磁盘..")save_file_action.triggered.connect(self.file_save)file_menu.addAction(save_file_action)file_toolbar.addAction(save_file_action)saveas_file_action = QAction(QIcon(os.path.join('images', 'disk--pencil.png')), "另存为", self)saveas_file_action.setStatusTip("另存为文件..")saveas_file_action.triggered.connect(self.file_saveas)file_menu.addAction(saveas_file_action)file_toolbar.addAction(saveas_file_action)print_action = QAction(QIcon(os.path.join('images', 'printer.png')), "打印", self)print_action.setStatusTip("打印本页..")print_action.triggered.connect(self.file_print)file_menu.addAction(print_action)file_toolbar.addAction(print_action)edit_toolbar = QToolBar("编辑")edit_toolbar.setIconSize(QSize(16, 16))self.addToolBar(edit_toolbar)edit_menu = self.menuBar().addMenu("&编辑")undo_action = QAction(QIcon(os.path.join('images', 'arrow-curve-180-left.png')), "撤回", self)undo_action.setStatusTip("撤回上一个操作..")undo_action.triggered.connect(self.editor.undo)edit_menu.addAction(undo_action)redo_action = QAction(QIcon(os.path.join('images', 'arrow-curve.png')), "重做", self)redo_action.setStatusTip("重做撤回的操作..")redo_action.triggered.connect(self.editor.redo)edit_toolbar.addAction(redo_action)edit_menu.addAction(redo_action)edit_menu.addSeparator()cut_action = QAction(QIcon(os.path.join('images', 'scissors.png')), "剪切", self)cut_action.setStatusTip("剪切选定内容..")cut_action.setShortcut(QKeySequence.Cut)cut_action.triggered.connect(self.editor.cut)edit_toolbar.addAction(cut_action)edit_menu.addAction(cut_action)copy_action = QAction(QIcon(os.path.join('images', 'document-copy.png')), "复制", self)copy_action.setStatusTip("复制选定内容..")cut_action.setShortcut(QKeySequence.Copy)copy_action.triggered.connect(self.editor.copy)edit_toolbar.addAction(copy_action)edit_menu.addAction(copy_action)paste_action = QAction(QIcon(os.path.join('images', 'clipboard-paste-document-text.png')), "粘帖", self)paste_action.setStatusTip("从剪贴板粘帖..")cut_action.setShortcut(QKeySequence.Paste)paste_action.triggered.connect(self.editor.paste)edit_toolbar.addAction(paste_action)edit_menu.addAction(paste_action)select_action = QAction(QIcon(os.path.join('images', 'selection-input.png')), "全选", self)select_action.setStatusTip("全选所有文字..")cut_action.setShortcut(QKeySequence.SelectAll)select_action.triggered.connect(self.editor.selectAll)edit_menu.addAction(select_action)edit_menu.addSeparator()wrap_action = QAction(QIcon(os.path.join('images', 'arrow-continue.png')), "自动换行", self)wrap_action.setStatusTip("当文字长度超过边框大小时自动换行..")wrap_action.setCheckable(True)wrap_action.setChecked(True)wrap_action.triggered.connect(self.edit_toggle_wrap)edit_menu.addAction(wrap_action)format_toolbar = QToolBar("格式")format_toolbar.setIconSize(QSize(16, 16))self.addToolBar(format_toolbar)format_menu = self.menuBar().addMenu("&格式")self.fonts = QFontComboBox()self.fonts.currentFontChanged.connect(self.editor.setCurrentFont)format_toolbar.addWidget(self.fonts)self.fontsize = QComboBox()self.fontsize.addItems([str(s) for s in FONT_SIZES])self.fontsize.currentIndexChanged[str].connect(lambda s: self.editor.setFontPointSize(float(s)) )format_toolbar.addWidget(self.fontsize)self.bold_action = QAction(QIcon(os.path.join('images', 'edit-bold.png')), "加粗", self)self.bold_action.setStatusTip("加粗选定内容..")self.bold_action.setShortcut(QKeySequence.Bold)self.bold_action.setCheckable(True)self.bold_action.toggled.connect(lambda x: self.editor.setFontWeight(QFont.Bold if x else QFont.Normal))format_toolbar.addAction(self.bold_action)format_menu.addAction(self.bold_action)self.italic_action = QAction(QIcon(os.path.join('images', 'edit-italic.png')), "斜体", self)self.italic_action.setStatusTip("将选定内容设为斜体..")self.italic_action.setShortcut(QKeySequence.Italic)self.italic_action.setCheckable(True)self.italic_action.toggled.connect(self.editor.setFontItalic)format_toolbar.addAction(self.italic_action)format_menu.addAction(self.italic_action)self.underline_action = QAction(QIcon(os.path.join('images', 'edit-underline.png')), "下划线", self)self.underline_action.setStatusTip("将选定内容加下划线..")self.underline_action.setShortcut(QKeySequence.Underline)self.underline_action.setCheckable(True)self.underline_action.toggled.connect(self.editor.setFontUnderline)format_toolbar.addAction(self.underline_action)format_menu.addAction(self.underline_action)format_menu.addSeparator()self.alignl_action = QAction(QIcon(os.path.join('images', 'edit-alignment.png')), "靠左对齐", self)self.alignl_action.setStatusTip("将文本靠左对齐..")self.alignl_action.setCheckable(True)self.alignl_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignLeft))format_toolbar.addAction(self.alignl_action)format_menu.addAction(self.alignl_action)self.alignc_action = QAction(QIcon(os.path.join('images', 'edit-alignment-center.png')), "居中对齐", self)self.alignc_action.setStatusTip("将文本居中对齐..")self.alignc_action.setCheckable(True)self.alignc_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignCenter))format_toolbar.addAction(self.alignc_action)format_menu.addAction(self.alignc_action)self.alignr_action = QAction(QIcon(os.path.join('images', 'edit-alignment-right.png')), "靠右对齐", self)self.alignr_action.setStatusTip("将文本靠右对齐..")self.alignr_action.setCheckable(True)self.alignr_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignRight))format_toolbar.addAction(self.alignr_action)format_menu.addAction(self.alignr_action)self.alignj_action = QAction(QIcon(os.path.join('images', 'edit-alignment-justify.png')), "对齐", self)self.alignj_action.setStatusTip("分散对齐文本..")self.alignj_action.setCheckable(True)self.alignj_action.triggered.connect(lambda: self.editor.setAlignment(Qt.AlignJustify))format_toolbar.addAction(self.alignj_action)format_menu.addAction(self.alignj_action)format_group = QActionGroup(self)format_group.setExclusive(True)format_group.addAction(self.alignl_action)format_group.addAction(self.alignc_action)format_group.addAction(self.alignr_action)format_group.addAction(self.alignj_action)format_menu.addSeparator()self._format_actions = [self.fonts,self.fontsize,self.bold_action,self.italic_action,self.underline_action]self.update_format()self.update_title()self.show()def block_signals(self, objects, b):for o in objects:o.blockSignals(b)def update_format(self):self.block_signals(self._format_actions, True)self.fonts.setCurrentFont(self.editor.currentFont())self.fontsize.setCurrentText(str(int(self.editor.fontPointSize())))self.italic_action.setChecked(self.editor.fontItalic())self.underline_action.setChecked(self.editor.fontUnderline())self.bold_action.setChecked(self.editor.fontWeight() == QFont.Bold)self.alignl_action.setChecked(self.editor.alignment() == Qt.AlignLeft)self.alignc_action.setChecked(self.editor.alignment() == Qt.AlignCenter)self.alignr_action.setChecked(self.editor.alignment() == Qt.AlignRight)self.alignj_action.setChecked(self.editor.alignment() == Qt.AlignJustify)self.block_signals(self._format_actions, False)def dialog_critical(self, s):dlg = QMessageBox(self)dlg.setText(s)dlg.setIcon(QMessageBox.Critical)dlg.show()def file_open(self):path, _ = QFileDialog.getOpenFileName(self, "Open file", "", "HTML documents (*.html);Text documents (*.txt);All files (*.*)")try:with open(path, 'rU') as f:text = f.read()except Exception as e:self.dialog_critical(str(e))else:self.path = pathself.editor.setText(text)self.update_title()def file_save(self):if self.path is None:return self.file_saveas()text = self.editor.toHtml() if splitext(self.path) in HTML_EXTENSIONS else self.editor.toPlainText()try:with open(self.path, 'w') as f:f.write(text)except Exception as e:self.dialog_critical(str(e))def file_saveas(self):path, _ = QFileDialog.getSaveFileName(self, "Save file", "", "HTML documents (*.html);Text documents (*.txt);All files (*.*)")if not path:returntext = self.editor.toHtml() if splitext(path) in HTML_EXTENSIONS else self.editor.toPlainText()try:with open(path, 'w') as f:f.write(text)except Exception as e:self.dialog_critical(str(e))else:self.path = pathself.update_title()def file_print(self):dlg = QPrintDialog()if dlg.exec_():self.editor.print_(dlg.printer())def update_title(self):self.setWindowTitle("%s - 轩氏记事本 XuanNotepad" % (os.path.basename(self.path) if self.path else "Untitled"))def edit_toggle_wrap(self):self.editor.setLineWrapMode( 1 if self.editor.lineWrapMode() == 0 else 0 )if __name__ == '__main__':app = QApplication(sys.argv)app.setApplicationName("轩氏记事本 XuanNotepad")window = MainWindow()window.resize(1300,750)app.exec_()

>>> 本期pyqt5制作文本编辑器就到这里了,如有问题可以私聊。我们下期不见不散~

Python: pyqt5 自己写一个窗口文本编辑器相关推荐

  1. 让我们写一个 Win32 文本编辑器吧 - 1. 简介

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. 利用python来自己写一个服务器台账统计小工具

    利用python来自己写一个服务器台账统计小工具 前言 无奈呀,压力创造成品 背景是这样的,相信在看的各位在管理服务器密码的时候,肯定会有个台账啥的,当然咱也有,但是吧,为了安全期间,不允许出现在服务 ...

  3. python使用爬虫写一个自己的翻译器(带图像界面)

    python使用爬虫写一个自己的翻译器(带图像界面)   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客,B站昵称为 ...

  4. 用Python给宝宝写一个故事机(语音朗读)

    用Python给宝宝写一个故事机 运行环境及其说明 Windows Python3.6以上 可以朗读中文 需要安装的库 +  pypiwin32(用于朗读) pip install pypiwin32 ...

  5. 使用PySimpleGUI模块,写一个正则表达式的编辑器

    总流程 分析需求 代码实现 代码说明 1. self.rule 2. self.columns和self.rule_button 3. self.window_location 下步改进 1. sel ...

  6. java web编辑器插件_UEditer 是一个富文本编辑器,可以作为 插件放到javaweb项目中使用,很好用~ Develop 238万源代码下载- www.pudn.com...

    文件名称: UEditer下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 19833 KB 上传时间: 2015-03-19 下载次数: 0 提 供 者: 陈琳杰 ...

  7. #用python的pygame写一个大富翁游戏(单机版)# 一 : 初步架构

    用python写一个简易大富翁小游戏 | 一 : 初步架构 系列文章: #用python的pygame写一个大富翁游戏(单机版)# 二:地图初始化 如题,俗话说得好,人生苦短,我用python,在大二 ...

  8. #用python的pygame写一个大富翁游戏(单机版)# 二:地图初始化

    用python的pygame写一个大富翁游戏(单机版) 二 :地图初始化 往期: #用python的pygame写一个大富翁游戏(单机版)# 一 : 初步架构 上次的博客,我们说到了准备好所有程序所需 ...

  9. Python 使用闭包写一个计数器【简单易懂,代码可以直接运行】

    Python 使用闭包写一个计数器 闭包:外层函数返回一个内层函数就是闭包 代码如下,每调用一次函数,函数次数加1: def outer(*args,**kwargs):a = 0def inner( ...

最新文章

  1. 深度学习100例-卷积神经网络(VGG-19)识别灵笼中的人物 | 第7天
  2. import pymysql 没有模块_小白详细的 python 模块的运用
  3. python decode unicode encode
  4. 未来5年人工智能将取代6%工作职位
  5. linux 7升级win10双系统,安装 Windows 10 + Centos 7 双系统共存
  6. ARC077C pushpush 递推
  7. ai人工智能可以干什么_我们可以使人工智能更具道德性吗?
  8. 30多岁,你的存款有多少?
  9. 『HarmonyOS』万物互联,分布式操作系统
  10. 谷歌浏览器 如何设置在新标签页打开链接
  11. 讯飞、有道、谷歌、微软语音sdk集成总结
  12. java.lang.IllegalAccessException:的一种错误类型
  13. Ubuntu22.04安装gcc-5和g++-5
  14. 面向对象与面向过程理解
  15. 淘宝商品主图销量促销价查询接口
  16. 激光雷达建图(基于ROS)及定位数据获取步骤
  17. 头歌平台(EduCoder)—— Matplotlib图形配置
  18. 铁路办公施工信息化管理系统软件平台
  19. gear s3刷android wear,三星gear s3怎么刷机教程 三星gear s3刷机方法流程
  20. 一名合格的网络管理员应该具备哪些技能

热门文章

  1. Manjaro 安装 ibus-rime 输入法
  2. modelsim的详细使用方法和容易出现的问题!(适用初学者)
  3. 双目和多目摄像头对齐与拼接
  4. js日期加减一天_用js进行日期的加减
  5. mysql——mysql数据备份与数据恢复
  6. 卧槽!百度网盘炸了!!!
  7. Python3.6实现12306火车票自动抢票
  8. 如何使用systemctl管理postgres数据库启停
  9. java实现比心_如何在java中制作比心图案?
  10. 苹果手机真不行了!iPhone11系列刚上市就问题不断