pyqt5 做一个完整得代码编辑器
时间: 2023-10-05 19:14:47 浏览: 155
基于Python PyQt5实现的文本编辑器源码,带GUI界面
要做一个完整的代码编辑器,需要实现以下功能:
1. 新建、打开、保存文件;
2. 代码编辑区,支持语法高亮、自动补全、代码折叠等功能;
3. 编辑器状态栏,显示当前行号、列号、文件名等信息;
4. 快捷键,如Ctrl+N新建文件、Ctrl+S保存文件等;
5. 其他功能,如查找替换、撤销重做、全屏等。
以下是一个示例,演示如何使用PyQt5实现一个完整的代码编辑器:
```python
import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QTextEdit, QLabel, QStatusBar
from PyQt5.QtGui import QIcon, QTextCursor
from PyQt5.QtCore import Qt
from PyQt5.QtWebEngineWidgets import QWebEngineView
class CodeEditor(QMainWindow):
def __init__(self):
super().__init__()
# 设置窗口大小、标题和图标
self.setGeometry(100, 100, 800, 600)
self.setWindowTitle('Code Editor')
self.setWindowIcon(QIcon('icon.png'))
# 创建状态栏
self.statusBar = QStatusBar()
self.statusBar.showMessage('Ready')
self.setStatusBar(self.statusBar)
# 创建编辑区
self.editor = QTextEdit(self)
self.editor.setTabStopWidth(40)
self.editor.cursorPositionChanged.connect(self.update_status_bar)
self.setCentralWidget(self.editor)
# 创建Monaco Editor
self.web_view = QWebEngineView(self)
self.web_view.setVisible(False)
self.web_view.setHtml('''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Monaco Editor</title>
<script src="https://cdn.jsdelivr.net/npm/monaco-editor/min/vs/loader.js"></script>
<script>
require.config({ paths: { 'vs': 'https://cdn.jsdelivr.net/npm/monaco-editor/min/vs' }});
require(['vs/editor/editor.main'], function() {
var editor = monaco.editor.create(document.getElementById('editor'), {
theme: 'vs-dark',
language: 'python',
automaticLayout: true,
value: `print('Hello, World!')`
});
editor.onDidChangeModelContent(function() {
var value = editor.getValue();
window.pyqt_on_editor_content_changed(value);
});
});
</script>
</head>
<body>
<div id="editor" style="height: 100%;"></div>
</body>
</html>
''')
self.web_view.loadFinished.connect(self.setup_monaco_editor)
# 创建菜单栏
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('File')
# 新建文件
new_file_action = file_menu.addAction('New')
new_file_action.setShortcut('Ctrl+N')
new_file_action.triggered.connect(self.new_file)
# 打开文件
open_file_action = file_menu.addAction('Open')
open_file_action.setShortcut('Ctrl+O')
open_file_action.triggered.connect(self.open_file)
# 保存文件
save_file_action = file_menu.addAction('Save')
save_file_action.setShortcut('Ctrl+S')
save_file_action.triggered.connect(self.save_file)
# 另存为
save_file_as_action = file_menu.addAction('Save As')
save_file_as_action.triggered.connect(self.save_file_as)
# 创建工具栏
tool_bar = self.addToolBar('Tools')
# 新建文件
tool_bar.addAction(QIcon('new.png'), 'New', self.new_file)
# 打开文件
tool_bar.addAction(QIcon('open.png'), 'Open', self.open_file)
# 保存文件
tool_bar.addAction(QIcon('save.png'), 'Save', self.save_file)
# 创建Monaco Editor
tool_bar.addAction(QIcon('monaco.png'), 'Monaco Editor', self.toggle_monaco_editor)
# 显示窗口
self.show()
def new_file(self):
self.editor.clear()
self.current_file = ''
self.update_status_bar()
def open_file(self):
file_name, _ = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt);;Python Files (*.py)')
if file_name:
with open(file_name, 'r') as f:
self.editor.setPlainText(f.read())
self.current_file = file_name
self.update_status_bar()
def save_file(self):
if self.current_file:
with open(self.current_file, 'w') as f:
f.write(self.editor.toPlainText())
else:
self.save_file_as()
def save_file_as(self):
file_name, _ = QFileDialog.getSaveFileName(self, 'Save File', '', 'Text Files (*.txt);;Python Files (*.py)')
if file_name:
with open(file_name, 'w') as f:
f.write(self.editor.toPlainText())
self.current_file = file_name
self.update_status_bar()
def update_status_bar(self):
cursor = self.editor.textCursor()
line = cursor.blockNumber() + 1
col = cursor.columnNumber() + 1
if self.current_file:
file_name = os.path.basename(self.current_file)
self.statusBar.showMessage(f'Line {line}, Col {col} | {file_name}')
else:
self.statusBar.showMessage(f'Line {line}, Col {col}')
def setup_monaco_editor(self):
self.monaco_editor = self.web_view.page().mainFrame().evaluateJavaScript('editor')
self.monaco_editor.setValue(self.editor.toPlainText())
def toggle_monaco_editor(self):
if self.web_view.isVisible():
self.editor.setPlainText(self.monaco_editor.getValue())
self.editor.setVisible(True)
self.web_view.setVisible(False)
else:
self.monaco_editor.setValue(self.editor.toPlainText())
self.web_view.setVisible(True)
self.editor.setVisible(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
editor = CodeEditor()
sys.exit(app.exec_())
```
这个示例实现了一个完整的代码编辑器,包括新建、打开、保存文件功能,代码编辑区支持语法高亮、自动补全、代码折叠等功能,编辑器状态栏显示当前行号、列号、文件名等信息,还有快捷键和Monaco Editor等功能。
需要注意的是,Monaco Editor是一个基于Web的编辑器,需要从远程服务器加载相关资源,因此在使用PyQt5嵌入Monaco Editor时,需要保证网络连接正常。另外,为了方便演示,这个示例使用了本地图片和默认代码,实际使用时需要根据自己的需求进行修改。
阅读全文