供初学者使用的 wxHTML

   通常,大多数应用程序通过保持 HTML 简单来解决大多数浏览器问题 ― 或者说,根据最低共同特性来编写。然而,即便如此,也仍然存在字体和布局的问题,发行新浏览器和升级现有浏览器时,也免不了测试应用程序的痛苦。替代方案 ― 只支持一种浏览器 ― 通常不是一种用户友好的解决方案。

  明显的解决方案是在应用程序中嵌入自己的表现 HTML 的窗口构件。当然,从头开始编写这样的窗口构件工作量很大,因此,求助于预先封装的解决方案好象是合理的。

  商界有许多选择及几个开放源码软件包(参阅本文后面的 参考资料)。本文将向您显示如何以 Python 作为绑定的语言选择(也支持 C++、Perl 和其它语言)使用作为 wxWindows 软件包一部分分发的 wxHtml 窗口构件。

  虽然没有任何 wxPython 经验而熟谙 Python 的开发人员应该能够从头开始,但本文还是假定您具有基本的 wxPython 知识。在本文中,我们将创建一个独立的浏览器应用程序,同时,保持体系结构足够简单以致将浏览器功能迁移到现有的应用程序中是一项简单的任务。

  世界上最基本的浏览器

  第一步是组装支持使用 wxHtml 窗口构件的应用程序所必需的最少代码。下列代码实现用 wxHtml 窗口构件作为其主窗口内容的基本 wxPython 应用程序。

  清单 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 解释器中运行上述代码将产生一个具有空的白面板(wxHtml 窗口构件)的大窗口。如果出现任何语法错误,请检查空格问题 ― 尤其是如果您将代码剪切粘贴到解释器或编辑器的情况。如果 Python 解释器显示无法导入 wxPython,请检查安装以确保安装正确。

  当然,一启动该浏览器,立刻出现的是:我们缺少某些东西 ... 例如装入页面的机制。对于某些应用程序,这一非常基本的设置实际上可能已经够了 — 如果您已知道您要交付什么,那么用户就无需选择自己的页面。简单的更改是向 exHtmlPanel 传递额外的参数,那就是您想访问的页面:

  清单 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 类以添加一些执行标准浏览器任务的按钮。当然,如果您实际上是计划构建一个真正的浏览器应用程序,那么在 GUI 设计和可用性方面您可能要考虑的比我们这里做的更多。

  清单 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 图形工具箱,那么您可以发现我们做的所有事情就是向面板添加另一个容器并将四个按钮置于其中,带有对 exHtmlPanel 类中所添加的方法的回调函数。基础 wxHtml 类巧妙地为我们管理历史,因此, OnBack 和 OnForward 仅仅是对基础方法的调用。

  假定读到这些时您已一直在使用 Python 解释器,那么您可能注意到:如果关闭应用程序,它从不将控制返回给控制台。这个问题解决起来很简单,但我们可能应该添加一个菜单栏来提供具有退出选项的文件菜单:

  清单 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)

  当我们没有试图将它变为一个真正的浏览器的时候,我们在结尾处发现少了两个添加项:大多数浏览器都有状态栏,并且您可能注意到了没有绘制任何图像。下列对 exApp 、 exFrame 和 exHtmlPanel 的修改添加了一个状态栏以及所有来自 wxPython 的内置图像支持:

  清单 5. 添加状态栏及图像支持

  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")

  ...

  现在,基本浏览器的功能应该齐全了。wxPython 的高级特性允许您创建自己的标记,可以通过定制代码来处理这些标记以执行您选择的任何操作。对您自己的可定制嵌入式浏览器的控制为增强的报表生成及联机帮助提供了无限的可能性。

  这些代码本身就可以轻易为任意数目的应用程序提供基础,并且 ― 没有理由将您限制在仅仅提供联机帮助上。请自由使用这些类,看看能让它们发生什么有趣的行为。

时间: 2024-09-17 03:27:53

供初学者使用的 wxHTML的相关文章

[NET.VB]小问题集锦(供初学者参考)

