用Python中的wxPython實現(xiàn)最基本的瀏覽器功能
通常,大多數(shù)應(yīng)用程序通過保持 HTML 簡單來解決大多數(shù)瀏覽器問題 ― 或者說,根據(jù)最低共同特性來編寫。然而,即便如此,也仍然存在字體和布局的問題,發(fā)行新瀏覽器和升級現(xiàn)有瀏覽器時,也免不了測試應(yīng)用程序的痛苦。替代方案 ― 只支持一種瀏覽器 ― 通常不是一種用戶友好的解決方案。
明顯的解決方案是在應(yīng)用程序中嵌入自己的表現(xiàn) HTML 的窗口構(gòu)件。當然,從頭開始編寫這樣的窗口構(gòu)件工作量很大,因此,求助于預(yù)先封裝的解決方案好象是合理的。
商界有許多選擇及幾個開放源碼軟件包。本文將向您顯示如何以 Python 作為綁定的語言選擇(也支持 C++、Perl 和其它語言)使用作為 wxWindows 軟件包一部分分發(fā)的 wxHtml 窗口構(gòu)件。
雖然沒有任何 wxPython 經(jīng)驗而熟諳 Python 的開發(fā)人員應(yīng)該能夠從頭開始,但本文還是假定您具有基本的 wxPython 知識。在本文中,我們將創(chuàng)建一個獨立的瀏覽器應(yīng)用程序,同時,保持體系結(jié)構(gòu)足夠簡單以致將瀏覽器功能遷移到現(xiàn)有的應(yīng)用程序中是一項簡單的任務(wù)。
世界上最基本的瀏覽器
第一步是組裝支持使用 wxHtml 窗口構(gòu)件的應(yīng)用程序所必需的最少代碼。下列代碼實現(xiàn)用 wxHtml 窗口構(gòu)件作為其主窗口內(nèi)容的基本 wxPython 應(yīng)用程序。
清單 1. 基本示例瀏覽器代碼
from wxPython.wx import * from wxPython.html import * import os,sys class exHtmlWindow(wxHtmlWindow): def __init__(self, parent, id, frame): wxHtmlWindow.__init__(self,parent,id) class exHtmlPanel(wxPanel): def __init__(self, parent, id, frame): wxPanel.__init__(self,parent,-1) self.html = exHtmlWindow(self, -1, frame) self.box = wxBoxSizer(wxVERTICAL) self.box.Add(self.html, 1, wxGROW) self.SetSizer(self.box) self.SetAutoLayout(true) class exFrame (wxFrame): def __init__(self, parent, ID, title): wxFrame.__init__(self,parent,ID,title,wxDefaultPosition,wxSize(600,750)) panel = exHtmlPanel(self, -1, self) class exApp(wxApp): def OnInit(self): frame = exFrame(NULL, -1, "Example Browser") frame.Show(true) self.SetTopWindow(frame) return true app = exApp(0) app.MainLoop()
假定您已正確安裝 wxPython,那么在 Python 解釋器中運行上述代碼將產(chǎn)生一個具有空的白面板(wxHtml 窗口構(gòu)件)的大窗口。如果出現(xiàn)任何語法錯誤,請檢查空格問題 ― 尤其是如果您將代碼剪切粘貼到解釋器或編輯器的情況。如果 Python 解釋器顯示無法導(dǎo)入 wxPython,請檢查安裝以確保安裝正確。
當然,一啟動該瀏覽器,立刻出現(xiàn)的是:我們?nèi)鄙倌承〇|西 ... 例如裝入頁面的機制。對于某些應(yīng)用程序,這一非?;镜脑O(shè)置實際上可能已經(jīng)夠了 — 如果您已知道您要交付什么,那么用戶就無需選擇自己的頁面。簡單的更改是向 exHtmlPanel 傳遞額外的參數(shù),那就是您想訪問的頁面:
清單 2. 修改 exHtmlPanel 以裝入頁面
class exHtmlPanel(wxPanel): + def __init__(self, parent, id, frame, file): wxPanel.__init__(self, parent, -1) self.html = exHtmlWindow(self, -1, frame) self.box = wxBoxSizer(wxVERTICAL) self.box.Add(self.html, 1, wxGROW) self.SetSizer(self.box) self.SetAutoLayout(true) + self.html.LoadPage(file)
為了使之更獨立也為了使之更象瀏覽器,我們將擴展 ttHtmlPanel 類以添加一些執(zhí)行標準瀏覽器任務(wù)的按鈕。當然,如果您實際上是計劃構(gòu)建一個真正的瀏覽器應(yīng)用程序,那么在 GUI 設(shè)計和可用性方面您可能要考慮的比我們這里做的更多。
清單 3. 修改 ttHtmlPanel 以添加按鈕
class ttHtmlPanel(wxPanel): def __init__(self, parent, id, frame): wxPanel.__init__(self, parent, -1) self.frame = frame self.cwd = os.path.split(sys.argv[0])[0] if not self.cwd: self.cwd = os.getcwd self.html = ttHtmlWindow(self, -1, self.frame) self.box = wxBoxSizer(wxVERTICAL) self.box.Add(self.html, 1, wxGROW) subbox = wxBoxSizer(wxHORIZONTAL) btn = wxButton(self, 1202, "Load File") EVT_BUTTON(self, 1202, self.OnLoadFile) subbox.Add(btn, 1, wxGROW | wxALL, 2) btn = wxButton(self, 1203, "Load Page") EVT_BUTTON(self, 1203, self.OnLoadPage) subbox.Add(btn, 1, wxGROW | wxALL, 2) btn = wxButton(self, 1204, "Back") EVT_BUTTON(self, 1204, self.OnBack) subbox.Add(btn, 1, wxGROW | wxALL, 2) btn = wxButton(self, 1205, "Forward") EVT_BUTTON(self, 1205, self.OnForward) subbox.Add(btn, 1, wxGROW | wxALL, 2) self.box.Add(subbox, 0, wxGROW) self.SetSizer(self.box) self.SetAutoLayout(true) def OnLoadPage(self, event): dlg = wxTextEntryDialog(self, 'Location:') if dlg.ShowModal() == wxID_OK: self.destination = dlg.GetValue() dlg.Destroy() self.html.LoadPage(self.destination) def OnLoadFile(self, event): dlg = wxFileDialog(self, wildcard = '*.htm*', style=wxOPEN) if dlg.ShowModal(): path = dlg.GetPath() self.html.LoadPage(path) dlg.Destroy() def OnBack(self, event): if not self.html.HistoryBack(): wxMessageBox("No more items in history!") def OnForward(self, event): if not self.html.HistoryForward(): wxMessageBox("No more items in history!")
如果您以前使用過 wxPython 或任何其它 Python 圖形工具箱,那么您可以發(fā)現(xiàn)我們做的所有事情就是向面板添加另一個容器并將四個按鈕置于其中,帶有對 exHtmlPanel 類中所添加的方法的回調(diào)函數(shù)?;A(chǔ) wxHtml 類巧妙地為我們管理歷史,因此, OnBack 和 OnForward 僅僅是對基礎(chǔ)方法的調(diào)用。
假定讀到這些時您已一直在使用 Python 解釋器,那么您可能注意到:如果關(guān)閉應(yīng)用程序,它從不將控制返回給控制臺。這個問題解決起來很簡單,但我們可能應(yīng)該添加一個菜單欄來提供具有退出選項的文件菜單:
清單 4. 修改 exFrame 以添加帶有退出的文件菜單
class exFrame(wxFrame): def __init__(self, parent, ID, title): wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(600,750)) panel = exHtmlPanel (self, -1, self) mnu_file = wxMenu() mnu_file.Append(101, "E&xit", "Exit the browser") menuBar = wxMenuBar() menuBar.Append(mnu_file, "F&ile") self.SetMenuBar(menuBar) EVT_MENU(self, 101, self.Exit) def Exit(self, event): self.Close(true)
當我們沒有試圖將它變?yōu)橐粋€真正的瀏覽器的時候,我們在結(jié)尾處發(fā)現(xiàn)少了兩個添加項:大多數(shù)瀏覽器都有狀態(tài)欄,并且您可能注意到了沒有繪制任何圖像。下列對 exApp 、 exFrame 和 exHtmlPanel 的修改添加了一個狀態(tài)欄以及所有來自 wxPython 的內(nèi)置圖像支持:
清單 5. 添加狀態(tài)欄及圖像支持
class exApp(wxApp): def OnInit(self): + wxInitAllImageHandlers() frame = exFrame(NULL, -1, "Example Browser") frame.Show(true) self.SetTopWindow(frame) return true class exHtmlPanel(wxPanel): def __init__(self, parent, id, frame): wxPanel.__init__(self, parent, -1) self.frame = frame self.cwd = os.path.split(sys.argv[0])[0] if not self.cwd: self.cwd = os.getcwd self.html = exHtmlWindow(self, -1, self.frame) + self.html.SetRelatedFrame(self.frame, "%s") + self.html.SetRelatedStatusBar(0) ... class exFrame(wxFrame): def __init__(self, parent, ID, title): wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(600,750)) panel = exHtmlPanel (self, -1, self) + self.CreateStatusBar() + self.SetStatusText("Default status bar") ...
現(xiàn)在,基本瀏覽器的功能應(yīng)該齊全了。wxPython 的高級特性允許您創(chuàng)建自己的標記,可以通過定制代碼來處理這些標記以執(zhí)行您選擇的任何操作。對您自己的可定制嵌入式瀏覽器的控制為增強的報表生成及聯(lián)機幫助提供了無限的可能性。
這些代碼本身就可以輕易為任意數(shù)目的應(yīng)用程序提供基礎(chǔ),并且 ― 沒有理由將您限制在僅僅提供聯(lián)機幫助上。請自由使用這些類,看看能讓它們發(fā)生什么有趣的行為。:-)
相關(guān)文章
python獲取網(wǎng)絡(luò)圖片方法及整理過程詳解
這篇文章主要介紹了python獲取網(wǎng)絡(luò)圖片方法及整理過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2019-12-12python批量處理PDF文檔輸出自定義關(guān)鍵詞的出現(xiàn)次數(shù)
這篇文章主要介紹了python批量處理PDF文檔,輸出自定義關(guān)鍵詞的出現(xiàn)次數(shù),文中有詳細的代碼示例,需要的朋友可以參考閱讀2023-04-04pytorch 實現(xiàn)將自己的圖片數(shù)據(jù)處理成可以訓(xùn)練的圖片類型
今天小編就為大家分享一篇pytorch 實現(xiàn)將自己的圖片數(shù)據(jù)處理成可以訓(xùn)練的圖片類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python生成tensorflow輸入輸出的圖像格式的方法
本篇文章主要介紹了python生成tensorflow輸入輸出的圖像格式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02如何解決requests,已經(jīng)安裝卻無法import問題
這篇文章主要介紹了如何解決requests,已經(jīng)安裝卻無法import問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06selenium+python實現(xiàn)文件上傳操作的方法實例
文件上傳功能是我們在日常開發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關(guān)于selenium+python實現(xiàn)文件上傳操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-08-08Python中使用Counter進行字典創(chuàng)建以及key數(shù)量統(tǒng)計的方法
今天小編就為大家分享一篇Python中使用Counter進行字典創(chuàng)建以及key數(shù)量統(tǒng)計的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07