在瀏覽器中利用Brython執行Python

※本篇在學習Brython的大致使用後,進行實際執行。

這次將把前一篇文章的分組內容利用Brython作呈現,在這一一把步驟試著列出。
在此之前,說明若想要利用Brython,執行的方法:
1.載入腳本Brython.js
2.寫入 brython()
3.寫入 <script type=”text/python”>

讓我們開始實際操作:

一、首先在加入套件及有關Brython的部分前,這是我們Python分組的程式(第二點開始簡寫成#content):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
with open("2a raw.txt") as fh:
rea = fh.readlines()
#print (rea)

no_list = lambda list: int((sum([(len(list[i])) for i in range(len(list))]))/3)
#簡寫一個for迴圈命名為no_list,目的為求出迴圈執行次數(14次)

t = list()#命名空清單t
for k in range(len(rea)):
a = rea[k]
b = a.split()#分割每一行第k位
#print(b)
for i in range(0,len(b),3):
c = b[i:i+3]#每三字串為一次進行迴圈
t.append(c)#加入清單t

for g in range(no_list(t)):#range = 14
print("第" + str(g+1) + "組:" + str(t[g]))

列出後,開始從Bython官方網站中,一一找尋能達成我們目的的步驟,首先來到Brython下載倉儲,第一步必須將Brython.js檔案載入程式中進行使用,利用內容中寫道的Zero install !部分,我們在上述程式碼的最上方寫入下列程式碼:

1
2
3
<script type="text/javascript"
src="https://cdn.rawgit.com/brython-dev/brython/3.4.0/www/src/brython.js">
</script>

完成第一步。

二-(1)、為了在編輯中寫入函數brython(),需要建立<body>,程式碼寫法為:

1
2
3
<body onload="brython()">
#content
</body>

二-(2)、接著,還需要利用<div>區塊標籤的功能,讓我們寫的Python程式內容包起來:

1
2
3
4
5
<body onload="brython()">
<div id="test">
#content
</div>
</body>

二-(3)、而文章一開始說明想利用Brython的第三點,必須在 <script type=”text/python”>中寫入Python代碼或將其連接,所以我們再加入一層<script>

1
2
3
4
5
6
7
<body onload="brython()">
<div id="test">
<script type="text/python">
#content
</script>
</div>
</body>

完成第二步,大致上的Brython載入使用都已經妥當,並繼續進行剩下步驟。

三-(1)、接著我們要賦予它兩個按鈕,分別是執行程式及清除輸出內容。想要在網頁中生成按鈕,參照Brython_Documentatoin_Events,內容介紹使用按鈕的方法:

1
2
3
@btn.bind("click")
def show(ev):
print('ok')

在給予一個按鈕功能後,需寫入<button id=”test”>test</button>將它生成。

測試生成一個按鈕:






三-(2)、成功做出按鈕,試著放入我們要執行的程式中,直接用其將#content給上下包住(按鈕取名為but及but2):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body onload="brython()">
<div id="one">
<script type="text/python">{% raw %}
from browser import document, html

@document["but1"].bind("click")
def echo(ev):
#content
@document["but2"].bind("click")
def delete(ev):
for row in document['one']:
row.remove()
{% endraw %}</script>
</div>
<button id="but">執行</button><button id="but2">清除</button>
</body>

※按鈕二為清除用途,以下將它分割出來提供讀者觀察:

1
2
3
4
@document["but2"].bind("click")
def delete(ev):
for row in document['one']:
row.remove()

第三步按鈕的設置即完成。

四、實際看向近端瀏覽器,我們發現按下按鈕後還是無法執行,這時的問題參考Brython documentation文章,內容說明讀取檔案內容時會因為讀取時間而無法正常輸出,其解為利用函數<open()>將時間設置忽略(給予一個假(fake)的時間),使用方法為:

1
fake_qs = '?foo=%s' %time.time()

再來給予檔案名稱後方加上假的時間代碼:

1
with open('./../../../../data/2a.txt'+fake_qs) as fh:

接著需要利用import來輸入time以及document以利執行,寫法為:

1
2
import time
from browser import document

五、最後整理好經過加工的分組程式碼,就可以進行執行的測試,以下為最後的程式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<script type="text/javascript" src="https://cdn.rawgit.com/brython-dev/brython/3.4.0/www/src/brython.js"></script>

<body onload="brython()">
<div id="one">
<script type="text/python">{% raw %}
from browser import document, html
import time

@document["mybutton"].bind("click")
def echo(ev):
fake_qs = '?foo=%s' %time.time()
with open("./../../../../2a.txt"+fake_qs) as fh:
rea = fh.readlines()
#print (rea)

no_list = lambda list: int((sum([(len(list[i])) for i in range(len(list))]))/3)
#簡寫一個for迴圈命名為no_list,目的為求出迴圈執行次數(14次)

t = list()#命名空清單t
for k in range(len(rea)):
a = rea[k]
b = a.split()#分割每一行第k位
#print(b)
for i in range(0,len(b),3):
c = b[i:i+3]#每三字串為一次進行迴圈
t.append(c)#加入清單t

for g in range(no_list(t)):#range = 14
document["one"] <= ("第" + str(g+1) + "組:" + str(t[g])) + html.BR()
@document["mybutton2"].bind("click")
def delete(ev):
for row in document['one']:
row.remove()
{% endraw %}</script>
</div>
<button id="mybutton">執行</button><button id="mybutton2">清除</button>
</body>

是不是都學會了呢?