Skulpt搭建Python在线编译器(二):界面优化

原文链接:Skulpt搭建Python在线编译器(二):界面优化 – 每天进步一点点 (longkui.site)

上一节中,我们下载并安装使用了基于Skulpt 的Python在线编译器,实现了基础功能冲,但是原生的页面比较难看,所以我们打算重新修改页面。让页面变得好看一些。

这是效果图: http://python.longkui.site/

1.原生页面解析

<html>

<head>

    <script src="skulpt.min.js"type="text/javascript"></script>   

    <script src="skulpt-stdlib.js"type="text/javascript"></script>

</head>

<body>

    <script type="text/javascript">

        functionoutf(text) {

            varmypre = document.getElementById("output");  //

            mypre.innerHTML = mypre.innerHTML + text;  //文字输出

        }

        functionbuiltinRead(x) {

            if(Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined)

                throw"File not found: '"+ x + "'";

            returnSk.builtinFiles["files"][x];

        }


        functionrunit() {

            console.log("runit is going")

            varprog = document.getElementById("yourcode").value; //读取用户输入的内容

            varmypre = document.getElementById("output");   //获取输出框

            mypre.innerHTML = '';

            Sk.pre = "output";

            Sk.configure({ output: outf, read: builtinRead, __future__: Sk.python3 });


            (Sk.TurtleGraphics || (Sk.TurtleGraphics = {})).target = 'mycanvas';

            varmyPromise = Sk.misceval.asyncToPromise(function() {

                returnSk.importMainWithBody("<stdin>", false, prog, true);

            });


            myPromise.then(function(mod) {

                console.log('success');    //执行成功,显示success

            },

                function(err) {

                    console.log(err.toString());   //执行失败,在控制台显示 err

                });

        }

    </script>

    <!-- 标题部分 -->

    <h3>Try This</h3> 

    <form>

        <!-- textarea是用户输入代码的部分,在此区域填写代码,每次运行都会显示 -->

        <textarea id="yourcode"cols="80"rows="10">


        </textarea><br />

        <!-- 按钮:开始执行 -->

        <button type="button"onclick="runit()">Run</button>

    </form>

    <!-- 文字输出部分 -->

    <pre id="output"></pre>

    <!-- 画图输出部分 -->

    <div id="mycanvas"></div>

</body>

</html>

2.CodeMirror美化

CodeMirror是一块支持代码高亮的编辑器,支持多种语法格式

官网链接:https://codemirror.net/

github地址:https://github.com/codemirror/CodeMirror

下载下来的目录界面如下:

addon:存放搜索匹配,折叠代码等插件

lib:核心库,核心CSS

mode:各种语言的风格和语法定义

theme:编辑器主题风格样式

使用CodeMirror必须引入codemirror.css和codemirror.js


<link href="codemirror/lib/codemirror.css"rel="stylesheet"type="text/css">

<script src="codemirror/lib/codemirror.js"></script>

其余的按照你的要求自己选择引用什么,这个地方因为我是在线python编译器,所以我引入了python的语言风格


<!--引入python.js-->

<script src="codemirror/mode/python/python.js"></script>

同时,需要修改codemirror的配置信息:

varCodeMirrorEditor = CodeMirror.fromTextArea(myTextarea, {

                   mode: "python",  //默认脚本编码,python 模式

                   lineNumbers: true,   //是否显示行号

                   lineWrapping: true, //是否强制换行

                   foldGutter:true, // 启用行槽中的代码折叠

                   matchBrackets:true,// 匹配结束符号,比如"]、}"

                   autoCloseBrackets: true, // 自动闭合符号

                   styleActiveLine:true, // 显示选中行的样式

                   indentUnit: 4,         // 缩进单位为4


               });


3.界面优化

初始界面显示的比较丑,这个地方我是引入iview,用来美化整个页面。整个代码如下:     

<html>

