写在前面的话
对于wxpython的学习我推荐三个阶段,第一阶段是完全无基础学习阶段,建议使用 UI 软件进行布局,第二阶段是深化阶段,对wxpython有了一定的基础,可以尝试纯代码布局,加深印象,第三阶段是对wxpython已经相对熟悉了,可以开发项目了,建议还是使用wxpython进行布局设计。
目录
1.准备软件或包
UI软件 :wxFormBuilder 进行UI设计,也可以直接用代码布局,但是,代码布局需要调试的时间更久
wxpython : wx 的python模块,使用 pip install wxpython即可安装,推荐安装在虚拟环境中
2.最基本的窗口
# 导入包
import wx
class MyFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,parent,id=wx.ID_ANY,title='APP名称',pos=wx.DefaultPosition,size=(800,600),style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) # 必须调用wx.Frame的初始化方法
class MainAPP(wx.App):
def OnInit(self):
self.Frame = MainFrame(None)
self.Frame.Show()
return True
if __name__ == "__main__":
app = MainAPP()
app.MainLoop()
3.模块分离
我们的窗口应用会用很多逻辑要实现,如果都写在一个文件中,不利于维护,我们可以将代码进行分离
将窗口布局 和 事件函数 以及 事件绑定 放在UI
将数据库操作 以及 序列化的操作 放在model
…
4.UI 布局
4.1 纯代码布局
# ui.py
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY,
title='APP名称', pos=wx.DefaultPosition,
size=(800, 600),
style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
# ui布局
# 这里可以放置各种控件
# 这里的panel也可以理解为一个窗口,但是它的父窗口是主窗口
panel = wx.PyPanel(self, wx.ID_ANY, style=wx.EXPAND)
vbox = wx.BoxSizer(wx.VERTICAL) # 垂直布局
hbox = wx.BoxSizer(wx.HORIZONTAL) # 水平布局
# 静态标签
self.static_txt1 = wx.StaticText(panel, wx.ID_ANY, label=u'名称', pos=(
50, 0), size=(150, -1), style=wx.CENTER)
self.text = wx.TextCtrl(
panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(150, -1), 0)
# 参数:第一个参数是指定父级窗口,第二个参数是 id,可以自己指定也可以让程序自动设置,第三个参数是显示的名称,
# 第四个参数数位置,第五个参数是大小,都是按元组的方式传入,也可忽略按默认值,第六个参数是样式
# 将静态标签放到hbox布局中
hbox.Add(self.static_txt1, proportion=1,flag=wx.ALL | wx.FIXED_MINSIZE, border=5)
hbox.Add(self.text, proportion=1, flag=wx.ALL | wx.FIXED_MINSIZE, border=5)
# 参数详解 第一个参数是添加的 标签,第二个参数是权重,第三个参数是标志(对齐|边框|尺寸调整),第四个参数是边框的大小
# 第三个参数之对齐,wx.ALIGN_CENTER,wx.ALIGN_BOTTOM 等等
# 第三个参数之边框,wx.TOP,wx.ALL 等等
# 第三个参数之尺寸 wx.EXPAND ,wx.FIXED_MINSIZE
# 将hbox放到vbox布局中
vbox.Add(hbox, 1, wx.ALL | wx.EXPAND, 3)
# 将vbox布局放到panel中
panel.SetSizer(vbox)
class MainApp(wx.App):
def OnInit(self):
self.Frame = MyFrame(None)
self.Frame.Show()
return True
if __name__ == '__main__':
app = MainApp()
app.MainLoop()
-
可以直接将控件放在顶级窗口上,也可放在次级窗口
-
# 控件放在顶级窗口 self.text = wx.TextCtrl( self, # 如果是顶级窗口,此时要写self wx.ID_ANY, # id,默认填 wx.ID_ANY wx.EmptyString, # 控件显示名称或内容 u'' wx.DefaultPosition, # 位置,非必填项 (x,y) wx.Size(150, -1), # 大小,非必填项 (宽,高) 高一般填 -1 0) # 样式,非必填项 # 控件放在次级窗口 # 首先要设置次级窗口 panel = wx.PyPanel(self, wx.ID_ANY, style=wx.EXPAND) self.text = wx.TextCtrl( panel, # 如果是次级窗口,此时要写次级窗口 wx.ID_ANY, # id,默认填 wx.ID_ANY wx.EmptyString, # 控件显示名称或内容 u'' wx.DefaultPosition, # 位置,非必填项 (x,y) wx.Size(150, -1), # 大小,非必填项 (宽,高) 高一般填 -1 0) # 样式,非必填项
-
-
可以使用布局工具进行设计
-
控件可以放在布局控件中,布局控件也可以放在布局控件中,即布局标签可以嵌套
-
vbox = wx.BoxSizer(wx.VERTICAL) # 垂直布局 hbox = wx.BoxSizer(wx.HORIZONTAL) # 水平布局 # hbox.Add(控件,权限,标志,边框宽度) # 控件的权限作用是,如果添加多个标签,多个标签的占用空间按权限大小分配 # 标志可以有三部分组成,每部分之间使用 | 连接 # 标志分为 对齐,边框,尺寸 # 布局控件之间的嵌套也是一样的
-
-
4.2 UI软件
使用wxFormBuilder设计是,可以根据布局直接生成代码