Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
說明:
=====
1.1 如果不會web前端的html、JavaScript、CSS的知識怎么辦?無所不能的python可以做到。
1.2 Remi是一個用于Python應用程序的GUI庫,它將應用程序的界面轉換為HTML,以便在Web瀏覽器中呈現。
1.3 這將刪除特定于平臺的依賴項,并允許您使用Python輕松開發跨平臺應用程序!
2 準備:
=====
2.1 官網地址:
https://github.com/dddomodossola/remi
https://remi.readthedocs.io/en/latest/
2.2 環境:
華為筆記本電腦、深度deepin-linux操作系統、谷歌瀏覽器、python3.8和微軟vscode編輯器。
2.3 安裝:
pip install remi
#本機安裝
sudo pip3.8 install remi
sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple remi
3 Hello world:
==========
3.1 代碼:注釋版
import remi.gui as gui
from remi import start, App
#定義類
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
#以上3行代碼,固定初始化
def main(self):
#實例化一個VBox,大小設置
wid=gui.VBox(width=300, height=200)
#窗口的標簽label=顯示文本,大小比例法設置
# 注意\n代表換行,但需要配合style={"white-space":"pre"},才起作用
#preserves newline==保留換行符
self.lbl=gui.Label('Hello\n World', width='80%', height='50%',style={"white-space":"pre"})
#按鈕和名稱、大小設置,支持中文
self.bt=gui.Button('Press me=點擊我!', width=200, height=30)
#綁定按鈕的點擊事件,調用函數
self.bt.onclick.do(self.on_button_pressed)
#adding the widgets to the main container
#將小部件添加到主容器wid,有時候上面實例化用container=主容器
wid.append(self.lbl)
wid.append(self.bt)
return wid
# listener function==監聽功能
#調用點擊按鈕函數;emitter==發射器
def on_button_pressed(self, emitter):
self.lbl.set_text('Hello World!')
if __name__=="__main__":
# starts the webserver
# 主要參數
# start(MyApp,address='127.0.0.1', port=8081, multiple_instance=False,enable_file_cache=True, update_interval=0.1, start_browser=True)
#start(MyApp, debug=True, address='0.0.0.0', port=0) #本機測試地址改動無效,為默認地址
start(MyApp, debug=True) #端口指定無效,也不是默認8081,估計本機端口已經被占用
3.2 操作和效果:
4 Bootstrap:
=========
4.1 代碼:bootstrap.py
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
#引入在線Bootstrap的css文件
my_css_head="""
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
"""
#引入在線Bootstrap的js文件
my_js_head="""
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
"""
self.page.children['head'].add_child('mycss', my_css_head)
self.page.children['head'].add_child('myjs', my_js_head)
#主窗口實例化,定義大小和樣式
main_container=gui.VBox(width='500px', height='500px', style={'margin':'0px auto','padding':'10px'})
#label=標簽
self.lbl=gui.Label("Label with Lock Icon=帶鎖圖標的標簽")
#樣式選擇
self.lbl.add_class("glyphicon glyphicon-lock label label-primary")
#輸入框
self.tf=gui.TextInput(hint='Your Input')
#樣式選擇
self.tf.add_class("form-control input-lg")
#下拉選擇框
self.dd=gui.DropDown(width='200px')
#字體大小
self.dd.style.update({'font-size':'large'})
#樣式選擇
self.dd.add_class("form-control dropdown")
#下拉框內容選擇
self.item1=gui.DropDownItem("First Choice")
self.item2=gui.DropDownItem("Second Item")
#定義self的功能,目前未定義
self.dd.append(self.item1,'item1')
self.dd.append(self.item2,'item2')
#Table=表格,第一個是表頭
myList=[ ('ID','Lastname','Firstname','郵編','城市'),
('1','Pan','Peter','888888','上海'),
('2','Sepp','Schmuck','123456','北京') ]
#表格設置,內容,大小
self.tbl=gui.Table.new_from_list(content=myList,width='400px',height='100px',margin='10px')
#樣式選擇
self.tbl.add_class("table table-striped")
#按鈕設置
self.bt1=gui.Button("OK", width="100px")
#是Bootstrap樣式 Class: btn-success
self.bt1.add_class("btn-success")
self.bt2=gui.Button("Abbruch",width="100px")
#Bootstrap Class: btn btn-danger
self.bt2.add_class("btn-danger")
#Build up the gui,主窗口掛載下面項目
main_container.append(self.lbl,'lbl')
main_container.append(self.tf,'tf')
main_container.append(self.dd,'dd')
main_container.append(self.tbl,'tbl')
main_container.append(self.bt1,'btn1')
main_container.append(self.bt2,'btn2')
return main_container
if __name__=="__main__":
# starts the webserver
start(MyApp, debug=True)
4.2 操作和效果圖:
5 tabbox:
=======
5.1 代碼:
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
#按鈕
b1=gui.Button('Show second tab', width=200, height=30)
#表格框
tb=gui.TabBox(width='80%')
tb.append(b1, 'First')
b2=gui.Button('Show third tab', width=200, height=30)
#tb.add_tab(b2, 'Second', None)
tb.add_tab(b2, 'Second')
b3=gui.Button('Show first tab', width=200, height=30)
#tb.add_tab(b3, 'Third', None)
tb.add_tab(b3, 'Third')
#3種方法
b1.onclick.do(self.on_bt1_pressed, tb, b2)
b2.onclick.do(self.on_bt2_pressed, tb, 'Third')
b3.onclick.do(self.on_bt3_pressed, tb, 0)
return tb
#按鈕功能的定義,3種功能
def on_bt1_pressed(self, widget, tabbox, refWidgetTab):
tabbox.select_by_widget(refWidgetTab)
def on_bt2_pressed(self, widget, tabbox, refWidgetTabName):
tabbox.select_by_name(refWidgetTabName)
def on_bt3_pressed(self, widget, tabbox, tabIndex):
tabbox.select_by_index(tabIndex)
if __name__=="__main__":
#網頁標題,standalone=False默認是不允許
start(MyApp, title="Tab Demo=表格例子", standalone=False)
5.2 操作和效果圖:
6standalone:
======
6.1 代碼: mian.py
from remi import start, App
#將 bootstrap.py腳本放在本代碼mian.py同一個目錄下
from bootstrap import MyApp
if __name__=="__main__":
start(MyApp, standalone=True)
6.2 代碼:bootstrap.py=4.1所指定代碼:
6.3 注意啟動網頁服務器默認為不啟動(false),需要啟動則為standalone=True。
6.4 操作和效果圖:
把web網頁變成一個app的GUI
7 附一張gif:
代碼省略
===自己整理并分享===
喜歡的人,可以點贊、關注、評論、轉發和收藏。
Python提供的標準庫中有一個名為html的標準庫,該標準庫提供的功能很簡單,僅僅是把一些組成標簽的尖括號或者是一些特殊字符轉換成實體字符。
這也是Python本身秉持的設計哲學,就是一個函數、一個模塊或者一個標準庫只專注于一件事或者是某一方面的事。
我們先來大概了解該標準的組成
>>> import html
>>> dir(html)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_charref', '_html5', '_invalid_charrefs', '_invalid_codepoints', '_re', '_replace_charref', 'entities', 'escape', 'unescape']
我們不管那些以_開頭的東東,把注意放在escape和unescape這兩個函數上。
假設我有一些HTML,我擔心其中會包含一些可能危險的<script>標記。這時有一種方法就是把標簽的尖括號轉換成實體符號,從以上兩個函數的命名可以大概了解相應的功能。
沒錯escape函數就是轉義的意思,就是把一些字符轉換為實體字符。比如“<”會轉換成“&+lt”、“>”會轉換成“&+gt”等等。(加號表示連接兩邊的符號)
>>> import html
>>> help(html.escape)
Help on function escape in module html:
escape(s, quote=True)
Replace special characters "&", "<" and ">" to HTML-safe sequences.
If the optional flag quote is true (the default), the quotation mark
characters, both double quote (") and single quote (') characters are also
translated.
查看該函數的幫助可以了解到,它會把特定字符“&”,“<”,“>”等轉換成HTML安全的實體字符。該函數還有一個可選的標記參數,默認為True,意思就是該函數默認為把引用符號(“”、‘’)等一并轉換。
>>> import html
>>> demo="<h1>Hello World!,'</h1>"
>>> html.escape(demo,quote=False)
"<h1>Hello World!,'mangfu'</h1>"
上面的例子中,我設置可選參數quote為False,則它并不會對引號(‘’)進行轉換。
>>> import html
>>> demo="<h1>Hello World!,'</h1>"
>>> html.escape(demo)
'<h1>Hello World!,'mangfu'</h1>'
上面的例子中,我使用該函數默認的可選參數,從結果中可以看出函數輸出已經對引號(‘’)進行轉換。
至于unescape函數,看該函數的名字就知道它的作用跟escape函數恰恰相反。
可能大家對這些功能還不是很熟悉,但是這在Web開發方面是很重要的,如果你以后學習Django來搭建自己的網站,會碰到這個功能的。
大家可以動手試試unescape函數。。。
在的爬蟲越來越難了,不再和之前的那樣,隨便抓個包就可以找到相關的 url ,然后 post 一下或者 get 一下數據就出來了。還有一個可能就是可能你以前用來學習的爬蟲網站太簡單了,還沒有看見過那些猛的。上兩周我就想弄弄知乎登陸,參數的加密算是把 js 代碼扣出來了,但是只能在瀏覽器上運行,一換到 Python 執行就各種報錯,你不會 JavaScript 就什么都調不了,所以二話不說,開啟了新的大陸。那就開始吧!
這是小編精心準備的一份Python爬蟲入門學習資料,關注,轉發,私信小編“01”即可免費領取!
1. JavaScript 介紹
JavaScript 是運行在 客戶端的語言,和你們說的 Java 是很不一樣的, Java 通常用于服務器端的。但是他們兩者也有相似之處,比如 JavaScript 的命名規范和名稱和 Java 相似。其他的好像就沒有什么了,哈哈。
JavaScript 也是一門腳本語言,和 python 一樣,都是解釋性語言,即每運行一行代碼就解釋一行,只不過 JavaScript 的解釋器在瀏覽器內部。
JavaScript 最初被應用是為了處理與表單相關的驗證,現在應用就更加廣了,可以說是幾乎無所不能,比如用來做服務端開發,命令行工具、桌面程序和游戲開發等。
我在學了之后也跟著弄了兩個小的頁面游戲,懷念童年。
2.JavaScript組成
3.JavaScript 變量
在了解變量之前,先要知道 JavaScript 代碼寫在那里:
還有注釋:
3.1 變量的定義以及作用
變量是計算機內存中存儲數據的標識符,根據變量名稱可以獲取到內存中存儲的數據。
使用變量我們可以更方便的獲取或修改內存中的數據。
3.2 定義變量
使用 var 關鍵字來聲明變量,和 python 差不多,都是弱類型的語言,只不過 python 不需要使用關鍵字來聲明。
注:console.log()這個方法只是在控制臺打印一下變量而已。
3.3 變量的命名規則和規范
1):規則-必須遵守的,不遵守就會報錯,就好比人類的法律
2):規范-建議遵守的,但不遵守也不會報錯,比如人類的道德
3.4 小案例
了解完變量之后可以做個小案例:交換兩個值
4. 數據類型
JavaScript 的數據類型分兩種,一個為簡單數據類型,另一個為復雜數據類型。
簡單數據類型有 Number、String、Boolean、undefined 和 null。一共五種
復雜數據類型比如 object,這個以后遇到再說,慢慢來。
4.1 Number
Number 為數值固定的表示法,用來表示整數和浮點數的。它的字面量就是數值,那字面量是什么意思呢?字面量就是這個變量表示的值,
比如上面變量 a 的字面量就是 12,b 的字面量就是 45。
我們還可以使用 typeof 關鍵字來判斷這個數據類型
除了使用上面的十進制來賦值,我們還可以使用八進制和十六進制
八進制的數是以 0 開頭的,而十六進制的是以 0x 開頭的,其他的進制就不討論了。
無論你寫何種進制,它的存儲還是以二進制來存儲的,所以這樣就弄成了浮點數的存儲精確度,浮點數只能精確到17位小數。
可以看到 兩個浮點數的相加不是很準確,所以不要在有浮點數的運算下做判斷,有可能會有你想不到的結果,如
浮點數除了直接表示我們還可以使用科學計數法,當然,整數也是一樣可以使用的。
Number 數據類型是有范圍的,但是不需要我們刻意去計,記住它的關鍵字就可以了。
最后再說一個關鍵字:NaN:not a number,這個表示不是數值,當有兩個數據運算時,運算失敗就會返回這個值。我們也可以判斷一個數據類型是不是 NaN,使用 isNaN() 方法即可。
4.2 String
String 類型就是用單引號或雙引號括起來的內容就是了,和 python 的字符串類型也是差不多的。
length 屬性是獲取字符串的長度。
連接兩個字符串可以使用 + 進行連接, + 號兩邊不需要全是 String 類型也可以進行連接
思考:如何打印出下列字符串
這里面有單引號和雙引號,如果直接進行打印的話就會出錯,這時候我們就需要把這些有意義的字符給轉義符,轉成普通的字符
根據上面的轉義符,就可以寫出下面語句了
4.3 Boolean
boolean 類型,字面量只有 true 和 false,表示真假,即表示計算機的 1 和 0。
當我們描述只有兩種結果的事物是可以使用這個。
4.4 undefined 和 null
5. 數據類型轉換
5.1 其他類型轉 String 類型
需要注意:undefined 和 null 類型不能使用這個方法
5.2 其他類型轉 Number 類型
5.3 其他類型轉 Boolean 類型
這個使用 Boolean() 來轉就可以了,所有類型都可以轉。轉為 false 的情況為 null、undefined、NaN、0 和 空字符串,其他情況均為 true。
其實這個還可以使用隱式轉換,就是不需要自己手動轉,解釋器會自動幫我們轉,隱式轉換通常用在判斷語句的情況,隱式轉換可以減少代碼的書寫,等說到判斷語句再說,下面就有!
6. 操作符
操作符就是用來對數據類型進行操作的符號,每個語言的操作符都差不多,這里再說下可以更深刻一點!
6.1 算術運算符
有 + - * / % 五個,任何一個數 除 0 都為為無窮大,模 0 為 NaN
6.2 一元運算符
一元運算符就是只需要一個操作數的運算符,有 ++、-- 和 !
還有 -- 也是一樣的,只是 它是自身減 1,在運算中需要注意變量在一元運算符的順序。
6.3 邏輯運算符
邏輯運算符有 && 、|| 和 !,! 因為只對一個操作數操作所以也屬于一元運算符。
6.4 關系運算符
關系運算符有 < > <=>===!====和 !==。運算完都是返回 Boolean 類型的,這里就不細說了,都差不多的,只說下==和===的區別,還有 !==和 !=的區別。==只判斷兩值的字面量相等不相等,不會判斷數據類型,而===會先去判斷數據類型再判斷字面量,!=和 !==的區別也是這樣。
6.5 賦值運算符
賦值運算符有 +=-=*=/=%== 六個。
+=就是把左右兩邊的值相加起來再賦值給左邊的值,其他的也一樣,就不多說了。
6.6 運算符優先級從高到低(運算順序)
7. 流程結構
JavaScript 的流程結構有三種,分別是順序結構,分支結構和循環結構,這個也和 python 差不多的。
順序結構就是代碼是按順序從上到下執行的,分支結構就是按照給定條件的是否成立而執行不同的語句,循環結構就是重復執行某一段代碼。
順序結構就不多說了,我們剛才運行的代碼就是順序結構的,現在先說下分支結構。
7.1 分支結構
使用分支結構可以使用 if 和 else 組成的語句,寫法和 python 差不多。
單獨 if 語句
說到判斷,就有個隱式轉換,就是 if 括號里面的值會將任意類型的值隱式轉換成 Boolean 類型。如下:
另一種形式的分支語句:
if-else 一起用
這個 if-else 合用還有個簡單點的寫法,叫做三元運算符,語法為
當表達式1 為 true 的時候,就會把 表達式2 的值給返回,否則返回 表達式3 的值,這個有一個缺陷,就是必須要有結果返回。
還有一種形式的分支語句:
if-else if-if 三個合用
上面的 三個合用我們也可以使用 switch 語句來改寫,這個是選擇關鍵詞。語法為
改寫后:
因為 case 的值只能是一個值,不能是范圍,所以用了個除法來解決,要不然需要寫大量的 case,還需要注意一點是一定需要記得寫 break,否則在匹配到相應的值之后它會一直往下運行不管 case 值是否對應,直到遇到 break 或者 全部運行完。
7.2 循環結構
JavaScript 的循環結構也有 while 和 for語句,但他還有 do-while語句。
這個先去執行初始化表達式1, 然后去執行判斷表達式2,符合條件就會執行循環體,循環體執行完之后就執行自增表達式3,再去判斷,接下來就是重復剛才的動作,直到不滿足判斷表達式2。
滿足循環條件之后就執行循環體,然后再去執行循環條件,接下來就是重復剛才的動作直到不滿足條件。
先去執行循環體,再去判斷循環條件,接下來就是重復剛才的動作直到循環條件不滿足。
在循環結構中還可以使用 break 和 continue 來對循環進行跳出的操作。break 就是跳出整個循環,就是循環結束,而 continue 是跳出本次循環,接著下一次的循環。
學習了循環之后,我們也可以嘗試著自己打印一個三角形,或者 99 乘法表來滿足一下自己。
這兩個的思路都是差不多的,只要你搞定了第一個三角形的思路,下面的乘法表自然就迎刃而解了,這里就不多說了
*請認真填寫需求信息,我們會在24小時內與您取得聯系。