<head>

    <meta charset="utf-8">

    <script src="skulpt.min.js" type="text/javascript"></script>

    <script src="skulpt-stdlib.js" type="text/javascript"></script>

    <link href="codemirror/lib/codemirror.css" rel="stylesheet" type="text/css">

    <link href="codemirror/theme/monokai.css" rel="stylesheet" type="text/css">

    <link href="codemirror/addon/display/fullscreen.css" rel="stylesheet" type="text/css">

    <script src="codemirror/lib/codemirror.js"></script>

    <script src="codemirror/mode/python/python.js"></script>

    <link href="css/index.css" rel="stylesheet" type="text/css">

    http://unpkg.com/view-design/dist/styles/iview.css">

    http://vuejs.org/js/vue.min.js">

    http://unpkg.com/view-design/dist/iview.min.js">

    <title>Python-Online</title>

</head>


<body>

<div id="app" >

     <div  class="function">

         <i-button type="primary" icon="md-play" onclick="runit()">运行</i-button>



        <i-button type="error" icon="ios-trash" @click="clear">清除所有</i-button>

    </div>

    <div id="" class="page">

        <div id="" css="workbench">


            <form class="index-form">

                <textarea id="yourcode" class="index-form">import turtle

turtle.begin_fill()

turtle.fillcolor('red')

for x in range(4):

    turtle.forward(100)

    turtle.right(90)

turtle.end_fill()

turtle.hideturtle()

turtle.done()

print("Hello World")

                </textarea>

            </form>

            <div  class="outputd">

                <div id="mycanvas" class="canvas-ouput" ></div>

                <div class="output">

                    <pre id="output"> </pre>

                </div>


            </div>

        </div>


    </div>


</div>

    <script>

        new Vue({

            el: '#app',

            data: {


            },

            methods: {


                clear:function(event){

                    CodeMirrorEditor.setValue("");


                    var mypre = document.getElementById("output");

                    mypre.innerHTML = "";

                },


            }

        })

        //新增window.onload 事件,用来初始化codemirror

        //     window.onload = function () {

        //         //console.log("onload is going")

        //         // 添加codemirror 模式

                var myTextarea = document.getElementById('yourcode');

                var CodeMirrorEditor = CodeMirror.fromTextArea(myTextarea, {

                    mode: "python",        

                    lineNumbers: true,     

                    lineWrapping: true,    

                    foldGutter:true,       

                    matchBrackets:true,   

                    autoCloseBrackets: true ,

                    styleActiveLine:true,  

                    indentUnit: 4,         


                });

                CodeMirrorEditor.setSize("100%","100%"); 




        // }

        function outf(text) {

            var mypre = document.getElementById("output");

            mypre.innerHTML = mypre.innerHTML + text;

        }


        function builtinRead(x) {

            if (Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined)

                throw "File not found: '" + x + "'";

            return Sk.builtinFiles["files"][x];

        }


        function runit() {

            var prog =CodeMirrorEditor.getValue();

            var mypre = document.getElementById("output");

            mypre.innerHTML = '';

            Sk.pre = "output";

            Sk.configure({ output: outf, read: builtinRead, __future__: Sk.python3 });

            (Sk.TurtleGraphics || (Sk.TurtleGraphics = {})).target = 'mycanvas';

            var myPromise = Sk.misceval.asyncToPromise(function () {

                return Sk.importMainWithBody("<stdin>", false, prog, true);

            });

            myPromise.then(function (mod) {

                console.log('success');

            },

                function (err) {

                    console.log(err.toString());

                    mypre.innerHTML=err.toString();

                });

         }

    </script>

</body>

</html>

4.问题

上面虽然我们使用skulpt和codemirror制作了一个简单的在线python编译器。但是还是发现一些问题。

问题1:关于turtle部分,画图canvas部分出现一个问题,就是canvas的画图部分太小,而且我经过尝试,不论是修改css 还是直接改canvas都无法让画布变大比较大,这个地方一直没想明白。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容