1 Star 0 Fork 1

evan886 / notepad-pyqt5

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
Notepad.py 25.13 KB
一键复制 编辑 原始数据 按行查看 历史
Crazy_Coder 提交于 2015-04-21 22:30 . 添加替换功能
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
# -*- coding:utf-8 -*-
__author__ = 'sunhao'
__email__ = 'sunhao.java@gmail.com'
__date__ = '2015-4-19 05:48'
import sys
import ctypes
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtPrintSupport import QPrintDialog, QPrinter
QtCore.QTextCodec.setCodecForLocale(QtCore.QTextCodec.codecForName("UTF-8"))
class Notepad(QtWidgets.QMainWindow):
def __init__(self):
"""全局变量"""
# 剪切板
self.clipboard = QtWidgets.QApplication.clipboard()
# 上一次搜索内容
self.lastSearchText = ""
self.lastReplaceSearchText = ""
self.reset = False
QtWidgets.QMainWindow.__init__(self)
self.initUI()
def initUI(self):
self.setWindowTitle("无标题 - 记事本")
self.setWindowIcon(QtGui.QIcon("images/notepad.png"))
self.initEditText()
self.createActions()
self.createStatusBar()
self.createMenubars()
self.createToolBars()
self.readSettings()
self.text.document().contentsChanged.connect(self.documentWasModified)
self.setCurrentFile('')
def initEditText(self):
# 设置编辑区
self.text = QtWidgets.QPlainTextEdit()
self.text.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.text.customContextMenuRequested.connect(self.customContextMenu)
self.setCentralWidget(self.text)
def customContextMenu(self):
menu = QtWidgets.QMenu(self)
menu.addAction(self.undoAction)
menu.addSeparator()
menu.addAction(self.cutAction)
menu.addAction(self.copyAction)
menu.addAction(self.pasteAction)
menu.addAction(self.deleteAction)
menu.addSeparator()
menu.addAction(self.selectAllAction)
menu.exec_(QtGui.QCursor.pos())
return menu
def documentWasModified(self):
self.setWindowModified(self.text.document().isModified())
if "" != self.text.toPlainText():
self.findAction.setEnabled(True)
self.findNextAction.setEnabled(True)
else:
self.findAction.setEnabled(False)
self.findNextAction.setEnabled(False)
def readSettings(self):
settings = QtCore.QSettings("sunhao", "notepad")
size = settings.value("size", QtCore.QSize(1000, 600))
screen = QtWidgets.QDesktopWidget().screenGeometry()
pos = settings.value("pos",
QtCore.QPoint((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2))
wrapMode = settings.value("wrapMode", QtWidgets.QPlainTextEdit.WidgetWidth)
fonts = settings.value("fonts", QtGui.QFont("Consolas", 14))
toolbar = settings.value("toolbar", self.toolBar.isHidden())
self.resize(size)
self.move(pos)
self.text.setLineWrapMode(wrapMode)
self.text.setFont(fonts)
if 0 == wrapMode:
self.autoWrapAction.setIcon(QtGui.QIcon("images/check_no.png"))
elif 1 == wrapMode:
self.autoWrapAction.setIcon(QtGui.QIcon("images/check.png"))
if "true" == toolbar:
self.toolBar.hide()
self.toolBarAction.setIcon(QtGui.QIcon("images/check_no.png"))
else:
self.toolBar.show()
self.toolBarAction.setIcon(QtGui.QIcon("images/check.png"))
def resetSettings(self):
QtCore.QSettings("sunhao", "notepad").clear()
QtWidgets.QMessageBox.information(self, "记事本", "重置成功,请重启记事本!")
self.reset = True
self.close()
def writeSettings(self):
settings = QtCore.QSettings("sunhao", "notepad")
settings.setValue("size", self.size())
settings.setValue("pos", self.pos())
settings.setValue("wrapMode", self.text.lineWrapMode())
settings.setValue("fonts", self.text.font())
settings.setValue("toolbar", self.toolBar.isHidden())
def createActions(self):
self.newAction = QtWidgets.QAction(QtGui.QIcon('images/new.png'), "&新建", self,
shortcut=QtGui.QKeySequence.New, statusTip="创建文件",
triggered=self.newFile)
self.openAction = QtWidgets.QAction(QtGui.QIcon('images/open.png'), "&打开...",
self, shortcut=QtGui.QKeySequence.Open,
statusTip="打开文件", triggered=self.openFileEvent)
self.saveAction = QtWidgets.QAction(QtGui.QIcon('images/save.png'), "&保存", self,
shortcut=QtGui.QKeySequence.Save,
statusTip="保存文件", triggered=self.save)
self.saveAsAction = QtWidgets.QAction(QtGui.QIcon('images/save.png'), "另存为...", self,
shortcut=QtGui.QKeySequence.SaveAs,
statusTip="另存文件",
triggered=self.saveAs)
self.printAction = QtWidgets.QAction(QtGui.QIcon('images/print.png'), "打印...", self,
shortcut=QtGui.QKeySequence.Print,
statusTip="打印文件",
triggered=self.printText)
self.exitAction = QtWidgets.QAction(QtGui.QIcon('images/exit.png'), "退出", self, shortcut="Ctrl+Q",
statusTip="退出程序", triggered=self.close)
self.undoAction = QtWidgets.QAction(QtGui.QIcon('images/undo.png'), "撤销", self,
shortcut=QtGui.QKeySequence.Undo,
statusTip="撤销编辑",
triggered=self.text.undo)
self.cutAction = QtWidgets.QAction(QtGui.QIcon('images/cut.png'), "剪切", self,
shortcut=QtGui.QKeySequence.Cut,
statusTip="剪切选中的文本",
triggered=self.text.cut)
self.copyAction = QtWidgets.QAction(QtGui.QIcon('images/copy.png'), "复制", self,
shortcut=QtGui.QKeySequence.Copy,
statusTip="复制选中的文本",
triggered=self.text.copy)
self.pasteAction = QtWidgets.QAction(QtGui.QIcon('images/paste.png'), "粘贴", self,
shortcut=QtGui.QKeySequence.Paste,
statusTip="粘贴剪切板的文本",
triggered=self.text.paste)
self.clearAction = QtWidgets.QAction(QtGui.QIcon('images/clear.png'), "清空剪切板", self,
statusTip="清空剪切板",
triggered=self.clearClipboard)
self.deleteAction = QtWidgets.QAction(QtGui.QIcon("images/delete.png"), "删除", self,
statusTip="删除选中的文本",
triggered=self.delete)
self.findAction = QtWidgets.QAction(QtGui.QIcon("images/find.png"), "查找", self,
statusTip="查找文本", triggered=self.findText, shortcut=QtGui.QKeySequence.Find)
self.findNextAction = QtWidgets.QAction(QtGui.QIcon("images/find.png"), "查找下一个", self,
statusTip="查找文本", triggered=self.findNextText,
shortcut=QtGui.QKeySequence.FindNext)
self.replaceAction = QtWidgets.QAction(QtGui.QIcon("images/replace.png"), "替换", self,
statusTip="替换文本", triggered=self.replaceText,
shortcut=QtGui.QKeySequence.Replace)
self.selectAllAction = QtWidgets.QAction(QtGui.QIcon('images/selectAll.png'), "全选", self,
shortcut=QtGui.QKeySequence.SelectAll,
statusTip="全选",
triggered=self.text.selectAll)
self.dateAction = QtWidgets.QAction(QtGui.QIcon("images/date.png"), "时间/日期", self, shortcut="F5",
statusTip="插入时间/日期",
triggered=self.dateEvent)
self.autoWrapAction = QtWidgets.QAction(QtGui.QIcon("images/check.png"), "自动换行", self,
statusTip="设置自动换行",
triggered=self.setWrap)
self.fontAction = QtWidgets.QAction(QtGui.QIcon("images/font.png"), "字体", self,
statusTip="设置字体", triggered=self.setFont_)
self.toolBarAction = QtWidgets.QAction(QtGui.QIcon("images/check.png"), "工具栏", self,
statusTip="工具栏",
triggered=self.toggleToolBar)
self.resetAction = QtWidgets.QAction(QtGui.QIcon("images/reset.png"), "重置", self,
statusTip="重置所有属性",
triggered=self.resetSettings)
self.aboutAction = QtWidgets.QAction(QtGui.QIcon("images/about.png"), "关于", self, triggered=self.about)
self.aboutQtAction = QtWidgets.QAction(QtGui.QIcon("images/qt.png"), "关于Qt", self,
triggered=QtWidgets.QApplication.instance().aboutQt)
self.undoAction.setEnabled(False)
self.cutAction.setEnabled(False)
self.copyAction.setEnabled(False)
self.deleteAction.setEnabled(False)
if "" == self.clipboard.text():
self.pasteAction.setEnabled(False)
self.clearAction.setEnabled(False)
if "" == self.text.toPlainText():
self.findAction.setEnabled(False)
self.findNextAction.setEnabled(False)
self.text.undoAvailable.connect(self.undoAction.setEnabled)
self.text.copyAvailable.connect(self.cutAction.setEnabled)
self.text.copyAvailable.connect(self.copyAction.setEnabled)
self.text.copyAvailable.connect(self.deleteAction.setEnabled)
self.clipboard.dataChanged.connect(self.enabledSomeActionByClipboard)
def enabledSomeActionByClipboard(self):
if ("" != self.clipboard.text()):
self.pasteAction.setEnabled(True)
self.clearAction.setEnabled(True)
def clearClipboard(self):
self.clipboard.clear()
self.pasteAction.setEnabled(False)
self.clearAction.setEnabled(False)
def createStatusBar(self):
self.statusBar().showMessage("准备就绪")
def createMenubars(self):
file = self.menuBar().addMenu("文件")
file.addAction(self.newAction)
file.addAction(self.openAction)
file.addAction(self.saveAction)
file.addAction(self.saveAsAction)
file.addSeparator()
file.addAction(self.printAction)
file.addSeparator()
file.addAction(self.exitAction)
edit = self.menuBar().addMenu("编辑")
edit.addAction(self.undoAction)
edit.addSeparator()
edit.addAction(self.cutAction)
edit.addAction(self.copyAction)
edit.addAction(self.pasteAction)
edit.addAction(self.clearAction)
edit.addAction(self.deleteAction)
edit.addSeparator()
edit.addAction(self.findAction)
edit.addAction(self.findNextAction)
edit.addAction(self.replaceAction)
edit.addSeparator()
edit.addAction(self.selectAllAction)
edit.addAction(self.dateAction)
style = self.menuBar().addMenu("格式")
style.addAction(self.autoWrapAction)
style.addAction(self.fontAction)
view = self.menuBar().addMenu("查看")
view.addAction(self.toolBarAction)
view.addAction(self.resetAction)
help = self.menuBar().addMenu("帮助")
help.addAction(self.aboutAction)
help.addAction(self.aboutQtAction)
def createToolBars(self):
self.toolBar = self.addToolBar("")
self.toolBar.addAction(self.newAction)
self.toolBar.addAction(self.openAction)
self.toolBar.addAction(self.saveAction)
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.clearAction)
def newFile(self):
if self.maybeSave():
self.text.clear()
def maybeSave(self):
if self.text.document().isModified():
ret = self.tip()
if 0 == ret:
return self.save()
if 2 == ret:
return False
return True
def openFileEvent(self):
# 如果先前被打开的文件已被修改,需要提示
if self.maybeSave():
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self)
file = QtCore.QFile(fileName)
if not file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
QtWidgets.QMessageBox.warning(self, "记事本",
"文件%s不能被读取:\n%s." % (fileName, file.errorString()))
return
inf = QtCore.QTextStream(file)
QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
self.text.setPlainText(inf.readAll())
QtWidgets.QApplication.restoreOverrideCursor()
self.setCurrentFile(fileName)
self.statusBar().showMessage("文件读取成功", 2000)
def setCurrentFile(self, fileName):
self.curFile = fileName
self.text.document().setModified(False)
self.setWindowModified(False)
if self.curFile:
shownName = self.strippedName(self.curFile)
else:
shownName = '未命名.txt'
self.setWindowTitle("%s[*] - 记事本" % shownName)
def strippedName(self, fullFileName):
return QtCore.QFileInfo(fullFileName).fileName()
def save(self):
if self.curFile:
return self.saveFile(self.curFile)
else:
return self.saveAs()
def saveAs(self):
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self)
if fileName:
return self.saveFile(fileName)
return False
def saveFile(self, fileName):
file = QtCore.QFile(fileName)
if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
QtWidgets.QMessageBox.warning(self, "记事本",
"文件%s不能被写入:\n%s." % (fileName, file.errorString()))
return False
outf = QtCore.QTextStream(file)
QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
outf << self.text.toPlainText()
QtWidgets.QApplication.restoreOverrideCursor()
self.setCurrentFile(fileName)
self.statusBar().showMessage("写入文件成功", 2000)
return True
def closeEvent(self, event):
if not self.maybeSave():
event.ignore()
else:
if not self.reset:
self.writeSettings()
event.accept()
def tip(self, title="记事本", content="文件已被修改,是否保存?"):
alertBox = QtWidgets.QMessageBox(self)
saveButton = alertBox.addButton("保存", QtWidgets.QMessageBox.ActionRole)
unSaveButton = alertBox.addButton("不保存", QtWidgets.QMessageBox.ActionRole)
cancelButton = alertBox.addButton("取消", QtWidgets.QMessageBox.ActionRole)
alertBox.setWindowTitle(title)
alertBox.setText(content)
alertBox.exec_()
button = alertBox.clickedButton()
if saveButton == button:
return 0
elif unSaveButton == button:
return 1
elif cancelButton == button:
return 2
else:
return -1;
def dateEvent(self):
"""插入时间"""
current = QtCore.QDateTime.currentDateTime();
current = current.toString("yyyy-MM-dd hh:mm");
self.text.insertPlainText(current)
def printText(self):
document = self.text.document()
printer = QPrinter()
dlg = QPrintDialog(printer, self)
if dlg.exec_() != QtWidgets.QDialog.Accepted:
return
document.print_(printer)
self.statusBar().showMessage("打印成功", 2000)
def delete(self):
cursor = self.text.textCursor()
if not cursor.isNull():
cursor.removeSelectedText()
self.statusBar().showMessage("删除成功", 2000)
def findText(self):
self.displayFindDialog()
def findNextText(self):
if "" == self.lastSearchText:
self.displayFindDialog()
else:
self.search()
def displayFindDialog(self):
self.findDialog = QtWidgets.QDialog(self)
label = QtWidgets.QLabel("查找内容:")
self.lineEdit = QtWidgets.QLineEdit()
self.lineEdit.setText(self.lastSearchText)
label.setBuddy(self.lineEdit)
# TODO 功能未实现
self.caseCheckBox = QtWidgets.QCheckBox("区分大小写")
self.fromStartCheckBox = QtWidgets.QCheckBox("向下")
self.fromStartCheckBox.setChecked(True)
self.findButton = QtWidgets.QPushButton("查找下一个")
self.findButton.setDefault(True)
self.findButton.clicked.connect(self.search)
buttonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical)
buttonBox.addButton(self.findButton, QtWidgets.QDialogButtonBox.ActionRole)
topLeftLayout = QtWidgets.QHBoxLayout()
topLeftLayout.addWidget(label)
topLeftLayout.addWidget(self.lineEdit)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addLayout(topLeftLayout)
leftLayout.addWidget(self.caseCheckBox)
leftLayout.addWidget(self.fromStartCheckBox)
mainLayout = QtWidgets.QGridLayout()
mainLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
mainLayout.addLayout(leftLayout, 0, 0)
mainLayout.addWidget(buttonBox, 0, 1)
mainLayout.setRowStretch(2, 1)
self.findDialog.setLayout(mainLayout)
self.findDialog.setWindowTitle("查找")
self.findDialog.show()
def search(self):
# 获取光标位置
# 从光标位置处开始搜索
cursor = self.text.textCursor()
findIndex = cursor.anchor()
text = self.lineEdit.text()
content = self.text.toPlainText()
length = len(text)
index = content.find(text, findIndex)
self.lastSearchText = text
if -1 == index:
errorDialog = QtWidgets.QMessageBox(self)
errorDialog.addButton("取消", QtWidgets.QMessageBox.ActionRole)
errorDialog.setWindowTitle("记事本")
errorDialog.setText("找不到\"%s\"." % text)
errorDialog.setIcon(QtWidgets.QMessageBox.Critical)
errorDialog.exec_()
else:
start = index
cursor = self.text.textCursor()
cursor.clearSelection()
cursor.movePosition(QtGui.QTextCursor.Start, QtGui.QTextCursor.MoveAnchor)
cursor.movePosition(QtGui.QTextCursor.Right, QtGui.QTextCursor.MoveAnchor, start + length)
cursor.movePosition(QtGui.QTextCursor.Left, QtGui.QTextCursor.KeepAnchor, length)
cursor.selectedText()
self.text.setTextCursor(cursor)
def replaceText(self):
replaceDialog = QtWidgets.QDialog(self)
replaceLabel = QtWidgets.QLabel("替换内容:")
self.replaceText = QtWidgets.QLineEdit()
self.replaceText.setText(self.lastReplaceSearchText)
replaceLabel.setBuddy(self.replaceText)
replaceToLabel = QtWidgets.QLabel("替换为 :")
self.replaceToText = QtWidgets.QLineEdit()
replaceToLabel.setBuddy(self.replaceToText)
caseCheckBox = QtWidgets.QCheckBox("区分大小写")
findNextButton = QtWidgets.QPushButton("查找下一个")
findNextButton.setDefault(True)
replaceButton = QtWidgets.QPushButton("替换")
replaceAllButton = QtWidgets.QPushButton("全部替换")
cancelAllButton = QtWidgets.QPushButton("取消")
# 按钮事件绑定
findNextButton.clicked.connect(lambda: self.replaceOrSearch(False))
cancelAllButton.clicked.connect(replaceDialog.close)
replaceButton.clicked.connect(lambda: self.replaceOrSearch(True))
replaceAllButton.clicked.connect(replaceDialog.close)
buttonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical)
buttonBox.addButton(findNextButton, QtWidgets.QDialogButtonBox.ActionRole)
buttonBox.addButton(replaceButton, QtWidgets.QDialogButtonBox.ActionRole)
buttonBox.addButton(replaceAllButton, QtWidgets.QDialogButtonBox.ActionRole)
buttonBox.addButton(cancelAllButton, QtWidgets.QDialogButtonBox.ActionRole)
topLeftLayout = QtWidgets.QHBoxLayout()
topLeftLayout.addWidget(replaceLabel)
topLeftLayout.addWidget(self.replaceText)
topLeftLayout2 = QtWidgets.QHBoxLayout()
topLeftLayout2.addWidget(replaceToLabel)
topLeftLayout2.addWidget(self.replaceToText)
leftLayout = QtWidgets.QVBoxLayout()
leftLayout.addLayout(topLeftLayout)
leftLayout.addLayout(topLeftLayout2)
leftLayout.addWidget(caseCheckBox)
mainLayout = QtWidgets.QGridLayout()
mainLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
mainLayout.addLayout(leftLayout, 0, 0)
mainLayout.addWidget(buttonBox, 0, 1)
mainLayout.setRowStretch(2, 1)
replaceDialog.setLayout(mainLayout)
replaceDialog.setWindowTitle("替换")
replaceDialog.show()
def replaceOrSearch(self, isReplace):
# 获取光标位置
# 从光标位置处开始搜索
cursor = self.text.textCursor()
findIndex = cursor.anchor()
text = self.replaceText.text()
content = self.text.toPlainText()
length = len(text)
index = content.find(text, findIndex)
self.lastReplaceSearchText = text
if -1 == index:
errorDialog = QtWidgets.QMessageBox(self)
errorDialog.addButton("取消", QtWidgets.QMessageBox.ActionRole)
errorDialog.setWindowTitle("记事本")
errorDialog.setText("找不到\"%s\"." % text)
errorDialog.setIcon(QtWidgets.QMessageBox.Critical)
errorDialog.exec_()
else:
start = index
if isReplace:
toReplaceText = self.replaceToText.text()
prefix = content[0:start]
postfix = content[start + length:]
newText = prefix + toReplaceText + postfix
self.text.setPlainText(newText)
length = len(toReplaceText)
self.text.document().setModified(True)
cursor = self.text.textCursor()
cursor.clearSelection()
cursor.movePosition(QtGui.QTextCursor.Start, QtGui.QTextCursor.MoveAnchor)
cursor.movePosition(QtGui.QTextCursor.Right, QtGui.QTextCursor.MoveAnchor, start + length)
cursor.movePosition(QtGui.QTextCursor.Left, QtGui.QTextCursor.KeepAnchor, length)
cursor.selectedText()
self.text.setTextCursor(cursor)
def setWrap(self):
mode = self.text.lineWrapMode()
if 1 == mode:
# 自动换行
self.text.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
self.autoWrapAction.setIcon(QtGui.QIcon("images/check_no.png"))
else:
# 不自动换行
self.text.setLineWrapMode(QtWidgets.QPlainTextEdit.WidgetWidth)
self.autoWrapAction.setIcon(QtGui.QIcon("images/check.png"))
def toggleToolBar(self):
if self.toolBar.isHidden():
self.toolBar.show()
self.toolBarAction.setIcon(QtGui.QIcon("images/check.png"))
else:
self.toolBar.hide()
self.toolBarAction.setIcon(QtGui.QIcon("images/check_no.png"))
def setFont_(self):
font, ok = QtWidgets.QFontDialog.getFont(QtGui.QFont(self.text.toPlainText()), self)
if ok:
self.text.setFont(font)
def about(self):
QtWidgets.QMessageBox.about(self, "关于记事本",
"这是仿照Windows系统自带记事本(Nodepad)应用写的一个基于Python_3.4.1 + PyQt_5.4.1的山寨记事本\r\n"
"作者:孙昊\r\n"
"时间:2015-04-18 19:51 ~ 2015-04-19 12:42")
# 设置Windows任务栏的图标
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("nodepad")
app = QtWidgets.QApplication(sys.argv)
notepad = Notepad()
notepad.show()
app.exec_()
1
https://gitee.com/evan886/notepad-pyqt5.git
git@gitee.com:evan886/notepad-pyqt5.git
evan886
notepad-pyqt5
notepad-pyqt5
master

搜索帮助