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.pswp.cn/news/894619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894619.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣動態規劃-20【算法學習day.114】

前言 ###我做這類文章一個重要的目的還是記錄自己的學習過程&#xff0c;我的解析也不會做的非常詳細&#xff0c;只會提供思路和一些關鍵點&#xff0c;力扣上的大佬們的題解質量是非常非常高滴&#xff01;&#xff01;&#xff01; 習題 1.網格中的最小路徑代價 題目鏈接…

關于算盡圓周率

總有人提到圓周率算盡的問題&#xff0c;其實代碼都已經在前面給出了&#xff0c;自己跑一下就明白了。 用語言描述的話&#xff0c;那就是&#xff1a; 前面幾篇文章已經寫清楚了&#xff0c;圓周率的本質就是無限分辨率前提下的可二分度量單位。 就像是自然對數底&#xf…

從通訊工具到 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 適合初學者或需要快速上手的開…

C# 接口介紹

.NET學習資料 .NET學習資料 .NET學習資料 一、接口的定義 在 C# 中&#xff0c;接口是一種特殊的抽象類型&#xff0c;它定義了一組方法簽名&#xff0c;但不包含方法的實現。接口使用interface關鍵字來聲明。例如&#xff0c;定義一個表示形狀的接口IShape&#xff1a; in…

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…

2. 動態測試

一、動態測試是什么&#xff1f; 動態測試&#xff08;Dynamic Test&#xff09;允許在運行時生成測試用例&#xff0c;而不是在編譯時通過 Test 靜態定義。它通過 TestFactory 注解標記的方法動態生成一組測試用例&#xff0c;適用于需要靈活生成測試場景的場景。 核心特點&…

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;都是通用的需求&…

2021版小程序開發5——小程序項目開發實踐(1)

2021版小程序開發5——小程序項目開發實踐(1) 學習筆記 2025 使用uni-app開發一個電商項目&#xff1b; Hbuidler 首選uni-app官方推薦工具&#xff1a;https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后臺&#xff1a;htt…

【零拷貝】

目錄 一&#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配…

2024年度總結

首先&#xff0c;我是在2023年結束高中生涯進入大學的&#xff0c;難免會有固化的“高中生”思維&#xff0c;我等著老師的安排&#xff0c;看著課表上課&#xff0c;跟著時間吃飯&#xff0c;睡覺&#xff0c;偶爾會熬夜&#xff0c;但整體跟高中沒差太多。我對社團沒興趣&…

【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;第十七…

學習日記-250203

一.論文 看師兄寫好的一稿。 二、計劃&#xff1a; 繼續看論文里的問題。 然后繼續看promptCD相關&#xff0c;明天要看論文啦,今天家里有些事比較忙&#xff08;碎碎念&#xff09; 三. &#xff09;——&#xff08; 注冊了 openreview,ORCID,Google scholar&…