欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用Python中的wxPython實(shí)現(xiàn)最基本的瀏覽器功能

 更新時(shí)間:2015年04月14日 12:11:57   投稿:goldensun  
這篇文章主要介紹了用Python中的wxPython實(shí)現(xiàn)基本的瀏覽器功能,本文來(lái)自于IBM官方網(wǎng)站開(kāi)發(fā)者文檔,需要的朋友可以參考下

通常,大多數(shù)應(yīng)用程序通過(guò)保持 HTML 簡(jiǎn)單來(lái)解決大多數(shù)瀏覽器問(wèn)題 ― 或者說(shuō),根據(jù)最低共同特性來(lái)編寫(xiě)。然而,即便如此,也仍然存在字體和布局的問(wèn)題,發(fā)行新瀏覽器和升級(jí)現(xiàn)有瀏覽器時(shí),也免不了測(cè)試應(yīng)用程序的痛苦。替代方案 ― 只支持一種瀏覽器 ― 通常不是一種用戶友好的解決方案。

明顯的解決方案是在應(yīng)用程序中嵌入自己的表現(xiàn) HTML 的窗口構(gòu)件。當(dāng)然,從頭開(kāi)始編寫(xiě)這樣的窗口構(gòu)件工作量很大,因此,求助于預(yù)先封裝的解決方案好象是合理的。

商界有許多選擇及幾個(gè)開(kāi)放源碼軟件包。本文將向您顯示如何以 Python 作為綁定的語(yǔ)言選擇(也支持 C++、Perl 和其它語(yǔ)言)使用作為 wxWindows 軟件包一部分分發(fā)的 wxHtml 窗口構(gòu)件。

雖然沒(méi)有任何 wxPython 經(jīng)驗(yàn)而熟諳 Python 的開(kāi)發(fā)人員應(yīng)該能夠從頭開(kāi)始,但本文還是假定您具有基本的 wxPython 知識(shí)。在本文中,我們將創(chuàng)建一個(gè)獨(dú)立的瀏覽器應(yīng)用程序,同時(shí),保持體系結(jié)構(gòu)足夠簡(jiǎn)單以致將瀏覽器功能遷移到現(xiàn)有的應(yīng)用程序中是一項(xiàng)簡(jiǎn)單的任務(wù)。
世界上最基本的瀏覽器

第一步是組裝支持使用 wxHtml 窗口構(gòu)件的應(yīng)用程序所必需的最少代碼。下列代碼實(shí)現(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 解釋器中運(yùn)行上述代碼將產(chǎn)生一個(gè)具有空的白面板(wxHtml 窗口構(gòu)件)的大窗口。如果出現(xiàn)任何語(yǔ)法錯(cuò)誤,請(qǐng)檢查空格問(wèn)題 ― 尤其是如果您將代碼剪切粘貼到解釋器或編輯器的情況。如果 Python 解釋器顯示無(wú)法導(dǎo)入 wxPython,請(qǐng)檢查安裝以確保安裝正確。

當(dāng)然,一啟動(dòng)該瀏覽器,立刻出現(xiàn)的是:我們?nèi)鄙倌承〇|西 ... 例如裝入頁(yè)面的機(jī)制。對(duì)于某些應(yīng)用程序,這一非?;镜脑O(shè)置實(shí)際上可能已經(jīng)夠了 — 如果您已知道您要交付什么,那么用戶就無(wú)需選擇自己的頁(yè)面。簡(jiǎn)單的更改是向 exHtmlPanel 傳遞額外的參數(shù),那就是您想訪問(wèn)的頁(yè)面:
清單 2. 修改 exHtmlPanel 以裝入頁(yè)面

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)

為了使之更獨(dú)立也為了使之更象瀏覽器,我們將擴(kuò)展 ttHtmlPanel 類以添加一些執(zhí)行標(biāo)準(zhǔn)瀏覽器任務(wù)的按鈕。當(dāng)然,如果您實(shí)際上是計(jì)劃構(gòu)建一個(gè)真正的瀏覽器應(yīng)用程序,那么在 GUI 設(shè)計(jì)和可用性方面您可能要考慮的比我們這里做的更多。
清單 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!")

如果您以前使用過(guò) wxPython 或任何其它 Python 圖形工具箱,那么您可以發(fā)現(xiàn)我們做的所有事情就是向面板添加另一個(gè)容器并將四個(gè)按鈕置于其中,帶有對(duì) exHtmlPanel 類中所添加的方法的回調(diào)函數(shù)?;A(chǔ) wxHtml 類巧妙地為我們管理歷史,因此, OnBack 和 OnForward 僅僅是對(duì)基礎(chǔ)方法的調(diào)用。

假定讀到這些時(shí)您已一直在使用 Python 解釋器,那么您可能注意到:如果關(guān)閉應(yīng)用程序,它從不將控制返回給控制臺(tái)。這個(gè)問(wèn)題解決起來(lái)很簡(jiǎn)單,但我們可能應(yīng)該添加一個(gè)菜單欄來(lái)提供具有退出選項(xià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)

當(dāng)我們沒(méi)有試圖將它變?yōu)橐粋€(gè)真正的瀏覽器的時(shí)候,我們?cè)诮Y(jié)尾處發(fā)現(xiàn)少了兩個(gè)添加項(xiàng):大多數(shù)瀏覽器都有狀態(tài)欄,并且您可能注意到了沒(méi)有繪制任何圖像。下列對(duì) exApp 、 exFrame 和 exHtmlPanel 的修改添加了一個(gè)狀態(tài)欄以及所有來(lá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 的高級(jí)特性允許您創(chuàng)建自己的標(biāo)記,可以通過(guò)定制代碼來(lái)處理這些標(biāo)記以執(zhí)行您選擇的任何操作。對(duì)您自己的可定制嵌入式瀏覽器的控制為增強(qiáng)的報(bào)表生成及聯(lián)機(jī)幫助提供了無(wú)限的可能性。

這些代碼本身就可以輕易為任意數(shù)目的應(yīng)用程序提供基礎(chǔ),并且 ― 沒(méi)有理由將您限制在僅僅提供聯(lián)機(jī)幫助上。請(qǐng)自由使用這些類,看看能讓它們發(fā)生什么有趣的行為。:-)

相關(guān)文章

最新評(píng)論