写在前面的话
对于wxpython的学习我推荐三个阶段,第一阶段是完全无基础学习阶段,建议使用 UI 软件进行布局,第二阶段是深化阶段,对wxpython有了一定的基础,可以尝试纯代码布局,加深印象,第三阶段是对wxpython已经相对熟悉了,可以开发项目了,建议还是使用wxpython进行布局设计。
目录
- 1.准备软件或包
- 2.最基本的窗口
- 3.模块分离
- 4.UI 布局
- 4.1 纯代码布局
- 4.2 UI软件
- 4.3 控件详解
- 4.3.1 菜单、状态栏、工具栏
- 4.3.2 Common 常用控件/Additional 附加控件
- 4.3.3 Dataview 控件
- 4.3.4 **TreeCtrl**
- 4.3.5 容器控件 containers
- 4.3.6 布局控件 Layout
- 4.3.7 AUI
- 5 事件
- 6.其他窗口
- 5 事件
- 6.其他窗口
1.准备软件或包
UI软件 :wxFormBuilder 进行UI设计,也可以直接用代码布局,但是,代码布局需要调试的时间更久
wxpython : wx 的python模块,使用 pip install wxpython即可安装,推荐安装在虚拟环境中
2.最基本的窗口
# 导入包
import wxclass 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 Trueif __name__ == "__main__":app = MainAPP()app.MainLoop()
3.模块分离
我们的窗口应用会用很多逻辑要实现,如果都写在一个文件中,不利于维护,我们可以将代码进行分离
将窗口布局 和 事件函数 以及 事件绑定 放在UI
将数据库操作 以及 序列化的操作 放在model
…
4.UI 布局
4.1 纯代码布局
# ui.pyclass 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 Trueif __name__ == '__main__':app = MainApp()app.MainLoop()
-
可以直接将控件放在顶级窗口上,也可放在次级窗口
-
# 控件放在顶级窗口self.text = wx.TextCtrl(self, # 如果是顶级窗口,此时要写selfwx.ID_ANY, # id,默认填 wx.ID_ANYwx.EmptyString, # 控件显示名称或内容 u''wx.DefaultPosition, # 位置,非必填项 (x,y)wx.Size(150, -1), # 大小,非必填项 (宽,高) 高一般填 -10) # 样式,非必填项# 控件放在次级窗口# 首先要设置次级窗口panel = wx.PyPanel(self, wx.ID_ANY, style=wx.EXPAND)self.text = wx.TextCtrl(panel, # 如果是次级窗口,此时要写次级窗口wx.ID_ANY, # id,默认填 wx.ID_ANYwx.EmptyString, # 控件显示名称或内容 u''wx.DefaultPosition, # 位置,非必填项 (x,y)wx.Size(150, -1), # 大小,非必填项 (宽,高) 高一般填 -10) # 样式,非必填项
-
-
可以使用布局工具进行设计
-
控件可以放在布局控件中,布局控件也可以放在布局控件中,即布局标签可以嵌套
-
vbox = wx.BoxSizer(wx.VERTICAL) # 垂直布局hbox = wx.BoxSizer(wx.HORIZONTAL) # 水平布局# hbox.Add(控件,权限,标志,边框宽度)# 控件的权限作用是,如果添加多个标签,多个标签的占用空间按权限大小分配# 标志可以有三部分组成,每部分之间使用 | 连接# 标志分为 对齐,边框,尺寸# 布局控件之间的嵌套也是一样的
-
-
4.2 UI软件
使用wxFormBuilder设计是,可以根据布局直接生成代码
4.3 控件详解
4.3.1 菜单、状态栏、工具栏
- UI
-
代码
-
class MyFrame2 ( wx.Frame ):def __init__( self, parent ):wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 600,400 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )# 菜单栏self.m_menubar1 = wx.MenuBar( 0 )# 菜单self.m_menu3 = wx.Menu()# 菜单选项self.m_menuItem7 = wx.MenuItem(self.m_menu3, wx.ID_ANY, u"MyMenuItem", wx.EmptyString, wx.ITEM_NORMAL )self.m_menu3.Append( self.m_menuItem7)# 菜单选项self.m_menuItem8 = wx.MenuItem(self.m_menu3, wx.ID_ANY, u"MyMenuItem", wx.EmptyString, wx.ITEM_NORMAL) # 菜单选项 第一个参数是 菜单控件self.m_menu3.Append(self.m_menuItem8)# 菜单选项分隔线self.m_menu3.AppendSeparator()# 子菜单self.m_menu6 = wx.Menu()# 子菜单选项self.m_menuItem9 = wx.MenuItem( self.m_menu6, wx.ID_ANY, u"MyMenuItem", wx.EmptyString, wx.ITEM_NORMAL )self.m_menu6.Append( self.m_menuItem9 )# 子菜单选项self.m_menuItem10 = wx.MenuItem( self.m_menu6, wx.ID_ANY, u"MyMenuItem", wx.EmptyString, wx.ITEM_NORMAL )self.m_menu6.Append( self.m_menuItem10 )# 子菜单分隔线self.m_menu6.AppendSeparator()# 子菜单选项self.m_menuItem11 = wx.MenuItem( self.m_menu6, wx.ID_ANY, u"MyMenuItem", wx.EmptyString, wx.ITEM_NORMAL )self.m_menu6.Append( self.m_menuItem11 )# 子菜单选项self.m_menuItem12 = wx.MenuItem( self.m_menu6, wx.ID_ANY, u"MyMenuItem", wx.EmptyString, wx.ITEM_NORMAL )self.m_menu6.Append( self.m_menuItem12 )# 菜单选项中添加子菜单self.m_menu3.AppendSubMenu( self.m_menu6, u"MyMenu" )# 菜单栏中添加菜单self.m_menubar1.Append( self.m_menu3, u"MyMenu" )# 将菜单栏添加至窗口self.SetMenuBar( self.m_menubar1 )# 工具栏self.m_toolBar1 = self.CreateToolBar( wx.TB_HORIZONTAL, wx.ID_ANY )# 工具按钮self.m_tool1 = self.m_toolBar1.AddLabelTool( wx.ID_ANY, u"tool", wx.NullBitmap, wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None )self.m_tool2 = self.m_toolBar1.AddLabelTool( wx.ID_ANY, u"tool", wx.NullBitmap, wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None )# 工具按钮分隔线self.m_toolBar1.AddSeparator()self.m_tool3 = self.m_toolBar1.AddLabelTool( wx.ID_ANY, u"tool", wx.NullBitmap, wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None )# 工具栏设置self.m_toolBar1.Realize()# 状态栏self.m_statusBar2 = self.CreateStatusBar( 1, wx.STB_SIZEGRIP, wx.ID_ANY )self.Centre( wx.BOTH )
-
菜单
-
# 菜单栏self.m_menubar1 = wx.MenuBar(0)# 菜单self.m_menu3 = wx.Menu()# 菜单选项self.m_menuItem7 = wx.MenuItem(self.m_menu3, # 菜单的父级wx.ID_ANY, # IDu"MyMenuItem", # 菜单选项名称wx.EmptyString, # 快捷键wx.ITEM_NORMAL) # 样式self.m_menu3.Append( self.m_menuItem7) # 将选项添加单菜单中# 子菜单self.m_menu4 = wx.Menu() # 子菜单和菜单一样# 子菜单选项self.m_menuItem8 = wx.MenuItem(self.m_menu4, # 菜单选项的父级wx.ID_ANY, # IDu"MyMenuItem", # 菜单选项名称wx.EmptyString, # 快捷键wx.ITEM_NORMAL) # 样式self.m_menu3.AppendSubMenu( self.m_menu4, u"MyMenu" ) # 添加子菜单# 菜单分隔线self.m_menu3.AppendSeparator()# 最后要将菜单栏设置为刚刚创建的self.SetMenuBar(self.m_menubar1)
-
-
工具栏
-
# 工具栏self.m_toolBar1 = self.CreateToolBar(wx.TB_HORIZONTAL, wx.ID_ANY)# 工具按钮self.m_tool1 = self.m_toolBar1.AddLabelTool( wx.ID_ANY, # IDu"tool", # 显示名称wx.NullBitmap, # 未点击的图标图案wx.NullBitmap, # 点击后的图标图案wx.ITEM_NORMAL, # 样式,可选多选或单选wx.EmptyString, # 工具介绍wx.EmptyString, # 状态栏显示内容None )# 工具按钮分隔线self.m_toolBar1.AddSeparator()# 工具栏设置self.m_toolBar1.Realize()# 工具栏上也可以放静态标签 StaticText,按钮 Button 和 文本框 TextCtrl# self.m_toolBar1.AddControl(控件)
-
-
状态栏
-
self.m_statusBar2 = self.CreateStatusBar(1, wx.STB_SIZEGRIP, wx.ID_ANY)# 设置前景色self.m_statusBar2.SetForegroundColour(wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE))# 设置背景色self.m_statusBar2.SetBackgroundColour(wx.SystemSettings.GetColour( wx.SYS_COLOUR_SCROLLBAR))
-
-
4.3.2 Common 常用控件/Additional 附加控件
- 常用控件
- 扩展控件
常用空间的创建都比较简单,大部分都是只需要前三个参数
# 按钮
self.m_button1 = wx.Button(self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0)
# 图片按钮
self.m_bpButton1 = wx.BitmapButton(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, wx.BU_AUTODRAW | 0)# 静态标签
self.m_staticText1 = wx.StaticText(self, wx.ID_ANY, u"MyLabel", wx.DefaultPosition, wx.DefaultSize, 0)# 输入框
self.m_textCtrl1 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
# 图片显示控件
self.m_bitmap1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap('图片路径,仅支持BMP格式', wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.DefaultSize, 0)
fgSizer1.Add(self.m_bitmap1, 0, wx.ALL, 5)
# 动画显示空间
self.m_animCtrl1 = wx.adv.AnimationCtrl(self, wx.ID_ANY, wx.adv.NullAnimation, wx.DefaultPosition, wx.DefaultSize, wx.adv.AC_DEFAULT_STYLE)# 列表选择框
m_listBox1Choices = [u"1爱仕达", u"2滚滚滚", wx.EmptyString
self.m_listBox1= wx.ListBox(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_listBox1Choices, 0)self.m_listCtrl1= wx.ListCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_LIST)
# 单选框选择控件
m_radioBox1Choices= [u"Radio Button", u"2"]
self.m_radioBox1= wx.RadioBox(self, wx.ID_ANY, u"wxRadioBox", wx.DefaultPosition, wx.DefaultSize, m_radioBox1Choices, 1, wx.RA_SPECIFY_COLS)
self.m_radioBox1.SetSelection(1)
# 分割线
self.m_staticline2= wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
self.m_staticline2.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT))
# 下拉选择框
m_comboBox1Choices = []
self.m_comboBox1= wx.ComboBox(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, m_comboBox1Choices, 0)
# 下拉图片选择框
self.m_bcomboBox3= wx.combo.BitmapComboBox(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, "", wx.CB_SORT)
# 下拉框
m_choice1Choices = []
self.m_choice1= wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice1Choices, 0)
self.m_choice1.SetSelection(0)# 复选框
self.m_checkBox1= wx.CheckBox(self, wx.ID_ANY, u"Check Me!", wx.DefaultPosition, wx.DefaultSize, 0)
# 单个单选框
self.m_radioBtn1= wx.RadioButton(self, wx.ID_ANY, u"RadioBtn", wx.DefaultPosition, wx.DefaultSize, 0)# 滑动条
self.m_slider1= wx.Slider(self, wx.ID_ANY, 30, 0, 100, wx.DefaultPosition, wx.DefaultSize, wx.SL_HORIZONTAL)# 进度条
self.m_gauge1= wx.Gauge(self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL)
self.m_gauge1.SetValue(30)# 切换按钮
self.m_toggleBtn1 = wx.ToggleButton(self, wx.ID_ANY, u"Toggle me!", wx.DefaultPosition, wx.DefaultSize, 0)
# 搜索框
self.m_searchCtrl1 = wx.SearchCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
self.m_searchCtrl1.ShowSearchButton(True)
self.m_searchCtrl1.ShowCancelButton(False)
# 颜色选择框
self.m_colourPicker1 = wx.ColourPickerCtrl(self, wx.ID_ANY, wx.BLACK, wx.DefaultPosition, wx.DefaultSize, wx.CLRP_DEFAULT_STYLE)
# 字体选择框
self.m_fontPicker1 = wx.FontPickerCtrl(self, wx.ID_ANY, wx.NullFont, wx.DefaultPosition, wx.DefaultSize, wx.FNTP_DEFAULT_STYLE)
self.m_fontPicker1.SetMaxPointSize(100)
# 文件选择框
self.m_filePicker1 = wx.FilePickerCtrl(self, wx.ID_ANY, wx.EmptyString, u"Select a file", u"*.*", wx.DefaultPosition, wx.DefaultSize, wx.FLP_DEFAULT_STYLE)
# 路径选择框
self.m_dirPicker1 = wx.DirPickerCtrl(self, wx.ID_ANY, wx.EmptyString, u"Select a folder", wx.DefaultPosition, wx.DefaultSize, wx.DIRP_DEFAULT_STYLE)
# 日期选择框
self.m_datePicker1 = wx.adv.DatePickerCtrl(self, wx.ID_ANY, wx.DefaultDateTime, wx.DefaultPosition, wx.DefaultSize, wx.adv.DP_DEFAULT)
# 时间选择框
self.m_timePicker1 = wx.TimePickerCtrl(self, wx.ID_ANY, wx.DefaultDateTime, wx.DefaultPosition, wx.DefaultSize, wx.TP_DEFAULT)
# 拖动条
self.m_scrollBar1 = wx.ScrollBar(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SB_HORIZONTAL)
# 整数调整输入框
self.m_spinCtrl1 = wx.SpinCtrl(self, wx.ID_ANY, wx.EmptyString,wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 10, 6)
# 小数调整输入框
self.m_spinCtrlDouble1 = wx.SpinCtrlDouble(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 100, 7.300000, 1)
self.m_spinCtrlDouble1.SetDigits(0)
# 超链接
self.m_hyperlink1 = wx.adv.HyperlinkCtrl(self, wx.ID_ANY, u"wxFB Website", u"http://www.wxformbuilder.org", wx.DefaultPosition, wx.DefaultSize, wx.adv.HL_DEFAULT_STYLE)
# 系统磁盘
self.m_genericDirCtrl1 = wx.GenericDirCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.DIRCTRL_3D_INTERNAL | wx.SUNKEN_BORDER, wx.EmptyString, 0)self.m_genericDirCtrl1.ShowHidden(False)
4.3.3 Dataview 控件
- 表格控件
- wxgrid 表格,可编辑的
- wxtreectrl 树状
- DataViewListCtrl DataViewCtrl 的子类
- PropertyGrid
- DataViewListCtrl 中只能放置 dataViewListColumn
-
DataViewListCtrl
-
创建
-
dataview = wx.dataview.DataViewListCtrl(parent, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.dataview.DV_ROW_LINES)
-
-
添加列
-
文字列 会显示行内容
-
dataview.AppendTextColumn(self, label, mode=DATAVIEW_CELL_INERT, width=-1, align=ALIGN_LEFT, flags=DATAVIEW_COL_RESIZABLE)
-
label 显示标签
-
mode 列属性或模式
-
width 宽度,默认是-1,自动
-
align 对齐方式
-
flags 标志 一般是 是否可变,是否填满,边框
-
-
隐藏文本列 会显示这一列的标题,但是内容会被遮盖不显示
-
AppendProgressColumn(self, label, mode=DATAVIEW_CELL_INERT, width=-1, align=ALIGN_LEFT, flags=DATAVIEW_COL_RESIZABLE)
-
-
框选列 以复选框的形式显示,值 为 True 或者 False
-
AppendToggleColumn(self, label, mode=DATAVIEW_CELL_ACTIVATABLE, width=-1, align=ALIGN_LEFT, flags=DATAVIEW_COL_RESIZABLE)
-
-
列属性 mode 参数的选项及说明
- DATAVIEW_CELL_INERT 该单元仅显示信息,不能以任何方式进行操纵或以其他方式与之交互。
- DATAVIEW_CELL_ACTIVATABLE 通过单击它或使用键盘来激活该单元格,仅在 AppendToggleColumn 中起作用
- DATAVIEW_CELL_EDITABLE 可编辑
-
-
添加元素使用 AppendItem(values,data)
-
AppendItem(values,data) 之前要先设置 Column
- values 是必填项,values是显示内容,
- data 非必填,一般不用管
-
values 是向量,元组或者列表 数量和Column的数量要一致
事件绑定
-
事件都是绑定到 DataViewListCtrl 对象上的
-
绑定事件中,获取 DataViewCtrl 直接使用 EventObject 即可,点击Column头部是event.GetDataViewColumn() 获取当前列对象,使用 GetValue(row:int) 获取指定行的数据
-
# 获取dataview dataview = event.EventObject # 当前列 col = event.GetDataViewColumn() # 当前列的列索引 col_idx = col.ModelColumn #或者 col_idx = event.Column # 当前行 item = event.Item # 当前行索引 row_idx = dataview.GetSelectedRow() row_idx = dataview.ItemToRow(item) # 指定单元格的值 dataview.GetValue(row_idx,col_idx) # 指定单元格赋值 dataview.SetValue(value,row_idx,col_idx)
-
4.3.4 TreeCtrl
TreeCtrl 虽然在 wxformbuilder 中放在了data 这一区域,但是它 和 dataviewlistctrl 并不一样,它们继承自不同的父类,但是都是常用的控件
-
TreeCtrl
-
创建
-
tree = TreeCtrl(parent, id=ID_ANY, pos=DefaultPosition,size=DefaultSize, style=DV_NO_HEADER|DV_ROW_LINES,validator=DefaultValidator)
-
除了parent,其他都是非必填
-
-
添加根
-
rootitem = tree.AddRoot(self,text,image = -1,selImage = -1,data = None )
-
参数
- text 根节点显示文本 必传参数
- image 和 selimage 是选中和未选中时的显示图像
- data 是 该节点的 隐藏 值
-
-
添加子节点
-
AppendItem(self,parent,text,image = -1,selImage = -1,data = None )
-
参数
- parent 父节点
- text 当前子节点的显示文字
- data 当前子节点的data
-
-
事件
-
TreeCtrl对象
-
tree = event.EventObject
-
-
当前节点
-
event.Itemtree.GetSelection() # 方法tree.Selection # 只读属性
-
-
当前节点的显示内容
-
tree.GetItemText(event.Item)
-
-
当前节点的data属性
-
tree.GetItemData(event.Item)
-
-
当前节点的父节点
-
tree.GetItemParent(event.Item)
-
-
当前节点的兄弟节点
-
tree.GetNextSibling(event.Item)# 后一个兄弟节点tree.GetPrevSibling# 前一个兄弟节点
-
-
当前节点的子节点
-
tree.GetFirstChild(event.Item) # 第一个子元素tree.GetLastChild(event.Item) # 最后一个子元素
-
-
-
4.3.5 容器控件 containers
- 可以被嵌套的 控件
- wxpanel 最普通的容器
- CollapsiblePanel 可收放隐藏的容器
- ScrolledWindow 带滚动条的容器
- 可以做父控件的 控件,布局容器控件
- SplitterWindow # 将窗口一分为二,里面只能放两个容器,必须有容器
- Notebook # 带选择标签的容器,可以放多个普通控件
- AuiNotebook # aui下的容器,与Notebook 相似
- Listbook # 列表容器,有一个列表供选择
- Choicebook # 选择容器,在容器顶部是个选择框
- Simplebook # 最简单的父级容器
- 容器控件中必须有布局控件才能放置标准控件和扩展控件
- 布局容器空间中必须放置普通容器控件才能放置布局控件
4.3.6 布局控件 Layout
- BoxSizer 最常用的布局控件,可设置竖向和横向布局
- StaticBoxSizer 带标签的布局控件
- GridBagSizer 网格状的布局控件,可以指定行间距,列间距
- FlexGridSizer 可以指定行数,列数
布局控件可以随意嵌套
4.3.7 AUI
- aui是特殊的布局模式,可以让控件浮动
- 要使用aui,需要在Form中设置aui_managed
- aui 的布局不建议直接敲代码,相对复杂,直接使用UI设计
- caption_visible 如果不勾选,则caption 标题不可见,标题名称,最大最小化,图钉,关闭按钮都不可见
- center_pane,default_pane,toolbar_pane 的区别,center_pane 是中心区域标志,default_pane是普通区域,toolbar_pane 是工具区域,其中 toolbar_pane 只能浮动显示,不能停靠,即便设置了可以停靠也是浮动的,default_pane 就是可以停靠,可以隐藏的面板,center_pane是中心区域
- moveable 是否可移动
- resize 可选项 fixed 固定大小 resizeable 可变换大小
- size,设置默认大小,最优大小,最大最小大小
- dock 可选项 dock 停靠 float 浮动,dock就是指定位置不能变换,float可以随意变换位置
- dock_fixed 停靠是固定大小,即在停靠时的鼠标位置决定了停靠后面板的大小
- floatable 可浮动的
- dockable 可以停靠的位置
- docking 当前停靠的位置
推荐面板布局设置
AUI窗口下 先添加容器空间,容器控件中添加布局空间,布局控件中添加基本的控件
-
中心区域 设置show,center_pane,dock 设置dock,docking 设置center
- 这样设置的中心区域会根据普通面板停靠的位置自动更改中心区域的大小,且会布满整个窗口
- 这样设置的中心区域会根据普通面板停靠的位置自动更改中心区域的大小,且会布满整个窗口
-
普通的可停靠的工具栏 , 设置 caption_visible ,caption,以及所有的按钮,show,default_pane,moveable,resize,dock设置为float,floatable,以及停靠位置
- 标题按钮和停靠位置可以根据自己的需要选择
- caption_visible,show,default_pane,moveable,floatable必须勾选,
-
工具面板设置,toolbar_pane 必选,movealble 必选,其他的选不选都不起作用,工具面板要设置大小,否则默认大小显示不全按钮
-
AUI模式下,菜单栏,工具栏,状态栏正常设置
-
中心区域设置一个,浮动区域根据需要设置,当在区域中放置控件时,需要先放置layout布局控件,然后在布局控件中放置其他的控件
5 事件
-
方式1
-
self.Bind(事件,方法,控件)# 通过事件获取当前调用的对象,通过对象判断
-
-
方式2
-
控件.Bind(事件,方法)
-
事件方法
def ecentfunc( self, event ):event.Skip()
事件方法接收一个 event 参数,时间对象可以在event中获取到
在 wxFormBuilder 软件中,可以定义事件的绑定,但是需要重写事件方法
6.其他窗口
除wizard外其余的窗口都十分相似
wizard 需要添加wizardpagesimple,然后再放置其他控件
- AUI模式下,菜单栏,工具栏,状态栏正常设置
- 中心区域设置一个,浮动区域根据需要设置,当在区域中放置控件时,需要先放置layout布局控件,然后在布局控件中放置其他的控件
5 事件
-
方式1
-
self.Bind(事件,方法,控件)# 通过事件获取当前调用的对象,通过对象判断
-
-
方式2
-
控件.Bind(事件,方法)
-
事件方法
def ecentfunc( self, event ):event.Skip()
事件方法接收一个 event 参数,时间对象可以在event中获取到
在 wxFormBuilder 软件中,可以定义事件的绑定,但是需要重写事件方法
6.其他窗口
除wizard外其余的窗口都十分相似
wizard 需要添加wizardpagesimple,然后再放置其他控件