参考|初学|问题 声明: 1.所有代码不注明出处的皆为本人所写 2.所有代码均在本机调试通过 3.本贴适用于初学者(本人也是) 4.欢迎各位仁兄斧正,提供想法或代码 5.本人力求每日补充内容 6.非本人同意,请勿转载本人所写的代码 7.各位说要不要上面第6条? 8.哈,声明是这样写的吗,一点都不严肃,也不规范 水如烟 2004.7.19 [控件类] TreeView 1.给节点加个ToolTip(2004.7.19) Private tmpTreeNode As TreeNode Private

供初学者阅读:什么是网页标准化(Web标准)?

web|web标准|初学|网页 说了很多网页标准化,Web标准,可能咋一问什么是Web标准,你也不知道从何说起,你可能会说是div+css,可能是xhtml+css,可能是能通过验证就是标准.下面具体的说说什么是Web标准,网页标准化. WEB标准 WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior).对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,

Java基础:初学者Java语言入门精典文章

初学 Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案.在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供初学者做个参考. 我在学习Java的过程中主要围绕以下几个方面来学习: 1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java. 2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以.要注意,即便对一个简单的例子也要有耐心去琢磨.调试.改动. 3.在学习的

存取程序状态的几种方法——Java I/O应用杂谈

程序 jungleford如是说     已经有一个多月没有搭理blog了,原因很多,譬如实验室的项目正在收工,巨忙:譬如找工作及其相关的事情:而且二月份大部分时间是陪老爹老妈,家里拨号的速度可想而知--但主要还是没有找到一个合适的topic,或者说这段时间懒了(临毕业前期综合症),净在看<汉武大帝>和历史方面的书,还有其它乱七八糟的闲书,就是没有认真地玩Java,哈哈!现在工作差不多落实了,好在不算太烂,小资青年jungleford的生活又开始步入正轨了!以上是新年里的一些废话.    今天

初学Java所需要注意的几点

初学 Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案.在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供初学者做个参考. 我在学习Java的过程中主要围绕以下几个方面来学习: 1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java. 2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以.要注意,即便对一个简单的例子也要有耐心去琢磨.调试.改动. 3.在学习的

30个WEB设计师必备的PSD文件

网页制作Webjx文章简介:互联网就是有这样的好处,我们能够分享到越来越多的好资源,既可以直接拿来使用,又能供初学者研究学习.今天带给你们的又是一套免费大餐,喜欢的话别忘了分享哦! 璃质感播放按钮 作者:Birofunk Windows 按钮 PSD 作者: Vicing 火狐PSD 作者 Vathanx 黑色免费按钮 作 互联网就是有这样的好处,我们能够分享到越来越多的好资源,既可以直接拿来使用,又能供初学者研究学习.今天带给你们的又是一套免费大餐,喜欢的话别忘了分享哦! 璃质感播放按钮 作者

初学解惑:关于ASP.NET技术的学习顺序问题

asp.net|初学|问题 前前后后收到过一些学生的来信,询问ASP.NET的学习顺序问题,在此就向打算系统学习ASP.NET技术的初学者谈谈我的建议. 如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NET是一个全面向对象的技术,不懂OO,那绝对学不下去! 第二步 对.NET Framework类库有一定的了解 可以通过开发Windows Form

看紧你的3306端口,一次通过mysql的入侵

mysql 用superscan扫了一下某个c类的网段,寻找开放80端口的机器,结果就只有一台机器开放了80端口,试着连了一下,是我们学校某个社团的的主页.从端口的banner来看应该是apache(win32),证实一下telnet 211.87.xxx.xxxget(回车)<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><HTML><HEAD><TITLE>501 MethodNot

关于ASP.NET技术的学习顺序问题

前前后后收到过一些学生的来信,询问ASP.NET的学习顺序问题,在此就向打算系统学习ASP.NET技术的初学者谈谈我的建议. 如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NET是一个全面向对象的技术,不懂OO,那绝对学不下去! 第二步 对.NET Framework类库有一定的了解 可以通过开发Windows Form应用程序来学习.NET Fr