当前位置: 首页 > news >正文

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) 

相关文章:

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: 抱歉&…...

蓝桥杯备考:高精度算法之除法

我们除法的高精度其实也不完全是高精度&#xff0c;而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9&#xff0c;当它真正是1e9的时候&#xff0c;t是有可能超过1e9的&#xff0c;所以要用long long...

笔试-业务逻辑4

应用 小明在玩一个数字加减游戏&#xff0c;输入4个正整数&#xff1a;s、t、a、b&#xff0c;其中s>1&#xff0c;b<105&#xff0c;a!b。只使用加法或者减法&#xff0c;使得st。 每回合&#xff0c;小明用当前的数字&#xff0c;加上或减去一个数字&#xff1b;目前有…...

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

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

麦芯 (MachCore) 应用开发教程 6:一台设备中多台电脑主从机的设置

麦芯是构建在windows系统上的设备应用操作系统&#xff0c;利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 在麦芯&#xff08;MachCore&#xff09;应用开发过程中&#xff0c;多机协同工作的场景十分常见&#xf…...

RAG 与历史信息相结合

初始化模型 # Step 4. 初始化模型, 该行初始化与 智谱 的 GLM - 4 模型进行连接&#xff0c;将其设置为处理和生成响应。 chat ChatZhipuAI(model"glm-4",temperature0.8, ) 此提示告诉模型接收聊天历史记录和用户的最新问题&#xff0c;然后重新表述问题&#x…...

99,[7] buuctf web [羊城杯2020]easyphp

进入靶场 <?php// 使用 scandir 函数扫描当前目录&#xff08;即脚本所在目录&#xff09;下的所有文件和文件夹// 该函数会返回一个包含目录下所有文件和文件夹名称的数组$files scandir(./); // 遍历扫描得到的文件和文件夹名称数组foreach($files as $file) {// 使用 …...

BUUCTF_[安洵杯 2019]easy_web(preg_match绕过/MD5强碰撞绕过/代码审计)

打开靶场&#xff0c;出现下面的静态html页面&#xff0c;也没有找到什么有价值的信息。 查看页面源代码 在url里发现了img传参还有cmd 求img参数 这里先从img传参入手&#xff0c;这里我发现img传参好像是base64的样子 进行解码&#xff0c;解码之后还像是base64的样子再次进…...

Vue05

目录 一、学习目标 1.自定义指令 2.插槽 3.综合案例&#xff1a;商品列表 4.路由入门 二、自定义指令 1.指令介绍 2.自定义指令 3.自定义指令的语法 三、自定义指令-指令的值 1.需求 2.语法 3.代码示例 五、插槽-默认插槽 1.作用 2.需求 4.使用插槽的基本语法…...

ubuntu18.04环境下,Zotero 中pdf translate划线后不翻译问题解决

问题&#xff1a; 如果使用fastgithub&#xff0c;在/etc/profile中设置全局代理&#xff0c;系统重启后会产生划线后不翻译的问题&#xff0c;包括所有翻译代理均不行。终端中取消fastgithub代理&#xff0c;也不行。 解决&#xff1a; 1&#xff09;不在/etc/profile中设置…...

基于Python的简单企业维修管理系统的设计与实现

以下是一个基于Python的简单企业维修管理系统的设计与实现&#xff0c;这里我们会使用Flask作为Web框架&#xff0c;SQLite作为数据库来存储相关信息。 1. 需求分析 企业维修管理系统主要功能包括&#xff1a; 维修工单的创建、查询、更新和删除。设备信息的管理。维修人员…...

【C++】B2120 单词的长度

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;老师的第一种做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;老师的…...

2501,编写dll

DLL的优点 简单的说,dll有以下几个优点: 1)节省内存.同一个软件模块,若是源码重用,则会在不同可执行程序中编译,同时运行这些exe时,会在内存中重复加载这些模块的二进制码. 如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,每个进程会复制一份的d…...

【router路由的配置】

router路由的配置 App.vuerouter在main.ts引入插件 App.vue <template><RouterView /> </template><script setup lang"ts"></script><style scoped lang"scss"></style>router import { createRouter, creat…...

算法基础——一致性

引入 最早研究一致性的场景既不是大数据领域&#xff0c;也不是分布式系统&#xff0c;而是多路处理器。 可以将多路处理器理解为单机计算机系统内部的分布式场景&#xff0c;它有多个执行单元&#xff0c;每一个执行单元都有自己的存储(缓存)&#xff0c;一个执行单元修改了…...

刷题记录 动态规划-6: 62. 不同路径

题目&#xff1a;62. 不同路径 难度&#xff1a;中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#x…...

docker直接运行arm下的docker

运行环境是树莓派A 处理器是 arm32v6 安装了docker&#xff0c;运行lamp 编译安装php的时候发现要按天来算&#xff0c;于是用电脑vm下的Ubuntu系统运行arm的docker 然后打包到a直接导入运行就可以了 第一种方法 sudo apt install qemu-user-static 导入直接运行就可以了…...

014-STM32单片机实现矩阵薄膜键盘设计

1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘&#xff0c;当按下按键后OLED显示屏上会对应显示当前的按键键值&#xff0c;可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…...

Sentinel 断路器在Spring Cloud使用

文章目录 Sentinel 介绍同类对比微服务雪崩问题问题原因问题解决方案请求限流线程隔离失败处理服务熔断解决雪崩问题的常见方案有哪些&#xff1f; Sentineldocker 安装账号/ 密码项目导入簇点链路请求限流线程隔离Fallback服务掉线时的处理流程 服务熔断 Sentinel 介绍 随着微…...

[内网安全] 内网渗透 - 学习手册

这是一篇专栏的目录文档&#xff0c;方便读者系统性的学习&#xff0c;笔者后续会持续更新文档内容。 如果没有特殊情况的话&#xff0c;大概是一天两篇的速度。&#xff08;实验多或者节假日&#xff0c;可能会放缓&#xff09; 笔者也是一边学习一边记录笔记&#xff0c;如果…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...