wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能

通常,大多数应用程序通过保持 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 的高级特性允许您创建自己的标记,可以通过定制代码来处理这些标记以执行您选择的任何操作。对您自己的可定制嵌入式浏览器的控制为增强的报表生成及联机帮助提供了无限的可能性。

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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

TAG标签:Python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python增删改查mysql_python对数据库mysql的操作(增删改查)

#codingutf-8import pymysql# #查询# def connMySQL():# try:# connpymysql.connect(‘localhost‘,‘root‘,‘admin‘)# conn.select_db(‘five‘)# except Exception as e:# return e.args# else:# curconn.cursor()# cur.execute("select * from users")# datacu…

指数函数中x的取值范围_指数函数x的取值范围是

1、指数函数x的取值范围是a>0且a不1;2、指数函数是重要的基本初等函数之一。一般地,yax函数(a为常数且以a>0,a≠1)叫做指数函数,函数的定义域是 R ;3、,在指数函数的定义表达式中,在ax前的…

java创建response对象_创建一个HttpResponse对象

创建一个HttpResponse对象HttpResponse类实现了javax.servlet.http.HttpServletResponse。跟随它的是一个叫做 HttpResponseFacade的faade类。Figure 3.3显示了HttpResponse类和它的相关类的UML图。在第2章中,你使用的是一个部分实现的HttpResponse类。例如&#xf…

java编译机制_java的编译机制

我们通常写的文件都是java文件,最后要在JVM上运行则需要将java文件编译成class(二进制文件).各厂商在实现JDK时通常会符合java语言规范的源码编译为class文件的编译器.编译器的好坏很大程度上决定了最后程序在机器上执行效率.通常使用Sun JDK(javac).javac将java源码编译成clas…

java excutorthread_JAVA 线程池ThreadPoolExcutor原理探究

概论线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程…

java 继承作用_java三大特性之继承

继承(extends):让类与类之间产生关系,子父类的关系继承的好处与弊端:好处:提高代码的复用性提高了代码的维护性让类与类之间产生关系,是多态的前提弊端:类的耦合性增加开发的原则是:1、高内聚&a…

java gui 单选_java GUI编程(swing)之三swing单选框复选框组件

swing复选框(JCheckBox) 单选框(JRadioButton)特别说明:同一组单选按钮,必须先创建一个ButtonGroup,然后把单选按钮放到ButtonGroup中package gui;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import j…

websocket连接mysql_websocket 使用 spring 的service层 ,进而调用里面的 dao层 来操作数据库 ,包括redis、mysql等通用...

1.前言描述一下今天用websocket踩得坑 ---》空指针异常!我想在websocket里面使用service 层的接口,从中获取数据库的一些信息 ,使用 Autowired 注解 接口 ,报错 空指针异常 !!!查过资料才发…

世上最简单的mysql_最简单易懂的mysql安装教程

今天安装MySQL花了蛮长时间的,感觉坑还是挺多的,写遍文章总结一下。一、安装1.解压zip包到安装目录先从MySQL官网 下载mysql最新的免安装版压缩包解压之后变成这个样子:里面的文件是这个样子下面开始了,请注意2.配置文件在安装目录…

java if hasvalue_首选:可为空 .HasValue或Nullable !=空吗?

我一直使用Nullable<>.HasValue因为我喜欢这种语义。 但是&#xff0c;最近我正在开发其他人的现有代码库&#xff0c;其中他们专门使用Nullable<> ! null 。是否有理由优先使用一个&#xff0c;还是纯粹是偏爱&#xff1f;int? a; if (a.HasValue) // ...与int?…

Java 源程序的良好书写规范有哪些_使用Java作为程序语言时,好的命名规范有哪些...

变量名普通变量命名应该采用首字母小写&#xff0c;其他字母首字母大写的方式。final static变量的名字应该都大写&#xff0c;并且指出完整含义。如果一个常量名称由多个单词组成&#xff0c;则应该用下划线来分割这些单词如。NUM_DAYS_IN_WEEK MAX_VALU如果需要对变量名进行缩…

java邮箱exchange_使用Javamail访问Microsoft Exchange邮箱(IMAP,MS Exchange)

我需要通过IMAPS JavaMail连接到Microsoft Exchange Server.首先,我得到了&#xff1a;A1 NO AUTHENTICATE failed.javax.mail.AuthenticationFailedException: AUTHENTICATE failed.我的调试器中的异常.然后,我禁用了一些身份验证协议&#xff1a;imapProps.setProperty("…

java.equal例子_Java中的== 和equals()方法详解与实例

Java中的 和equals()方法&#xff1a;Java中的数据类型&#xff0c;可分为两类&#xff1a;1.基本数据类型&#xff0c;也称原始数据类型。byte,short,char,int,long,float,double,boolean&#xff0c;他们之间的比较&#xff0c;应用双等号(),比较的是他们的值。2.引用数据类型…

aix系统升级失败提示java_AIX系统补丁升级失败处理

问题描述&#xff1a;现网一台IBM P550小型机&#xff0c;初始版本通过oslevel –r命令检查为5300-02&#xff0c;在IBM官方网站下载5300-06补丁并升级到5300-06后系统报错&#xff0c;缺少sysmgt.websm.apps 5.3.0.60&#xff0c;sysmgt.websm.rte 5.3.0.60两个文件问题处理&a…

java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用

最近由于工作需要&#xff0c;需要研究常用的集中序列化方式&#xff0c;主要目的是对象序列化后占用空间会大大减少&#xff0c;便于存储和传输&#xff0c;下面是几种序列化方式的使用demo1. Java自带的Serialize依赖jar包&#xff1a;无代码示意&#xff1a;import java.io.…

Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样

分享一个利用反射实现比较两个实体属性值的方法&#xff1a;package net.zwq1105.test;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.sql.Timestamp;import java.util.ArrayList;import java.util.Array…

java编码规范右大括号换行_java编码规范摘选

1.方法注释模板;description&#xff0c;param&#xff0c;author可选&#xff1a;return&#xff0c;exception2. 行尾注释&#xff0c;如循环结束&#xff0c;模块类结束行3. 文件开头注释项目名称project n ame创建日期&#xff1a;{date}修改历史&#xff1a;版权声明&…

python widnows mysql_Windows下python安装MySQLdb

安装MySQLdb需要在电脑上安装MySQL connector C&#xff0c;只需要这个connector就好&#xff0c;不需要把mysql装全。另外&#xff0c;需要安装VC for python提供编译。到官网上下载脚本进行安装即可&#xff0c;解压压缩包以后&#xff0c;cmd到目标目录&#xff0c;python s…

centos6 yum安装mysql5.6_centos 6.5 yum安装mysql 5.6

[rootlocalhost ~]# vim /etc/yum.repos.d/mysql.repo 新建mysql的yum文件[mysql56-community]nameMySQL 5.6 Community Serverbaseurlhttp://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/gpgcheck0wq保存退出&#xff01;[rootlocalhost ~]# yum repolist enable…

java 中断代码_你的java代码可中断吗?(2)

1.确保提交到线程池的任务可中断原文&#xff1a;www.securecoding.cert.org&#xff0c;TPS02-J. Ensure thattasks submitted to a thread pool are interruptible。为了能完全关闭线程池或者取消线程池中的个别任务&#xff0c;程序应提交支持使用Thread.interrupt()中断的任…