《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()

关键点:

  1. 创建 wx.App 实例,此处使用 wx.App 的 subclass wx.PySimpleApp。
  2. 创建 frame 并设置其样式与行为。
  3. 启动 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的更多相关文章

  1. struts框架的运行原理和流程

    从此图中简单描述一下struts2的运行流程:1.客户端请求一个HttpServletRequest的请求,如在浏览器中输入http://localhost: 8080/bookcode/Reg.ac ...

  2. Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」

    1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...

  3. thinkphp3.2框架运行原理

    thinkphp3.2是使用率非常普遍的国产php框架,以简单易于上手闻名,那么它框架结构是怎样的? tp3.2设计简单来说就是CBD,core(框架核心文件),bebavior(行为,tp3.2一大 ...

  4. Asp.net WebPages框架运行原理浅析(转)

    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...

  5. QF——iOS程序运行原理(APP的生命周期)

    iOS程序的运行原理: main.m: 1. main.m 主函数是所有程序的入口函数. 2. 在main函数里是UIApplicationMain函数,开启了一个无限循环,以监听该应用. 该UIAp ...

  6. 测试框架Unitest的运行原理,以及多个测试类中的执行顺序以及简化方法

    单元测试单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一 ...

  7. Asp.net WebPages框架运行原理浅析

    [来源] 达内    [编辑] 达内   [时间]2012-09-14 在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和 ...

  8. 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)

    第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...

  9. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...

随机推荐

  1. [Java] Eclipse注释模板设置详解

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...

  2. IIS错误500.21

    操作系统:win7,有.net2.0,.net4.0 网站4.5, 错误原因:IIS未注册4.0框架. 解决办法: %windir%\Microsoft.NET\Framework\v4.0.3031 ...

  3. 逆向+两次bfs(UVA 1599)

    为什么都说简单好想咧.坦白从宽看了人家的代码,涨了好多姿势,, http://blog.csdn.net/u013382399/article/details/38227917 被一个细节坑了.. 2 ...

  4. Evaluation of Expression Tree

    Evaluation of Expression Tree Given a simple expression tree, consisting of basic binary operators i ...

  5. HTML5新特性之WebNotifications

    Web Notifications是HTML5中一个令人欣喜的新特性,它支持开发者配置和显示桌面通知,为用户提供更好的体验,最令人称赞的是,即使用户忙于其他工作时也可以收到来自页面的消息通知,例如一个 ...

  6. HDOJ2026首字母变大写

    首字母变大写 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. 分析Android程序之破解第一个程序

    破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkToo ...

  8. hdoj1423 最长上升公共子序列

    hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...

  9. 最新app源码下载:200款优秀Android项目源码

    200款优秀Android项目源码!菜鸟必备!Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他 ...

  10. Android M Permission处理

    Android M(6.0)相比之前的版本,做了比较多的优化与改进.其中变化最大的一点是权限管理方面的改变,即不再是应用安装时授权,而改为运行时授权机制:一直以来,系统安全都是用户非常关心的问题,而之 ...