Skulpt搭建Python在線編譯器(二):界面優(yōu)化

原文鏈接:Skulpt搭建Python在線編譯器(二):界面優(yōu)化 – 每天進(jìn)步一點(diǎn)點(diǎn) (longkui.site)

上一節(jié)中,我們下載并安裝使用了基于Skulpt 的Python在線編譯器,實(shí)現(xiàn)了基礎(chǔ)功能沖疗绣,但是原生的頁(yè)面比較難看,所以我們打算重新修改頁(yè)面烈钞。讓頁(yè)面變得好看一些。

這是效果圖:?http://python.longkui.site/

1.原生頁(yè)面解析

<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; //讀取用戶輸入的內(nèi)容

????????????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');??? //執(zhí)行成功,顯示success

????????????},

????????????????function(err) {

????????????????????console.log(err.toString());?? //執(zhí)行失敗,在控制臺(tái)顯示 err

????????????????});

????????}

????</script>

????<!-- 標(biāo)題部分 -->

????<h3>Try This</h3>?

????<form>

????????<!-- textarea是用戶輸入代碼的部分远荠,在此區(qū)域填寫代碼,每次運(yùn)行都會(huì)顯示 -->

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


????????</textarea><br />

????????<!-- 按鈕:開始執(zhí)行 -->

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

????</form>

????<!-- 文字輸出部分 -->

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

????<!-- 畫圖輸出部分 -->

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

</body>

</html>

2.CodeMirror美化

CodeMirror是一塊支持代碼高亮的編輯器失息,支持多種語(yǔ)法格式

官網(wǎng)鏈接:https://codemirror.net/

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

下載下來(lái)的目錄界面如下:

addon:存放搜索匹配譬淳,折疊代碼等插件

lib:核心庫(kù),核心CSS

mode:各種語(yǔ)言的風(fēng)格和語(yǔ)法定義

theme:編輯器主題風(fēng)格樣式

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


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

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

其余的按照你的要求自己選擇引用什么盹兢,這個(gè)地方因?yàn)槲沂窃诰€python編譯器邻梆,所以我引入了python的語(yǔ)言風(fēng)格


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

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

同時(shí),需要修改codemirror的配置信息:

varCodeMirrorEditor = CodeMirror.fromTextArea(myTextarea, {

???????????????????mode: "python",? //默認(rèn)腳本編碼,python 模式

???????????????????lineNumbers: true,?? //是否顯示行號(hào)

???????????????????lineWrapping: true, //是否強(qiáng)制換行

???????????????????foldGutter:true, // 啟用行槽中的代碼折疊

???????????????????matchBrackets:true,// 匹配結(jié)束符號(hào)绎秒,比如"]浦妄、}"

???????????????????autoCloseBrackets: true, // 自動(dòng)閉合符號(hào)

???????????????????styleActiveLine:true, // 顯示選中行的樣式

???????????????????indentUnit: 4,???????? // 縮進(jìn)單位為4


???????????????});


3.界面優(yōu)化

初始界面顯示的比較丑,這個(gè)地方我是引入iview见芹,用來(lái)美化整個(gè)頁(yè)面剂娄。整個(gè)代碼如下:?????

<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()">運(yùn)行</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 事件,用來(lái)初始化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制作了一個(gè)簡(jiǎn)單的在線python編譯器。但是還是發(fā)現(xiàn)一些問題玄呛。

問題1:關(guān)于turtle部分阅懦,畫圖canvas部分出現(xiàn)一個(gè)問題,就是canvas的畫圖部分太小徘铝,而且我經(jīng)過(guò)嘗試耳胎,不論是修改css 還是直接改canvas都無(wú)法讓畫布變大比較大惯吕,這個(gè)地方一直沒想明白。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怕午,一起剝皮案震驚了整個(gè)濱河市混埠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诗轻,老刑警劉巖钳宪,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扳炬,居然都是意外死亡吏颖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門恨樟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)半醉,“玉大人,你說(shuō)我怎么就攤上這事劝术∷醵啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵养晋,是天一觀的道長(zhǎng)衬吆。 經(jīng)常有香客問我,道長(zhǎng)绳泉,這世上最難降的妖魔是什么逊抡? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮零酪,結(jié)果婚禮上冒嫡,老公的妹妹穿的比我還像新娘。我一直安慰自己四苇,他們只是感情好孝凌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著月腋,像睡著了一般蟀架。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罗售,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天辜窑,我揣著相機(jī)與錄音,去河邊找鬼寨躁。 笑死穆碎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的职恳。 我是一名探鬼主播所禀,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼方面,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了色徘?” 一聲冷哼從身側(cè)響起恭金,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褂策,沒想到半個(gè)月后横腿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斤寂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年耿焊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遍搞。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罗侯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溪猿,到底是詐尸還是另有隱情钩杰,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布诊县,位于F島的核電站讲弄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翎冲。R本人自食惡果不足惜垂睬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抗悍。 院中可真熱鬧,春花似錦钳枕、人聲如沸缴渊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衔沼。三九已至,卻和暖如春昔瞧,著一層夾襖步出監(jiān)牢的瞬間指蚁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工自晰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凝化,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓酬荞,卻偏偏與公主長(zhǎng)得像搓劫,于是被迫代替她去往敵國(guó)和親瞧哟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容