wxpython是干嘛的_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

对于小的应用,可以用如下方式

importwx

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 执行错误的信息。

因为,输出后立即关闭,速度太快以至于用户很难看到,或者一闪而过。

实例代码:

importwxclassKunthApp(wx.App):defOnInit(self):

frame=wx.Frame(None)

frame.Show(True)returnTrue

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() 强制退出。这种退出对数据是不安全的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值