wxPython 基本框架与运行原理 -- App 与 Frame
《wxPython in Action》 chapter 1、2 笔记
wxPython 是 wxWidgets 的 Python 实现,“w” for Microsoft Windows and “x” for Unix X server.
1. 概述
wxPython 中,最基本的组件是 wx.App 和 wx.Frame。
每个 wxPython 应用必须包含这两个组件。wx.App 只有一个,wx.Frame 至少一个。
wx.App 是应用程序,通过 event loop 管理生命周期。
wx.Frame 是窗口,通过在窗口内添加 widget(组件,如 button)控制样式和行为。
1.1 先 import wx 再 import wx其他包
import wx 时执行一些初始化操作,其他包依赖。所以需要先导入。
非 wx 的包则不涉及顺序。
1.2 先建 App 后建 Frame
所有 wxPython 的操作,必须在 Application 的生命周期内进行。
所以,必须先创建 App,后创建Frame。否则报错:

2. 最简单的 App
对于小的应用,可以用如下方式
import wx app = wx.PySimpleApp() # create App first
frame = wx.Frame(None) # define a subclass and use it
frame.Show(True)
app.MainLoop()
关键点:
- 创建 wx.App 实例,此处使用 wx.App 的 subclass wx.PySimpleApp。
- 创建 frame 并设置其样式与行为。
- 启动 App 的 MainLoop。
执行结果如下:

3. 自定义 App 的 subclass -- 推荐
更优雅的用法是:
创建 wx.App 的子类并实现 OnInit 函数 -> 创建子类的实例。
OnInit 方法中,一般创建至少一个 Frame,并设置为 show。
在 App subclass 的 OnInit 中创建 top-level frame,可以保证创建 Frame 时已有 App 存在。
wx.App 执行 __init__ 时会自动调用子类的 OnInit 方法。
OnInit 无入参,返回 boolean 值,若返回 False,App 立即停止。
子类的初始化一般通过子类的 OnInit 方法实现,而不使用 __init__。
若要自定义子类的 __init__ 方法,则一定要调用 wx.App.__init__(self) ,否则 OnInit 不会执行。
若定义 OnExit 方法,则退出时自动调用。可以不定义。
此处需要特别注意,OnExit 方法中的任何输出,用户通常是看不到的,包括 OnExit 执行错误的信息。
因为,输出后立即关闭,速度太快以至于用户很难看到,或者一闪而过。
实例代码:
import wx class KunthApp(wx.App):
def OnInit(self):
frame = wx.Frame(None)
frame.Show(True)
return True app = KunthApp()
app.MainLoop()
运行结果:

4. Frame
frame 即其他 GUI 工具中的 window,可以在屏幕上移动的窗口。
wxPython 中 window 与 widget 同义,一般不用 window 这个名字,易混淆。
继承 wx.Frame 实现 subclass,并在 subclass 中封装样式控制。
一般在 subclass 的 __init__ 中实现样式控制,通常需显式调用父类 wx.Frame 的 __init__。
5. 窗口的关闭与程序退出
默认,最后一个 top-level window 退出时,wxPython Application 退出。
可以通过 wx.App 的 SetExitOnFrameDelete(flag) 方法修改默认行为。
top-level window 只没有 parent 的 frame。
通过 SetTopWindow 手动指定,若没有指定,则第一个没有 parent 的 frame 是 parent。
所有窗口关闭后,wxPython 推出前,会执行 wx.App 的 OnExit 方法。
通过自定义 OnExit 方法可以手动控制退出行为,比如 退出时清理数据库连接等非 wxPython 资源。
可以通过显式调用 wx.Exit() 强制退出。这种退出对数据是不安全的。
wxPython 基本框架与运行原理 -- App 与 Frame的更多相关文章
- struts框架的运行原理和流程
从此图中简单描述一下struts2的运行流程:1.客户端请求一个HttpServletRequest的请求,如在浏览器中输入http://localhost: 8080/bookcode/Reg.ac ...
- Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」
1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...
- thinkphp3.2框架运行原理
thinkphp3.2是使用率非常普遍的国产php框架,以简单易于上手闻名,那么它框架结构是怎样的? tp3.2设计简单来说就是CBD,core(框架核心文件),bebavior(行为,tp3.2一大 ...
- Asp.net WebPages框架运行原理浅析(转)
在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...
- QF——iOS程序运行原理(APP的生命周期)
iOS程序的运行原理: main.m: 1. main.m 主函数是所有程序的入口函数. 2. 在main函数里是UIApplicationMain函数,开启了一个无限循环,以监听该应用. 该UIAp ...
- 测试框架Unitest的运行原理,以及多个测试类中的执行顺序以及简化方法
单元测试单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一 ...
- Asp.net WebPages框架运行原理浅析
[来源] 达内 [编辑] 达内 [时间]2012-09-14 在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和 ...
- 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)
第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...
随机推荐
- iOS 新特性关键字
1.用来修饰属性,或者方法的参数,方法的返回值 /** nullable:表示可以传空 */ //@property (nonatomic, strong, nullable) NSString *n ...
- 协议Protocol
1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口. 遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议. ...
- Android快速开发框架ZBLibrary源码分享
坐标标准库ZBLibrary,是一个MVP架构的Android快速开发框架,提供一套开发标准(UI,Data,Listener)以及模板和工具类并规范代码. 封装层级少,简单高效兼容性好.Androi ...
- [改善Java代码]警惕泛型是不能协变和逆变的
什么叫做协变(covariance)和逆变(contravariance)? 在变成语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数,泛型,返回值)替换或交换的特性,简单的说,协变是 ...
- 关于Eclipse中校验输入文件名的源代码
Eclipse中测试文件名的方法. 也没有单独的分操作系统.在Talend时解决一个在文本框中输入名字有Bug的一个问题,这个是Eclipse中解决输入名字,对名字校验的部分源码. public IS ...
- cent0s7 显卡驱动导致重启黑屏
由于 CentOS7.0 版本与前面的 CentOS6.5 及之前的版本的模式变更方法有很大 的不同,以前的版本中我们可以在vi /etc/inittab 文件中将id:5:initdefault 更 ...
- Visual Studio 2012 破解版
Visual Studio 2012破解版 百度云盘:http://pan.baidu.com/s/1hrvJi2w
- MVC下用户登录状态校验的问题以及解决方案--------------Action全局过滤器的使用
前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...
- 从客户端中检测到有潜在危险的 request
如题,当遇到这种情况该怎么办呢? 通常情况下一下2种解决方案就可以解决问题了: 解决方案一: 在.aspx文件头中加入这句: <%@ Page validateReques ...
- web前端面试题收集(二)
简单介绍下你的前端代码开发与调试环境. Doctype声明的作用以及html4.01与html5中此声明的区别? 常用的块级元素与行内元素分别有哪些? 请画一下W3C盒模型 请写一个js函数,将url ...