wxpython
1、GUI编程概述
Python需要界面么?
大多数情况下是不需要的,但是如果要给非开发者用,那么有个界面还是必要的。只需要掌握一种基本的界面开发方法,就能应付大多数情况。
wxPython学习目标
界面编程并非Python核心,也不是它的优势,所以准备的是两天时间,选择一种Python的GUI来学习,基本就能满足需要了。
Python的界面实现方案很多,说说主流的三种方案,Tkinter(Python自带)太丑,pyQt太复杂,相对来说wxPython比较适中,也是我选择的方案。
定义的学习目标如下:
wxPython介绍
- wxPython是wxWidgets在Python语言下的封装。
- wxWidgets是一个跨平台的GUI 应用编程接口,使用C++编写。
- 图形界面风格与系统的风格相似。
- 编码风格类似于windows原生,复杂性低于pyQt
2、wxPython环境
直接开发,只需要安装wxPython就可以了
pip install -U wxPython
下载链接:http://www.wxpython.org/download.php#msw
wxPython也有一些可视化开发环境,比如:
ps:我尝试过一些,感觉不是很好用,还是直接敲代码更方便。
3、wxPython的基础
一个简单的界面应用程序构建步骤:
- 导入 wx 模块
- 定义应用程序类的一个对象
- 创建一个顶层窗口的 wx.Frame 类的对象。 给出构造标题和尺寸参数。
- 虽然其他控件可以在Frame对象加入,但它们的布局无法管理。因此,把一个Panel对象到框架。
- 添加一个静态文本对象,以显示 ‘hello world’在窗口内的任意位置。
- 通过show()方法激活框架窗口。
最简单的例子:
import wx
APP = wx.App()
window = wx.Frame(None, title="wxPython 你好!", size=(400, 300))
panel = wx.Panel(window)
label = wx.StaticText(panel, label="Hello World", pos=(100, 100))
window.Show(True)
app.MainLoop()
4、wxPython控件
wx.Frame
wx.Frame类是不带参数的默认构造函数。
wx.Panel
wx.Panel类通常是一个放入wxFrame中的对象。 这个类也继承自wxWindow类。
wx.StaticText
wx.StaticText类对象提供了一个控制持有比如只读文本。它可以被称作被动控制,因为它不产生任何事件。
TextCtrl
在wxPython中,wx.TextCtrl类对象用于于此目的。它控制在其中可以显示文本和编辑。
radiobutton & RadioBox
每个按钮,wx.RadioButton类的一个对象携带旁边有一个圆形按钮文本标签。wxPython的API还包括wx.RadioBox类。它的对象提供了一个边框和标签组。
wx.CheckBox
一个复选框显示一个小标记的矩形框。单击时,复选标记出现在矩形内,指示作出选择。
ComboBox & Choice Class
一个wx.ComboBox对象提供选择项目列表。它可以配置为一个下拉列表或永久性的显示。wxPython的API包含一个wx.Choice类,其目的也是一个下拉列表中,这是永久只读。
Wx.Gauge
Wx.Gauge类对象表示垂直或水平条,其中以图形方式显示递增量。
wx.Slider
wxPython的API包含wx.Slider类。它提供了滚动条相同的功能。滑动器提供了一个方便的方式来处理由滑块具体wx.EVT_SLIDER事件绑定拖动句柄。
wx.MenuBar
略低于顶层窗口的标题栏中的横条保留,以显示一系列菜单。这是wx.MenuBar类在wxPython API的对象。
wx.toolbar
如果wx.Toolbar对象的样式参数设置为wx.TB_DOCKABLE,它成为可停靠。浮动工具栏还可以用wxPython中的AUIToolBar类构造。
wx.Dialog
虽然一个对话框Dialog类对象出现像Frame,它通常被用作上的父框架的顶部上的弹出窗口。一个对话框(Dialog)的目的是从用户收集一些数据并将其发送到父帧(frame)。
wx.Notebook
wx.Notebook小部件提供了一个标签式的控制。在一个帧(Frame)中的一个笔记本对象具有一个或多个切换标签(称为页),其中每一个具有一个面板显示出的控制布局。
wx.SplitterWindow
这个类的对象是一个布局管理器,它拥有两个子窗口,大小可以通过拖动它们之间的边界动态变化。分离器控制给出了可拖动来调整控件的句柄。
HTMLWindow
wxHTML库中包含用于解析和显示HTML内容。 虽然这不打算成为一个全功能的浏览器,wx.HtmlWindow对象是一个通用的HTML浏览器。
listbox & ListCtrl
一个wx.ListBox控件呈现字符串的垂直滚动列表。 默认情况下,在列表中的单个产品选择。ListCtrl控件是一个高度增强列表显示和选择工具。多个列的列表可以显示在报表视图,列表视图或图标视图。
5、wxPython事件
函数或方法响应于点击按钮,调用事件选择相应的处理函数,用户的操作被执行。应用程序的运行时期间发生的某个事件数据被存储为来自wx.Event衍生的子类的对象。
例如,要调用一个按钮的点击事件的程序上的 OnClick()方法
self.b1.Bind(EVT_BUTTON, OnClick)
bind()方法是通过从wx.Evthandler类的所有显示对象继承。EVT_BUTTON这里是绑定器,其中关联按钮单击事件的 OnClick()方法。
在wxPython中事件是两种类型的。基本事件和命令事件。大多数 wxWidgets生成命令事件。
基本事件
一个基本的事件停留在它起源的窗口。比如移动窗口的 OnMove 事件
self.Bind(wx.EVT_MOVE, self.OnMove)
命令事件。
命令事件可以传播到一个或多个窗口,类层次结构来源于窗口上方。比如点击按钮的 OnButtonClicked)事件
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
6、wxPython布局
wxPython的布局又包含绝对布局和相对布局两种方式。绝对布局需要定义每一个控件的位置坐标,方法单一繁琐,很难实际应用。所以,主要的布局方式都是采用相对布局。wxPython提供了一系列的布局管理器,被称为Sizer,它们都继承至wx.sizer基类。
BoxSizer
sizer允许控件排放在按行或列的方式。BoxSizer布局是由它的定位参数(wxVERTICAL或wxHORIZONTAL)确定。
GridSizer
顾名思义,一个GridSizer对象呈现二维网格。控件被添加在网格槽以左到右和由上到下方顺序。
FlexiGridSizer
这种sizer 也有一个二维网格。它提供灵活性布局中的控制单元。
GridBagSizer
GridBagSizer是一种多功能sizer。它比FlexiGridSizer提供了更多的增强功能。子构件可被添加到网格中的指定单元格。
StaticBoxSizer
StaticBoxSizer把一个盒子sizer放到静态框。它提供了围绕框边界以及顶部标签。
7、多线程
在上面介绍中,我们都是在主线程操作,实际应用中,多线程是必要的:
- 不用多线程可能会导致图形界面卡死
- 多线程可以使程序以更高效率运行
- 多线程可以让程序做更多的事
简单用法:
import threading
def ThreadBATchUpLoad(self,arg):
print("thread run")
def Onclick(self,event):
t1 = threading.Thread(target=self.ThreadBatchUpLoad, args=(event,))
t1.start()
8、题外话
基本熟悉了wxPython了用法,但是开发的方便程度和界面的美观度,都是不满意的。从知乎、博客等各大渠道收集的信息来看,Python下如果要做界面展示和提供给普通用户使用,最好的方案是
Web前端+Python后端 = Python GUI应用
这才是最能发挥Python优势,效果也最好的方案。
9、参考网址
- wxPython官网
- wxFormBuilder工具
- wxPython语法教程 -
相关阅读
一、python gui(图形化)常用模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建,(也叫Tk接口)是Tk图形用户界面工具包标准