wxPython中HTML应用与打印框架全解析
立即解锁
发布时间: 2025-08-17 02:04:08 阅读量: 3 订阅数: 15 


wxPython in Action:GUI开发的利器
### wxPython 中 HTML 应用与打印框架全解析
#### 1. 在应用中集成 HTML
在 wxPython 里,HTML 窗口有着广泛的用途,它可以显示包含简单 HTML 标记的文本,还能处理已加载图像处理器的任何图像。你可以通过字符串、本地文件或 URL 为 HTML 窗口提供显示信息,并且可以像普通超文本浏览器那样响应用户点击,也能自定义响应方式。同时,你还能将 HTML 窗口与框架连接,使标题和状态信息自动显示在正确位置,它还维护着一个历史列表,方便你访问和操作。另外,使用 `wx.Html.HtmlEasyPrinting` 类可以轻松打印页面。
##### 1.1 添加对新标签的支持
在 wxPython 中,解析器返回的单元格由标签处理程序内部创建,这是一种可插拔结构,用于将 HTML 标签与 HTML 解析器单元格的创建和操作关联起来。你可以创建自己的标签处理程序并将其与 HTML 标签关联,从而扩展 HTML 窗口,使其支持当前不支持的标准标签或自定义标签。
以下是一个自定义 `<blue>` 标签的示例代码:
```python
import wx
import wx.html
page = """<html><body>
This silly example shows how custom tags can be defined and used in a
wx.HtmlWindow. We've defined a new tag, <blue> that will change
the <blue>foreground color</blue> of the portions of the document that
it encloses to some shade of blue. The tag handler can also use
parameters specified in the tag, for example:
<ul>
<li> <blue shade='sky'>Sky Blue</blue>
<li> <blue shade='midnight'>Midnight Blue</blue>
<li> <blue shade='dark'>Dark Blue</blue>
<li> <blue shade='navy'>Navy Blue</blue>
</ul>
</body></html>
"""
class BlueTagHandler(wx.html.HtmlWinTagHandler):
def __init__(self):
wx.html.HtmlWinTagHandler.__init__(self)
def GetSupportedTags(self):
return "BLUE"
def HandleTag(self, tag):
old = self.GetParser().GetActualColor()
clr = "#0000FF"
if tag.HasParam("SHADE"):
shade = tag.GetParam("SHADE")
if shade.upper() == "SKY":
clr = "#3299CC"
if shade.upper() == "MIDNIGHT":
clr = "#2F2F4F"
elif shade.upper() == "DARK":
clr = "#00008B"
elif shade.upper() == "NAVY":
clr = "#23238E"
self.GetParser().SetActualColor(clr)
container = self.GetParser().GetContainer()
container.InsertCell(wx.html.HtmlColourCell(clr))
self.ParseInner(tag)
self.GetParser().SetActualColor(old)
container = self.GetParser().GetContainer()
container.InsertCell(wx.html.HtmlColourCell(old))
return True
wx.html.HtmlWinParser_AddTagHandler(BlueTagHandler)
class MyHtmlFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title)
html = wx.html.HtmlWindow(self)
if "gtk2" in wx.PlatformInfo:
html.SetStandardFonts()
html.SetPage(page)
app = wx.PySimpleApp()
frm = MyHtmlFrame(None, "Custom HTML Tag Handler")
frm.Show()
app.MainLoop()
```
在这个示例中,我们定义了一个 `<blue>` 标签处理程序,它可以将标签内文本的前景色更改为不同的蓝色调。
标签处理程序是 `wx.html.HtmlWinTagHandler` 的子类,你需要重写两个方法,并了解另一个方法:
- **`GetSupportedTags()`**:返回此处理程序管理的标签列表,标签必须为大写,如果有多个标签,用逗号分隔,中间无空格。
- **`HandleTag(tag)`**:在该方法中,你可以通过向解析器添加新的单元格元素(或对解析器当前打开的容器单元格进行更改)来处理标签。你可以通过调用标签处理程序的 `GetParser()` 方法获取解析器。
编写 `HandleTag()` 方法的步骤如下:
1. 获取解析器。
2. 必要时处理标签的参数,可能会对现有单元格进行更改或创建新单元格。
3. 如果正在解析的标签是带有内部文本的开始/结束对,则解析中间的文本。
4. 对解析器进行必要的清理。
以下是 `wx.Html.Tag` 类的一些有用方法:
| 方法 | 描述 |
| ---- | ---- |
| `GetAllParams()` | 将与标签关联的所有参数作为字符串返回。对于某些用途,解析此字符串可能比单独获取每个参数更容易。 |
| `GetName()` | 以大写文本返回标签名称。 |
| `HasParam(param)` | 如果标签具有给定参数,则返回 `True`。 |
| `GetParam(param, with_commas=False)` | 返回参数 `param` 的值。如果 `with_commas` 参数为 `True`,则返回包含值起始和结束引号的原始字符串(如果有)。如果参数不存在,则返回空字符串。相关方法 `GetParamAsColour(param)` 将参数值作为 `wx.Color` 返回,`GetParamAsInt(param)` 将值作为整数返回。 |
| `HasEnding()` | 如果标签有结束标签,则返回 `True`,否则返回 `False`。 |
要在解析器中添加或编辑单元格,有以下三种选择:
- **添加到当前容器**:如果你想向容器中添加另一个单元格,可以直接操作当前容器。
- **创建新单元格并添加到容器**:调用解析器的 `GetContainer()` 方法,然后通过任何方式创建 `wx.html.HTMLCell` 子类的实例,并通过调用容器的 `InsertCell(cell)` 方法将其添加到容器中。
- **创建嵌套容器**:偶尔,你可能需要创建一个从属于或嵌套在当前打开容器内的容器。例如,嵌套在表格行中的表格单元格。为此,你需要调用解析器的 `OpenContainer()` 方法,该方法将返回新的容器单元格,你可以使用 `InsertCell(cell)` 方法向其中插入显示单元格。在标签处理程序中打开的每个容器都需要使用 `CloseContainer()` 方法关闭,否则会影响解析器对其余 HTML 文本的处理。
- **创建同级容器**:创建与解析器当前容器处于同一级别的容器,即不进行容器嵌套。例如,新的段落。要实现这种效果,你需要关闭现有容器,打开新容器,并在方法结束时反转该过程。
```python
parser = self.GetParser()
parser.CloseContainer()
parser.OpenContainer()
# Do all your stuff
parser.CloseContainer()
parser.OpenContainer()
```
##### 1.2 支持其他文件格式
默认情况下,HTML 窗口可以处理 MIME 类型为 `text/html`、`text/txt` 和 `image/*` 的文件(假设已加载 wxPython 图像处理器)。当遇到非图像或 HTML 文件时,HTML 窗口会尝试将其显示为纯文本,这可能不是你想要的行为。如果你希望以自定义方式显示某些文件格式,可以创建 `wx.html.HtmlFilter` 来处理。
创建过滤器需要构建 `wx.html.HtmlFilter` 的子类,并重写两个方法:
- **`CanRead(file)`**:`file` 参数是 `wx.FSFile` 的实例,代表一个已打开的文件。`wx.FSFile` 类有两个属性可用于确定过滤器是否可以读取该文件:`GetMimeType()` 方法返回文件的 MIME 类型(通常由文件扩展名确定),`GetLocation()` 方法返回文件位置的绝对路径或 URL。如果过滤器将处理该文件,`CanRead()` 方法应返回 `True`,否则返回 `False`。以下是一个处理 Python 源文件的 `CanRead()` 示例:
```python
def CanRead(self, file):
return file.GetLocation().endswith('.py')
```
- **`ReadFile(file)`**:该方法接受相同的 `file` 参数,并返回文件内容的 HTML 字符串表示。如果你不想使用 wxWidgets C++ 文件机制读取文件,可以通过在 `file.GetLocation()` 处打开 Python 文件来使用 Python 文件机制。
创建过滤器后,需要使用 `wx.html.HtmlWindow` 的 `AddFilter(filter)` 静态方法将其注册到 HTML 窗口。注册后,窗口将使用该过滤器处理通过 `CanRead()` 测试的文件对象。
##### 1.3 获取更强大的 HTML 小部件
虽然 `wx.html.HtmlWindow` 不是功能齐全的浏览器面板,但有几种方法可以嵌入功能更强大的 HTML 渲染窗口:
- **Windows 平台**:可以使用 `wx.lib.iewin.IEHtmlWindow` 类,它是围绕 Internet Explorer ActiveX 控件的 wxPython 包装器,允许你将 Internet Explorer 窗口直接嵌入到应用
0
0
复制全文
相关推荐










