实现一个python代码编辑器

目录

qt的QWebEngineView类

python的flask 

bug1:跨域支持

bug2:XMLHttpRequest 没有把数据send过去

bug3:执行exec函数 name 'xx' is not defined

结果展示(qt显示html)

go的net/http


代码编辑器采用了monacoEditor,一个现成的编辑器。网上有很多文档介绍和开源项目,但是怎么说呢,跟着做,可以实现一个网页编辑器,可以高亮python的语法,但是没有python的提示,找不到可以参考的,js我也不会,看的着实云里雾里。
【提示】在VsCode上运行比较方便

--------------------开源项目-------------------------

我参考了这个

vue-monaco-editor-demo: vue 使用 monaco-editor 实现在线代码在线编辑器 (gitee.com)

下面python提示的第二个参考也可以(我试过了,这个内容比较丰富,但是编译出来的dist在qt上显示不出网页,所以用了上面这个) 

----------------------------------------------------------

目前我对实现一个python代码编辑器的理解是这样的:先搞一个前端的代码编辑器html,然后在你的工程里显示html。但是编辑器里的代码怎么运行,我还没有头绪。

目前的进度就是前端可以生成一个网页,可以写python代码,有高亮,但是没有python提示。

-------------------更新   python 提示 ----------------------

参考

如何实现一个在线代码编辑器_哔哩哔哩_bilibili

Vue3中使用Monaco Editor代码编辑器记录——主动触发代码补全功能(python和sql为例)~持续更新_monaco.languages.registercompletionitemprovider-CSDN博客

------------------------------------------------------------------ 

ok,参考上面的两个,python提示出来了(就是下面的这块代码,加入初始化运行的函数里)。这个B站的视频,我觉得挺好的,听完感觉是逻辑清晰了(对我这种不会写网页的小白来说)

          monaco.languages.registerCompletionItemProvider('python', {
				provideCompletionItems: function () {
					let suggestions = [];
					// 这个keywords就是python.js文件中有的
					pythonLanguage.keywords.forEach(item => {
						suggestions.push({
							label: item,
							kind: monaco.languages.CompletionItemKind.Keyword,
							insertText: item
						});
					})
					return {
						// 最后要返回一个数组
						suggestions:suggestions
					};
			  },
		  });

下一步的计划是显示网页,尝试了几个不同的方法。这几个方法怎么说呢,都可以显示html,但是上一步的编译出来的html其实还要带文件夹一起,感觉文件大小有点大,对于一个项目来说,不是一个很好的选择。

qt的QWebEngineView类

        qt有一个类,QWebEngineView可以用来显示html,具体用法就是用load函数,传入html的路径。

【注意】这里的html是上一步的文件build后生成在dist文件里的html,要把整个dist文件夹拷过来放在qt的运行目录里。

    MonacoEditor w;
    QWebEngineView view(&w);
    QString path = QApplication::applicationDirPath() + "/dist/index.html";
    view.load(QUrl(path));
    w.setCentralWidget(&view);
    w.show();

python的flask 

        flask是python的一个Web 框架。下面的代码是网上教程看的。用flask可以装一个pycharm。

from flask import  Flask,render_template
app=Flask(__name__)         #实例化并命名为app实例
#启动这个WEB服务
@app.route('/')
def index():
    msg = "hello world"
    #在文件目录下创建Templates文件夹,里面新建index.html
    return render_template("index.html",data = msg)  # 加入变量传递  
    
if __name__=="__main__":
    app.run(port=8088,host="127.0.0.1",debug=True)

  更新:html作为前端,绑定端口8080,flask作为后端,绑定端口为8088。现在开始思考怎么让后端获取到前端输入的python代码。

bug1:跨域支持

        在尝试过程中,html使用XMLHttpRequest,用GET发送内容,但是对应的status是0,responseText是空。进入html按F12进入终端发现下面报错。就是跨域失败,网上有的说前端加header["Access-Control-Allow-Origin","*"];,但对我这个来说没有用,这里使用flask的跨域支持可以参考下面这个博客,使用flask_cors模块,问题成功解决。[736]Flask - 解决Access-Control-Allow-Origin跨域请求问题_flask make_response no 'access-control-allow-origi-CSDN博客

在终端输入 pip install -U flask-cors,安装cors,然后再py文件中加入即可。

from flask import  Flask,render_template,request
from flask_cors import CORS
app=Flask(__name__)         #实例化并命名为app实例

# 跨域支持
CORS(app)

再html点击运行按钮,发现status状态已经是200,表示请求成功 。

 

bug2:XMLHttpRequest 没有把数据send过去

        刚解决完bug1,bug2就来了,一坑接一坑。

        后端收到的数据一直是None,百度上说法也挺多。有人说是前端的参数类型和后端的参数类型不匹配,有人说在前端加XMLHttpRequest.setRequestHeader("Content-type","application/json");,有人说是访问一个不存在的网页或者输入了一个错误的网址,也有可能是服务器的配置。

我这个是点击后端生成的网页发现不存在。后面发现时因为我的后端def index()函数没有return,加个return返回值就行了。

bug3:执行exec函数 name 'xx' is not defined

        这里返回的是标准输出。单单的print函数是没问题的,但是稍微复杂一点就会出现问题,会提示name 'xx' is not defined。

        在网上找一个简单的python代码测试

# 定义两个列表
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# 使用列表推导式找出两个列表中不同的元素
difference = [item for item in list1 if item not in list2]
print(difference)

 后端收到的内容是这样的

exec执行data,前端返回报错。

但是list2是存在的,这个问题我不知道怎么解决,我试了其他的代码都是可以的,就这个有问题,暂时不管了。


【更新】在看下一个方法的时候,看到了argparse 模块

argparse是一个Python模块:命令行选项、参数和子命令解析器

1. argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数
2. 其次,argparse 将弄清如何从 sys.argv 解析出那些参数。
3. argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

 

结果展示(qt显示html)

【提示】flask后端执行代码我用exec函数,实际上不太合适,`exec`可以执行任意代码,所以它可能带来安全问题和潜在的错误,如果是工业项目建议换其他的方法。

Python、Tornado、markdown编辑器

Tornado是什么?Tornado既是web server又是web框架

基于开源项目GitHub - vimior/PythonWebIDE: A Simple Python Web IDE

bug1: No module named 'distutils'

参考关于 No module named ‘distutils‘的错误_no module named 'distutils-CSDN博客

在终端输入pip install setuptools即可解决。

go的net/http

        这个还没开始,等会去试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值