Python在线编辑器

from flask import Flask, render_template, request, jsonify
import sys
from io import StringIO
import contextlib
import subprocess
import importlib
import threading
import time
import ast
import reapp = Flask(__name__)RESTRICTED_PACKAGES = {'tkinter': '抱歉,在线编译器不支持 tkinter,因为它需要图形界面环境。请在本地运行需要GUI的代码。','tk': '抱歉,在线编译器不支持 tk/tkinter,因为它需要图形界面环境。请在本地运行需要GUI的代码。','pygame': 'pygame将被转换为Web版本运行'  # 不再限制pygame,而是转换它
}def convert_tkinter_to_web(code):"""将tkinter代码转换为Web等效实现"""# 解析Python代码tree = ast.parse(code)# 提取窗口属性window_props = {'title': 'Python GUI','width': '700','height': '500','buttons': [],'labels': [],'entries': [],'layout': []}# 用于存储函数定义functions = {}# 首先收集所有函数定义for node in ast.walk(tree):if isinstance(node, ast.FunctionDef):functions[node.name] = ast.unparse(node)# 分析代码中的tkinter组件for node in ast.walk(tree):if isinstance(node, ast.Assign):if isinstance(node.value, ast.Call):# 提取窗口标题if hasattr(node.value.func, 'attr') and node.value.func.attr == 'Tk':for subnode in ast.walk(tree):if isinstance(subnode, ast.Call) and hasattr(subnode.func, 'attr'):if subnode.func.attr == 'title' and len(subnode.args) > 0:window_props['title'] = ast.literal_eval(subnode.args[0])elif subnode.func.attr == 'geometry' and len(subnode.args) > 0:geom = ast.literal_eval(subnode.args[0])match = re.match(r'(\d+)x(\d+)', geom)if match:window_props['width'] = match.group(1)window_props['height'] = match.group(2)# 提取按钮elif hasattr(node.value.func, 'attr') and node.value.func.attr == 'Button':button = {'text': 'Button', 'command': None}for kw in node.value.keywords:if kw.arg == 'text':button['text'] = ast.literal_eval(kw.value)elif kw.arg == 'command':# 处理不同类型的commandif isinstance(kw.value, ast.Name):# 简单的函数名button['command'] = kw.value.idelif isinstance(kw.value, ast.Lambda):# Lambda表达式button['command'] = f"lambda_{len(window_props['buttons'])}"functions[button['command']] = ast.unparse(kw.value)else:# 其他情况,尝试转换为字符串try:button['command'] = ast.unparse(kw.value)except:button['command'] = 'unknown_command'window_props['buttons'].append(button)# 提取标签elif hasattr(node.value.func, 'attr') and node.value.func.attr == 'Label':label = {'text': ''}for kw in node.value.keywords:if kw.arg == 'text':try:label['text'] = ast.literal_eval(kw.value)except:# 如果不是字面量,尝试直接转换为字符串label['text'] = ast.unparse(kw.value)window_props['labels'].append(label)# 提取输入框elif hasattr(node.value.func, 'attr') and node.value.func.attr == 'Entry':try:entry_id = node.targets[0].idexcept:entry_id = f"entry_{len(window_props['entries'])}"window_props['entries'].append({'id': entry_id})# 生成Web等效代码web_code = f"""
<!DOCTYPE html>
<div class="tk-window" style="width: {window_props['width']}px; height: {window_props['height']}px;"><div class="tk-title-bar">{window_props['title']}</div><div class="tk-content">
"""# 添加标签for label in window_props['labels']:web_code += f'        <div class="tk-label">{label["text"]}</div>\n'# 添加输入框for entry in window_props['entries']:web_code += f'        <input type="text" class="tk-entry" id="{entry["id"]}">\n'# 添加按钮for button in window_props['buttons']:command = button['command'] if button['command'] else ''web_code += f'        <button class="tk-button" onclick="tkButtonClick(\'{command}\')">{button["text"]}</button>\n'web_code += """    </div>
</div>
<script>
window.pythonFunctions = {
"""# 添加Python函数定义for func_name, func_code in functions.items():web_code += f"    '{func_name}': {func_code},\n"web_code += """};
</script>
"""return web_codedef convert_pygame_to_web(code):"""将pygame代码转换为Web Canvas实现"""web_code = """
<canvas id="pygame-canvas" style="border: 1px solid #000;"></canvas>
<script>
const canvas = document.getElementById('pygame-canvas');
const ctx = canvas.getContext('2d');// 设置画布大小
canvas.width = 800;
canvas.height = 600;// 模拟 pygame 的基本功能
const pygame = {display: {set_mode: (size) => {canvas.width = size[0];canvas.height = size[1];return canvas;},update: () => {// Canvas 自动更新},flip: () => {// Canvas 自动更新}},draw: {rect: (surface, color, rect) => {ctx.fillStyle = `rgb(${color[0]},${color[1]},${color[2]})`;ctx.fillRect(rect[0], rect[1], rect[2], rect[3]);},circle: (surface, color, pos, radius) => {ctx.beginPath();ctx.fillStyle = `rgb(${color[0]},${color[1]},${color[2]})`;ctx.arc(pos[0], pos[1], radius, 0, Math.PI * 2);ctx.fill();}},event: {get: () => [],  // 简化的事件处理pump: () => {}},init: () => {},quit: () => {},time: {Clock: function() {return {tick: (fps) => 1000/fps};}}
};// 转换后的Python代码
function runGame() {try {// 这里将插入转换后的游戏代码%PYTHON_CODE%} catch (error) {console.error('Game error:', error);}
}// 启动游戏循环
runGame();
</script>
"""# 处理 Python 代码try:tree = ast.parse(code)# 转换 Python 代码为 JavaScriptjs_code = convert_pygame_code_to_js(tree)web_code = web_code.replace('%PYTHON_CODE%', js_code)return web_codeexcept Exception as e:return f"<div class='error'>转换错误: {str(e)}</div>"def convert_pygame_code_to_js(tree):"""将 Python AST 转换为 JavaScript 代码"""js_code = []for node in ast.walk(tree):if isinstance(node, ast.Import):continue  # 跳过导入语句elif isinstance(node, ast.Assign):# 转换赋值语句if hasattr(node.value, 'func') and isinstance(node.value.func, ast.Attribute):if node.value.func.attr == 'set_mode':js_code.append(f"const screen = pygame.display.set_mode([{node.value.args[0].elts[0].n}, {node.value.args[0].elts[1].n}]);")elif isinstance(node, ast.While):# 转换游戏主循环js_code.append("function gameLoop() {")# ... 处理循环体js_code.append("    requestAnimationFrame(gameLoop);")js_code.append("}")js_code.append("gameLoop();")return "\n".join(js_code)def install_package(package):"""自动安装缺失的包"""# 检查是否是受限制的包if package.lower() in RESTRICTED_PACKAGES:raise ImportError(RESTRICTED_PACKAGES[package.lower()])try:importlib.import_module(package)except ImportError:try:# 尝试使用 pip 安装包subprocess.check_call([sys.executable, "-m", "pip", "install", package])except subprocess.CalledProcessError as e:raise Exception(f"安装包 {package} 失败: {str(e)}")def timeout_handler():"""强制终止超时的代码执行"""raise TimeoutError("代码执行超时(最大执行时间:5秒)")@app.route('/')
def index():return render_template('index.html')@app.route('/execute', methods=['POST'])
def execute_code():code = request.json.get('code', '')try:# 检测是否包含pygame代码if 'pygame' in code:web_code = convert_pygame_to_web(code)return jsonify({'status': 'success','output': '','gui': web_code})# 检测是否包含tkinter代码elif 'tkinter' in code or 'tk' in code:web_code = convert_tkinter_to_web(code)return jsonify({'status': 'success','output': '','gui': web_code})# 非GUI代码正常执行output_buffer = StringIO()with contextlib.redirect_stdout(output_buffer):exec(code, globals(), {})output = output_buffer.getvalue()return jsonify({'status': 'success','output': output if output else '程序执行完成,没有输出'})except Exception as e:return jsonify({'status': 'error','output': f'错误: {str(e)}'})if __name__ == '__main__':app.run(debug=True) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣动态规划-20【算法学习day.114】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.网格中的最小路径代价 题目链接…

从通讯工具到 AI 助理,AI手机如何发展?

随着AI进军各行各业&#xff0c;全面AI化时代已经到来。手机&#xff0c;作为现代人类的“数字器官”之一&#xff0c;更是首当其冲地融入了这一变革浪潮之中。 2024年年初&#xff0c;OPPO联合IDC发布了《AI手机白皮书》&#xff0c;公布OPPO已迈向AI手机这一全新阶段。到如今…

游戏引擎 Unity - Unity 打开项目、Unity Editor 添加简体中文语言包模块、Unity 项目设置为简体中文

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

Qt常用控件 多元素控件

文章目录 1. QListWidget1.1 常用属性和方法1.2 常用信号1.4 例子1&#xff0c;操作元素 2. QTableWidget2.1 常用属性和方法2.2 常用信号2.3 例子1&#xff0c;创建表格3.1 常用属性和方法3.2 常用信号3.3 例子1&#xff0c;创建树形结构 Qt中提供的多元素控件有: QListWidget…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外&#xff0c;还有一个小众的市场&#xff0c;那就是多媒体展厅场景&#xff0c;这个场景目前处于垄断地位的软件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…

【零拷贝】

目录 一&#xff1a;了解IO基础概念 二&#xff1a;数据流动的层次结构 三&#xff1a;零拷贝 1.传统IO文件读写 2.mmap 零拷贝技术 3.sendFile 零拷贝技术 一&#xff1a;了解IO基础概念 理解CPU拷贝和DMA拷贝 ​ 我们知道&#xff0c;操作系统对于内存空间&…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式&#xff0c;由于跨域资源共享(cors)是浏览器的一种安全机制&#xff0c;它会阻止前端应用…

《Linux服务与安全管理》| 数据库服务器安装和配置

《Linux服务与安全管理》| 数据库服务器安装和配置 目录 《Linux服务与安全管理》| 数据库服务器安装和配置 任务一&#xff1a; 安装PostgreSQL数据库&#xff0c;设置远程登录&#xff0c;客户端可以成功登录并操作数据库。 任务二&#xff1a; 安装MySQL数据库&#xf…

Linux系统之whereis命令的基本使用

Linux系统之whereis命令的基本使用 一、whereis命令介绍二、whereis命令的使用帮助2.1 whereis命令的帮助信息2.2 whereis命令帮助解释 三、whereis命令的基本使用3.1 查找命令的位置3.2 仅查找二进制文件3.3 仅查找手册页3.4 输出实际使用的查找路径3.5 指定自定义搜索路径 四…

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…

【Block总结】CSAM,包含分割、关键点、切分等均适用!|即插即用

论文信息 标题: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation 论文链接: https://arxiv.org/pdf/2311.04942 GitHub链接: https://github.com/aL3x-O-o-Hung/CSAM 创新点 CSAM&#xff08;跨切片注意力模块&#xff…

解决PyG安装中torch-sparse安装失败问题:详细指南

1 问题描述 最近在学习GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;库。在安装PyG的过程中&#xff0c;遇到了torch-sparse安装失败的问题&#xff0c;错误提示为&#xff1a; ERROR: Failed building wheel for torch-sparse本文将详细记录问题的解…

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记&#xff08;三&#xff09; 该第三部分和第四部分主要为原书的第十一章&#xff08;正则表达式与文件格式化处理&#xff09;&#xff0c;第十二章学习shell脚本&#xff0c;第十六章&#xff08;进程管理与SElinux初探部分&#xff09;&#xff0c;第十七…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中&#xff0c;对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像&#xff0c;每个像素点上的BGR值为三个整数&#xff0c;因为是三通道图像&#xff1b;对于灰度图像&#xff0c;各个像素上的BGR值是一个整数&#xff0c;因为这是单通…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤&#xff1a; 第一步&#xff1a;发起请求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器请求HandlerMapping查找 Handler &#xff08;可以根据xml配置、注解进行查找&#xff09; 匹配条件包括…

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前&#xff0c;首先需要明确研究的目的。是为了改进自己的小程序设计和开发&#xff0c;还是为了了解市场趋势和用户需求&#xff1f;不同的研究目的会影响研究的方法和重点。例如&#xff0c;如果研究目的是为了…

Vue3.0实战:大数据平台可视化(附完整项目源码)

文章目录 创建vue3.0项目项目初始化项目分辨率响应式设置项目顶部信息条创建页面主体创建全局引入echarts和axios后台接口创建express销售总量图实现完整项目下载项目任何问题都可在评论区,或者直接私信即可。 创建vue3.0项目 创建项目: vue create vueecharts选择第三项:…

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue&#xff08;实现 核心线程->最大线程数->队列&#xff09; 场景1&#xff1a;CPU密集型场景思路&…

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前&#xff0c;请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点&#xff1a;https://developer.aliyun.com/mirror/ 找到如图所示位置&#xff0c;选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…