当前位置: 首页 > news >正文

wxPython 实践(五)高级控件

wxPython 实践(一)概述
wxPython 实践(二)基础控件
wxPython 实践(三)页面布局
wxPython 实践(四)事件响应
wxPython 实践(五)高级控件

文章目录

  • 1. wx.ComboCtrl 结合文本框和下拉列表
  • 2. Spin 控件族
    • 2.1. wx.SpinButton
    • 2.2. wx.SpinCtrl
    • 2.3. wx.SpinCtrlDoule
    • 2.4. 实例
  • 3. List 控件族
    • 3.1. wx.ListBox(列表框)
    • 3.2. wx.CheckListBox(复选列表框)
    • 3.3. wx.ListCtrl()
    • 3.4. wx.ListView()
  • 4. wx.TreeCtrl(树状控件)
    • 4.1. wx.TreeCtrl
    • 4.2. wx.gizmos.TreeListCtrl
  • 5. Book 控件族
    • 5.1. 准备工作三个 Book
    • 5.2. wx.Notebook(选项卡)
    • 5.3. wx.Choicebook
    • 5.4. wx.Listbook
    • 5.5. wx.Toolbook
    • 5.6. wx.Treebook
    • 5.7. wx.aui.AuiNotebook
    • 5.8. wx.lib.agw.flatnotebook.FlatNotebook
    • 5.9. wx.lib.agw.aui.AuiNotebook
  • 6. 菜单栏&工具栏&状态栏
    • 6.1. wx.MenuBar
    • 6.2. wx.Toolbar
    • 6.3. CreateStatusBar
  • 7. wx.SplitterWindow
  • 8. wx.html.HtmlWindow
  • 9. AGW 扩展包

官网:
https://wxpython.org/Phoenix/docs/html/wx.1moduleindex.html

1. wx.ComboCtrl 结合文本框和下拉列表

https://wxpython.org/Phoenix/docs/html/wx.ComboCtrl.html
https://cloud.tencent.com/developer/ask/sof/112964185

  1. ComboCtrl 需要用到 ComboPopup
  2. ComboCtrl 需要用 SetPopupControl() 指定关联的 ComboPopup
  3. ComboPopup 用的 GetControl() 必须实现
  4. ComboPopup 中文档说明的其他必须实现的方法
  5. 需要仔细阅读 ComboCtrl 与 ComboPopup 中方法的说明

原文链接:https://blog.csdn.net/leejearl/article/details/7436143

2. Spin 控件族

2.1. wx.SpinButton

wx.SpinButton 有两个上下(或左右)箭头按钮。通常位于文本控件旁边,用于增减值。
窗口样式:

  • wx.SP_HORIZONTAL:指定水平旋转按钮。
  • wx.SP_VERTICAL:指定垂直旋转按钮。
  • wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
  • wx.SP_WRAP:当数值在最小值和最大值处换行。

可发出事件:

  • EVT_SPIN:当按下箭头改变旋转按钮值时生成。
  • EVT_SPIN_UP:当按左/上箭头改变旋转按钮值时生成。
  • EVT_SPIN_DOWN:当按下右/下箭头改变旋转按钮值时生成。

常用方法:

  • GetIncrement(self):返回spin控件的增量值。
  • GetMax(self):返回最大允许值。
  • GetMin(self):返回最小允许值。
  • GetRange(self):返回允许范围。
  • GetValue(self):返回spin按钮的当前值。
  • SetIncrement(self, value):设置spin控件的增量值。
  • SetMax(self, maxVal):设置最大允许值。
  • SetMin(self, minVal):设置最小允许值。
  • SetRange(self, min, max):设置允许范围。
  • SetValue(self, value):设置spin按钮的当前值。

2.2. wx.SpinCtrl

wx.SpinCtrl 是 wx.TextCtrl 和 wx.SpinButton 控件的组合。
当用户点击 wx.SpinButton 的向上或者向下按钮的时候,wx.TextCtrl 中的值将会随之变化。用户也可以直接在 wx.TextCtrl 中输入想要的值。
窗口样式:

  • wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
  • wx.SP_WRAP:当数值在最小值和最大值处换行。
  • wx.TE_PROCESS_ENTER:指示控件应生成wx.EVT_TEXT_ENTER事件。使用这种样式将防止用户在MSW下使用Enter键进行对话框导航(例如激活对话框中的默认按钮)。
  • wx.ALIGN_LEFT:与wx.TextCtrl的wx.TE_LEFT相同:文本向左对齐(这是默认值)。
  • wx.ALIGN_CENTRE_HORIZONTAL:与wx.TextCtrl的wx.TE_CENTRE相同:文本居中。
  • wx.ALIGN_RIGHT:与 wx.TextCtrl的wx.TE_RIGHT相同:文本是右对齐的。

可发出事件:

  • EVT_SPINCTRL:处理wx.EVT_SPINCTRL事件,该事件在spin控件的数值更新时生成。

常用方法:

  • GetBase(self):返回当前使用的进制基数,默认为10。
  • GetIncrement(self):返回spin控件的增量值。
  • GetMax(self):返回最大允许值。
  • GetMin(self):返回最小允许值。
  • GetRange(self):返回允许范围。
  • GetTextValue(self):返回控件的文本输入部分中的文本。
  • GetValue(self):返回spin控件的当前值。
  • SetBase(self, base):设置当前使用的进制基数。
  • SetIncrement(self, value):设置spin控件的增量值。
  • SetMax(self, maxVal):设置最大允许值。
  • SetMin(self, minVal):设置最小允许值。
  • SetRange(self, minVal, maxVal):设置允许范围。
  • SetSelection(self, from_, to_):选择控件文本部分中从(包括)到(不包括)位置之间的文本。
  • SetValue (self, text):设置spin控件的当前值。
  • SetValue (self, value):设置spin控件的当前值。

2.3. wx.SpinCtrlDoule

窗口样式:

  • wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
  • wx.SP_WRAP:当数值在最小值和最大值处换行。

可发出的事件:

  • EVT_SPINCTRLDOUBLE:当spin控件的数值发生变化 (即单击向上/向下旋转按钮时,按下ENTER时,或控件失去焦点且新值与上次不同时) 时生成。

常用方法:

  • GetDigits(self):获取spin控件值的精度。
  • GetIncrement(self):返回spin控件的增量值。
  • GetMax(self):返回最大允许值。
  • GetMin(self):返回最小允许值。
  • GetRange(self):返回允许范围。
  • GetTextValue(self):返回控件的文本输入部分中的文本。
  • GetValue(self):返回spin控件的当前值。
  • SetDigits(self, digits):设置spin控件值的精度。
  • SetIncrement(self, value):设置spin控件的增量值。
  • SetMax(self, maxVal):设置最大允许值。
  • SetMin(self, minVal):设置最小允许值。
  • SetRange(self, minVal, maxVal):设置允许范围。
  • SetValue (self, text):设置spin控件的当前值。
  • SetValue (self, value):设置spin控件的当前值。

2.4. 实例

import wxclass MyWin(wx.Frame):def __init__(self, parent, title):super().__init__(parent, title = title) self.SetTitle(title=title)panel = wx.Panel(self)# 主布局 5行5列sizer = wx.GridBagSizer(6, 5)# # 标题# # 0行0列 占1行2列# st1 = wx.StaticText(panel, label="将华氏温度转换为摄氏温度")# sizer.Add(st1, pos=(0, 0), span=(1, 2), flag=wx.ALL, border=5)# SpinCtrl# 1行0列st2 = wx.StaticText(panel, label = "华氏度:")sizer.Add(st2, pos=(1, 0), flag=wx.ALL|wx.ALIGN_CENTER, border=5)# 1行1列self.sc = wx.SpinCtrl(panel, value="0", size=(80, 25))self.sc.SetRange(-459, 1000)sizer.Add(self.sc, pos=(1, 1), flag=wx.ALIGN_CENTER)# 回显# 2行0列st3 = wx.StaticText(panel, label="摄氏度:")sizer.Add(st3, pos=(2, 0), flag=wx.ALL|wx.ALIGN_RIGHT, border=5)# 2行1列self.celsius = wx.StaticText(panel, label="")sizer.Add(self.celsius, pos=(2, 1), flag=wx.ALL, border=5)# SpinCtrlDouble# 3行0列st2d = wx.StaticText(panel, label = "华氏度:")sizer.Add(st2d, pos=(3, 0), flag=wx.ALL|wx.ALIGN_CENTER, border=5)# 3行1列self.scd = wx.SpinCtrlDouble(panel, value="0", size=(80, 25))self.scd.SetRange(-459, 1000)# self.scd.SetDigits(1)self.scd.SetIncrement(0.5)sizer.Add(self.scd, pos=(3, 1), flag=wx.ALIGN_CENTER)# 回显# 4行0列st3d = wx.StaticText(panel, label="摄氏度:")sizer.Add(st3d, pos=(4, 0), flag=wx.ALL|wx.ALIGN_RIGHT, border=5)# 4行1列self.celsiusd = wx.StaticText(panel, label="")sizer.Add(self.celsiusd, pos=(4, 1), flag=wx.ALL, border=5)# 5行1列computeButton = wx.Button(panel, label="计算")computeButton.SetFocus()sizer.Add(computeButton, pos=(5, 1), flag=wx.ALIGN_RIGHT|wx.TOP, border=5)# 5行2列closeButton = wx.Button(panel, label="关闭")sizer.Add(closeButton, pos=(5, 2), flag=wx.ALIGN_LEFT|wx.TOP, border=5)computeButton.Bind(wx.EVT_BUTTON, self.OnCompute)closeButton.Bind(wx.EVT_BUTTON, self.OnClose)panel.SetSizer(sizer)self.Centre()def OnClose(self, e):self.Close(True)def OnCompute(self, e):fahr = self.sc.GetValue()cels = round((fahr - 32) * 5 / 9.0, 2)self.celsius.SetLabel(str(cels))fahrd = self.scd.GetValue()celsd = round((fahrd - 32) * 5 / 9.0, 2)self.celsiusd.SetLabel(str(celsd))if __name__ == '__main__':app = wx.App()window = MyWin(None, title="SpinCtrl")window.Show()app.MainLoop()

在这里插入图片描述

3. List 控件族

一个 wx.ListBox 部件呈现一个可垂直滚动的字符串列表。默认情况下,列表中的单个项目是可以选择的。ListCtrl 小组件是一个高度增强的列表显示和选择工具。超过一列的列表可以在报告视图、列表视图或图标视图中显示。

https://wintel.blog.csdn.net/article/details/130898162?spm=1001.2014.3001.5502
https://wintel.blog.csdn.net/article/details/130898214?spm=1001.2014.3001.5502

3.1. wx.ListBox(列表框)

wx.ListBox 列表框控件从一个字符串列表中选择一个或者多个字符串。
所选字符串显示在一个可以滚动的列表框中,所选中的字符串将特别标记。列表框可以是单选 (如果选择了其中的一个项,则清除先前的选择项)或者多重选择(选择一个项的时,不影响对其他项的选择)。
窗口样式:

  • wx.LB_SINGLE:单选列表。
  • wx.LB_MULTIPLE:多选列表。
  • wx.LB_EXTENDED:扩展选择列表,用户可以使用 SHIFT 或 CTRL 键以及光标移动键或鼠标来扩展选择。
  • wx.LB_HSCROLL:如果内容太多,创建水平滚动条(仅限Windows)。
  • wx.LB_ALWAYS_SB:始终显示垂直滚动条。
  • wx.LB_NEEDED_SB:只在需要时创建垂直滚动条。
  • wx.LB_NO_SB:不创建垂直滚动条(仅限于wxMSW和wxGTK)。
  • wx.LB_SORT:列表框内容按字母顺序排序。

注意:LB_SINGLE,LB_MULTIPLE 和 LB_EXTENDED 样式是互斥的,最多可以指定其中一个样式(单选是默认设置)。
可发出的事件:

  • EVT_LISTBOX:当列表中的项被选中或选择发生变化时,处理 wx.EVT_LISTBOX 事件。
  • EVT_LISTBOX_DCLICK:当双击列表框时,处理 wx.EVT_LISTBOX_DCLICK事件。

3.2. wx.CheckListBox(复选列表框)

3.3. wx.ListCtrl()

import wx
import wx.lib.mixins.listctrl as listmixmusicdata = {
1 : ("Bad English", "The Price Of Love", "Rock"),
2 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"),
3 : ("George Michael", "Praying For Time", "Rock"),
4 : ("Gloria Estefan", "Here We Are", "Rock"),
5 : ("Linda Ronstadt", "Don't Know Much", "Rock"),
6 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"),
7 : ("Paul Young", "Oh Girl", "Rock"),
8 : ("Paula Abdul", "Opposites Attract", "Rock"),
9 : ("Richard Marx", "Should've Known Better", "Rock"),
10: ("Rod Stewart", "Forever Young", "Rock"),
11: ("Roxette", "Dangerous", "Rock"),
12: ("Sheena Easton", "The Lover In Me", "Rock"),
13: ("Sinead O'Connor", "Nothing Compares 2 U", "Rock"),
14: ("Stevie B.", "Because I Love You", "Rock"),
15: ("Taylor Dayne", "Love Will Lead You Back", "Rock"),
16: ("The Bangles", "Eternal Flame", "Rock"),
17: ("Wilson Phillips", "Release Me", "Rock"),
18: ("Billy Joel", "Blonde Over Blue", "Rock"),
19: ("Billy Joel", "Famous Last Words", "Rock"),
20: ("Billy Joel", "Lullabye (Goodnight, My Angel)", "Rock"),
21: ("Billy Joel", "The River Of Dreams", "Rock"),
22: ("Billy Joel", "Two Thousand Years", "Rock")
}class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):def __init__(self, parent, ID, pos=wx.DefaultPosition,size=wx.DefaultSize, style=0):wx.ListCtrl.__init__(self, parent, ID, pos, size, style)listmix.ListCtrlAutoWidthMixin.__init__(self)class TabPanel(wx.Panel, listmix.ColumnSorterMixin):"""This will be the second notebook tab"""#----------------------------------------------------------------------def __init__(self, parent):""""""wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)self.createAndLayout()def createAndLayout(self):# 主布局sizer = wx.BoxSizer(wx.VERTICAL)self.list = TestListCtrl(self, wx.ID_ANY, style=wx.LC_REPORT|wx.BORDER_NONE|wx.LC_EDIT_LABELS|wx.LC_SORT_ASCENDING)sizer.Add(self.list, 1, wx.EXPAND)# 创建listself.populateList(musicdata.items())# Now that the list exists we can init the other base class,# see wx/lib/mixins/listctrl.pylistmix.ColumnSorterMixin.__init__(self, 3)self.SetSizer(sizer)self.SetAutoLayout(True)def populateList(self, items):# list 表头self.list.InsertColumn(0, "Artist")self.list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT)self.list.InsertColumn(2, "Genre")# 插入数据        for key, data in items:index = self.list.InsertItem(0, data[0])self.list.SetItem(index, 1, data[1])self.list.SetItem(index, 2, data[2])self.list.SetItemData(index, key)# 控制列宽self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)self.list.SetColumnWidth(2, 100)# show how to select an itemself.list.SetItemState(5, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)# show how to change the colour of a couple items# 控制颜色# 行1 设置为蓝色item = self.list.GetItem(1)item.SetTextColour(wx.BLUE)self.list.SetItem(item)# 行4 设置为红色item = self.list.GetItem(4)item.SetTextColour(wx.RED)self.list.SetItem(item)self.currentItem = 0# Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.pydef GetListCtrl(self):return self.listclass DemoFrame(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, wx.ID_ANY, "Panel Tutorial")panel = TabPanel(self)self.Show()#----------------------------------------------------------------------
if __name__ == "__main__":app = wx.App()frame = DemoFrame()app.MainLoop()

在这里插入图片描述

3.4. wx.ListView()

4. wx.TreeCtrl(树状控件)

https://wintel.blog.csdn.net/article/details/130917433?spm=1001.2014.3001.5502

4.1. wx.TreeCtrl

4.2. wx.gizmos.TreeListCtrl

import wx
import wx.gizmos as gizmosclass TabPanel(wx.Panel):"""This will be the third notebook tab"""#----------------------------------------------------------------------def __init__(self, parent):""""""wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)self.Bind(wx.EVT_SIZE, self.OnSize)self.tree = gizmos.TreeListCtrl(self, -1, style=wx.TR_DEFAULT_STYLE|wx.TR_FULL_ROW_HIGHLIGHT)isz = (16,16)il = wx.ImageList(isz[0], isz[1])fldridx     = il.Add(self.GetImage("icon_save.png"))fldropenidx = il.Add(self.GetImage("icon_fileopen.png"))fileidx     = il.Add(self.GetImage("icon_help.png"))bulbidx     = il.Add(self.GetImage("icon_about.png"))self.tree.SetImageList(il)self.il = il# 创建三列# create some columnsself.tree.AddColumn("主列")self.tree.AddColumn("列1")self.tree.AddColumn("列2")self.tree.SetMainColumn(0) # the one with the tree in it...self.tree.SetColumnWidth(0, 175)# 根行self.root = self.tree.AddRoot("Root Item")self.tree.SetItemText(self.root, "col 1 root", 1)self.tree.SetItemText(self.root, "col 2 root", 2)self.tree.SetItemImage(self.root, fldridx, which=wx.TreeItemIcon_Normal)        # 折叠时的图标self.tree.SetItemImage(self.root, fldropenidx, which=wx.TreeItemIcon_Expanded)  # 展开时的图标# 15行子for x in range(15):txt = "Item %d" % xchild = self.tree.AppendItem(self.root, txt)self.tree.SetItemText(child, txt + "(c1)", 1)self.tree.SetItemText(child, txt + "(c2)", 2)self.tree.SetItemImage(child, fldridx, which=wx.TreeItemIcon_Normal)self.tree.SetItemImage(child, fldropenidx, which=wx.TreeItemIcon_Expanded)# 5行孙for y in range(5):txt = "item %d-%s" % (x, chr(ord("a")+y))last = self.tree.AppendItem(child, txt)self.tree.SetItemText(last, txt + "(c1)", 1)self.tree.SetItemText(last, txt + "(c2)", 2)self.tree.SetItemImage(last, fldridx, which=wx.TreeItemIcon_Normal)self.tree.SetItemImage(last, fldropenidx, which=wx.TreeItemIcon_Expanded)# 5行重孙for z in range(5):txt = "item %d-%s-%d" % (x, chr(ord("a")+y), z)item = self.tree.AppendItem(last,  txt)self.tree.SetItemText(item, txt + "(c1)", 1)self.tree.SetItemText(item, txt + "(c2)", 2)self.tree.SetItemImage(item, fileidx, which=wx.TreeItemIcon_Normal)self.tree.SetItemImage(item, bulbidx, which=wx.TreeItemIcon_Selected)self.tree.Expand(self.root)self.tree.GetMainWindow().Bind(wx.EVT_RIGHT_UP, self.OnRightUp)self.tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate)def GetImage(self, filename, w=16, h=16):#img = wx.Image(filename, "image/png").Scale(w,h) #通过wx.Image 加载图片,并缩放图片到长宽为w,w的尺寸img = wx.Bitmap(filename, wx.BITMAP_TYPE_ANY).ConvertToImage().Scale(w, h) #将位图转换为图片后在改变尺寸return wx.Bitmap(img, wx.BITMAP_SCREEN_DEPTH)def OnActivate(self, evt):print('OnActivate: %s' % self.tree.GetItemText(evt.GetItem()))def OnRightUp(self, evt):pos = evt.GetPosition()item, flags, col = self.tree.HitTest(pos)if item:print('Flags: %s, Col:%s, Text: %s' % (flags, col, self.tree.GetItemText(item, col)))def OnSize(self, evt):self.tree.SetSize(self.GetSize())class DemoFrame(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, wx.ID_ANY, "TreeListCtrl")panel = TabPanel(self)self.Show()#----------------------------------------------------------------------
if __name__ == "__main__":app = wx.App()frame = DemoFrame()app.MainLoop()

在这里插入图片描述

5. Book 控件族

https://wintel.blog.csdn.net/article/details/130917735?spm=1001.2014.3001.5502

5.1. 准备工作三个 Book

import wxclass TabOne(wx.Panel):"""This will be the first notebook tab"""def __init__(self, parent):# wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)super().__init__(parent=parent, id=wx.ID_ANY)sizer = wx.BoxSizer(wx.VERTICAL)import osimage_path = os.path.dirname(__file__) imgOri = wx.Image(image_path + "/python.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()# txtOne = wx.StaticBitmap(self, wx.ID_ANY, bmpOri, pos=(10, 20), size=(300, 156))bmpOri = wx.StaticBitmap(self, wx.ID_ANY, imgOri)sizer.Add(bmpOri, 0, wx.ALL, 5)self.SetSizer(sizer)class TabTwo(wx.Panel):"""This will be the second notebook tab"""def __init__(self, parent):# wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)super().__init__(parent=parent, id=wx.ID_ANY)sizer = wx.BoxSizer(wx.VERTICAL)txtOne = wx.TextCtrl(self, wx.ID_ANY, "")txtTwo = wx.TextCtrl(self, wx.ID_ANY, "")sizer.Add(txtOne, 0, wx.ALL, 5)sizer.Add(txtTwo, 0, wx.ALL, 5)self.SetSizer(sizer)class TabThree(wx.Panel):"""This will be the third notebook tab"""def __init__(self, parent):# wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)super().__init__(parent=parent, id=wx.ID_ANY)# 主布局sizer = wx.BoxSizer(wx.VERTICAL)# sbox = wx.StaticBox(self, label="个人信息", pos=(5, 5), size=(240, 90))sbox = wx.StaticBox(self, label="个人信息", size=(240, 90))# sbox.Enable(False)# 内部布局inner = wx.StaticBoxSizer(sbox, wx.VERTICAL)cb1 = wx.CheckBox(self, label="男性")cb2 = wx.CheckBox(self, label="已婚")inner.Add(cb1, 0, flag=wx.EXPAND|wx.ALL, border=5)inner.Add(cb2, 0, flag=wx.EXPAND|wx.ALL, border=5)sizer.Add(inner, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)self.SetSizer(sizer)

5.2. wx.Notebook(选项卡)

wx.Notebook widget 呈现了一个标签式控件。一个框架中的 Notebook 对象有一个或多个标签(称为页),每个标签有一个显示控件布局的面板。
参考:
https://wintel.blog.csdn.net/article/details/130917491?spm=1001.2014.3001.5502

5.3. wx.Choicebook

wx.Choicebook 是一个类似 wx.Notebook 的控件,使用 wx.Choice 控件来显示标签。因此它允许用户单击下拉控件来选择要查看的页面。Choicebook 继承自wx.BookCtrlBase,所以它具有与 wx.Notebook 相同的大部分方法。
窗口样式:

  • wx.CHB_DEFAULT:根据当前平台为标签选择默认位置(默认为wx.CHB_TOP)。
  • wx.CHB_TOP:在页面区域上方放置标签。
  • wx.CHB_LEFT:在页面区域左边放置标签。
  • wx.CHB_RIGHT:在页面区域右边放置标签。
  • wx.CHB_BOTTOM:在页面区域下方放置标签。

可发出事件:

  • EVT_CHOICEBOOK_PAGE_CHANGED:页面选择发生改变后发出。
  • EVT_CHOICEBOOK_PAGE_CHANGING:页面选择发生改变时发出。
import wxclass MyWin(wx.Frame):def __init__(self, parent, title):# super(SampleChoicebook, self).__init__(title)super().__init__(parent, title = title) self.SetTitle(title)panel = wx.Panel(self)# 主布局sizer = wx.BoxSizer(wx.VERTICAL)# Choicebook 控件self.books = wx.Choicebook(panel)# 创建第一个页面, 并添加到 ChoicebooktabOne = TabOne(self.books)tabOne.SetBackgroundColour("Gray")self.books.AddPage(tabOne, "页面一")# 创建第二个页面, 并添加到 ChoicebooktabTwo = TabTwo(self.books)self.books.AddPage(tabTwo, "页面二")# 创建第三个页面, 并添加到 Choicebookself.books.AddPage(TabThree(self.books), "页面三")sizer.Add(self.books, 1, wx.ALL|wx.EXPAND, 5)panel.SetSizer(sizer)# self.Layout()# self.Centre()self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging)def OnPageChanged(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanged,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()def OnPageChanging(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanging,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()if __name__ == "__main__":app = wx.App()sample = MyWin(None, "Choicebook")sample.Show()app.MainLoop()

在这里插入图片描述

5.4. wx.Listbook

wx.Listbook 是一个类似于 wx.Notebook 的类,但它使用 wx.ListCtrl 来显示标签。默认情况下,底层 wx.ListCtrl 在单列报表视图中显示页面标签。调用wx.BookCtr.SetImageList 将隐式地切换控件以使用图标视图。
与 Choicebook 一样,此控件继承自 BookCtrlBase 并具有相同的方法。主要的区别似乎在于列表的外观和它独特的事件集。
窗口样式:

  • wx.LB_DEFAULT:根据当前平台为标签选择默认位置。
  • wx.LB_TOP:在页面区域上方放置标签。
  • wx.LB_LEFT:在页面区域左边放置标签。
  • wx.LB_RIGHT:在页面区域右边放置标签。
  • wx.LB_BOTTOM:在页面区域下方放置标签。

可发出事件:

  • EVT_LISTBOOK_PAGE_CHANGED:页面选择发生改变后发出。
  • EVT_LISTBOOK_PAGE_CHANGING:页面选择发生改变时发出。
import wxclass MyWin(wx.Frame):def __init__(self, parent, title):# super(SampleChoicebook, self).__init__(title)super().__init__(parent, title = title) self.SetTitle(title)panel = wx.Panel(self)# 主布局sizer = wx.BoxSizer(wx.VERTICAL)# Choicebook 控件# self.books = wx.Choicebook(panel)self.books = wx.Listbook(panel)img_list= wx.ImageList(32, 32)img_list.Add(wx.Bitmap("icon_fileopen.png", wx.BITMAP_TYPE_ANY))img_list.Add(wx.Bitmap("icon_save.png", wx.BITMAP_TYPE_ANY))img_list.Add(wx.Bitmap("icon_help.png", wx.BITMAP_TYPE_ANY)) self.books.AssignImageList(img_list)# 创建第一个页面, 并添加到 ChoicebooktabOne = TabOne(self.books)tabOne.SetBackgroundColour("Gray")self.books.AddPage(tabOne, "页面一", imageId=0)# 创建第二个页面, 并添加到 ChoicebooktabTwo = TabTwo(self.books)self.books.AddPage(tabTwo, "页面二", imageId=1)# 创建第三个页面, 并添加到 Choicebookself.books.AddPage(TabThree(self.books), "页面三", imageId=2)sizer.Add(self.books, 1, wx.ALL|wx.EXPAND, 5)panel.SetSizer(sizer)# self.Layout()# self.Centre()# self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging)self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGED, self.OnPageChanged)self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGING, self.OnPageChanging)def OnPageChanged(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanged,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()def OnPageChanging(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanging,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()if __name__ == "__main__":app = wx.App()sample = MyWin(None, "Choicebook")sample.Show()app.MainLoop()

在这里插入图片描述

5.5. wx.Toolbook

wx.Toolbook是一个类似于wx.Notebook的类,但它使用wx.ToolBar来显示标签。可以看作是一个wx.Toolbar加上一个wx.Notebook构成wx.Toolbook。这意味着可以使用带标签的位图按钮来控制您正在查看的笔记本的哪个“选项卡”。
窗口样式:

  • wx.TBK_BUTTONBAR:在macOS下使用基于wx.buttontoolbar的实现(在其他平台下忽略)。
  • wx.TBK_HORZ_LAYOUT:在旁边显示文本和图标,而不是垂直堆叠(仅在Windows和GTK 2平台下实现,因为它依赖于wx.TB_HORZ_LAYOUT标志支持)。

可发出事件:

  • EVT_TOOLBOOK_PAGE_CHANGED:页面选择发生改变后发出。
  • EVT_TOOLBOOK_PAGE_CHANGING:页面选择发生改变时发出。
import wxclass MyWin(wx.Frame):def __init__(self, parent, title):# super(SampleChoicebook, self).__init__(title)super().__init__(parent, title = title) self.SetTitle(title)panel = wx.Panel(self)# 主布局sizer = wx.BoxSizer(wx.VERTICAL)# Choicebook 控件# self.books = wx.Choicebook(panel)# self.books = wx.Listbook(panel)self.books = wx.Toolbook(panel)img_list= wx.ImageList(32, 32)img_list.Add(wx.Bitmap("icon_fileopen.png", wx.BITMAP_TYPE_ANY))img_list.Add(wx.Bitmap("icon_save.png", wx.BITMAP_TYPE_ANY))img_list.Add(wx.Bitmap("icon_help.png", wx.BITMAP_TYPE_ANY)) self.books.AssignImageList(img_list)# 创建第一个页面, 并添加到 ChoicebooktabOne = TabOne(self.books)tabOne.SetBackgroundColour("Gray")self.books.AddPage(tabOne, "页面一", imageId=0)# 创建第二个页面, 并添加到 ChoicebooktabTwo = TabTwo(self.books)self.books.AddPage(tabTwo, "页面二", imageId=1)# 创建第三个页面, 并添加到 Choicebookself.books.AddPage(TabThree(self.books), "页面三", imageId=2)sizer.Add(self.books, 1, wx.ALL|wx.EXPAND, 5)panel.SetSizer(sizer)# self.Layout()# self.Centre()# self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging)# self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGING, self.OnPageChanging)self.Bind(wx.EVT_TOOLBOOK_PAGE_CHANGED, self.OnPageChanged)self.Bind(wx.EVT_TOOLBOOK_PAGE_CHANGING, self.OnPageChanging)def OnPageChanged(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanged,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()def OnPageChanging(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanging,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()if __name__ == "__main__":app = wx.App()sample = MyWin(None, "Toolbook")sample.Show()app.MainLoop()

在这里插入图片描述

5.6. wx.Treebook

wx.Treebook是wx.Notebook类的扩展,它允许在控件中显示树状结构的页面集。它可以看作是wx.TreeCtrl和wx.Notebook的组合。
创建wx.Treebook对象后,使用InsertPage()、InsertSubPage()、AddPage()、AddSubPage()即可填充页面。如果树深度不超过1层,那么可以简单地使用AddPage()和AddSubPage()通过在树的每一步添加一个页面或子页面到树的末尾来顺序填充的树。

可发出事件:

  • EVT_TREEBOOK_PAGE_CHANGED:页面选择发生改变后发出。
  • EVT_TREEBOOK_PAGE_CHANGING:页面选择发生改变时发出。
  • EVT_TREEBOOK_NODE_COLLAPSED:页面节点被折叠时发出。
  • EVT_TREEBOOK_NODE_EXPANDED:页面节点被展开时发出。
import wxclass MyWin(wx.Frame):def __init__(self, parent, title):# super(SampleChoicebook, self).__init__(title)super().__init__(parent, title = title) self.SetTitle(title)panel = wx.Panel(self)# 主布局sizer = wx.BoxSizer(wx.VERTICAL)# Choicebook 控件# self.books = wx.Choicebook(panel)# self.books = wx.Listbook(panel)# self.books = wx.Toolbook(panel)self.books = wx.Treebook(panel)img_list= wx.ImageList(32, 32)img_list.Add(wx.Bitmap("icon_fileopen.png", wx.BITMAP_TYPE_ANY))img_list.Add(wx.Bitmap("icon_save.png", wx.BITMAP_TYPE_ANY))img_list.Add(wx.Bitmap("icon_help.png", wx.BITMAP_TYPE_ANY)) self.books.AssignImageList(img_list)# 创建第一个页面, 并添加到 ChoicebooktabOne = TabOne(self.books)tabOne.SetBackgroundColour("Gray")self.books.AddPage(tabOne, "页面一", imageId=0)self.books.AddSubPage(tabOne, "子页面", imageId=0)# 创建第二个页面, 并添加到 ChoicebooktabTwo = TabTwo(self.books)self.books.AddPage(tabTwo, "页面二", imageId=1)# 创建第三个页面, 并添加到 Choicebookself.books.AddPage(TabThree(self.books), "页面三", imageId=2)sizer.Add(self.books, 1, wx.ALL|wx.EXPAND, 5)panel.SetSizer(sizer)# self.Layout()# self.Centre()# self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging)# self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGING, self.OnPageChanging)# self.Bind(wx.EVT_TOOLBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_TOOLBOOK_PAGE_CHANGING, self.OnPageChanging)# self.Bind(wx.EVT_TOOLBOOK_PAGE_CHANGED, self.OnPageChanged)# self.Bind(wx.EVT_TOOLBOOK_PAGE_CHANGING, self.OnPageChanging)self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.OnPageChanged)self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGING, self.OnPageChanging)# 解决在Mac上大小错误# wx.CallLater(100, self.AdjustSize)def AdjustSize(self):self.GetTreeCtrl().InvalidateBestSize()self.SendSizeEvent()def OnPageChanged(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanged,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()def OnPageChanging(self, e):old = e.GetOldSelection()new = e.GetSelection()sel = self.books.GetSelection()print("OnPageChanging,  old:%d, new:%d, sel:%d\n" % (old, new, sel))e.Skip()if __name__ == "__main__":app = wx.App()sample = MyWin(None, "Toolbook")sample.Show()app.MainLoop()

在这里插入图片描述

5.7. wx.aui.AuiNotebook

https://wintel.blog.csdn.net/article/details/130917801?spm=1001.2014.3001.5502

5.8. wx.lib.agw.flatnotebook.FlatNotebook

https://wintel.blog.csdn.net/article/details/130917801?spm=1001.2014.3001.5502

5.9. wx.lib.agw.aui.AuiNotebook

https://wintel.blog.csdn.net/article/details/130917801?spm=1001.2014.3001.5502

6. 菜单栏&工具栏&状态栏

菜单通常由几个主要部分组成:文件、编辑、帮助等。每个部分可能包含一些子菜单,子菜单中还可以添加各种命令。

参考:https://blog.csdn.net/weixin_33595571/article/details/91359695

6.1. wx.MenuBar

常用方法:

  • Append(self, menu, title):将菜单menu添加到菜单栏的末尾。title为菜单的标题(必须非空),执行成功返回True,否则返回False。
  • Check(self, id, check):选中或取消选中菜单项。id为菜单项标识符,check为True时。则表示选中该菜单项,否则表示未选中该菜单项。
  • Enable(self, id, enable):启用或禁用(灰色)菜单项。id为菜单项标识符,enable为True时。则表示启用该菜单项,否则表示禁用该菜单项。
  • EnableTop(self, pos, enable):启用或禁用整个菜单。pos为菜单的位置,从零开始。enable为True启用菜单,False禁用菜单。
  • FindItem(self, id):查找与给定菜单项标识符关联的菜单项对象。id为菜单项标识符。
  • FindItemById(self, id):查找与给定菜单项标识符关联的菜单项对象。id为菜单项标识符。
  • FindMenu(self, title):返回给定title的菜单的索引。如果此菜单栏中不存在这样的菜单,则返回NOT_FOUND。
  • FindMenuItem(self, menuString, itemString):查找菜单名称/菜单项字符串对的菜单项ID。menuString为要查找的菜单标题。itemString为要查找的项目。
  • Insert(self, pos, menu, title):在菜单栏给定位置插入菜单。pos为新菜单在菜单栏中的位置,menu为要添加的菜单,title为菜单的标题。
  • Refresh(self, eraseBackground=True, rect=None):重绘菜单栏。
  • Remove(self, pos):从菜单栏中位置pos处删除菜单并返回菜单对象-调用方负责删除该菜单对象。
  • Replace(self, pos, menu, title): 将给定位置的菜单替换为另一个菜单。pos为新菜单在菜单栏中的位置,menu为要添加的菜单,title为菜单的标题。
  • SetHelpString(self, id, helpString):设置与菜单项关联的帮助字符串。id为菜单项标识符,helpString为与菜单项关联的帮助字符串。
  • SetLabel(self, id, label):设置菜单项的标签。id为菜单项标识符,label为菜单项标签。
  • SetMenuLabel(self, pos, label):设置顶层菜单的标签。pos为菜单在菜单栏上的位置,从零开始。label为菜单标签。
  • SetMenus(self, items):清除菜单栏中的菜单,然后添加新的菜单项items。

实例:

import wx class MyFrame(wx.Frame):def __init__(self, parent, title):# super(MyFrame, self).__init__(parent, title=title)super().__init__(parent, title=title)# 创建菜单栏menu_bar = wx.MenuBar()# 创建文件菜单file_menu = wx.Menu()new_item    = file_menu.Append(wx.ID_NEW, "&New\tCtrl-N")open_item   = file_menu.Append(wx.ID_OPEN, "&Open\tCtrl-O")exit_item   = file_menu.Append(wx.ID_EXIT, "&Exit")# # 绑定事件# new_item.Bind(wx.EVT_MENU, self.OnNew)# open_item.Bind(wx.EVT_MENU, self.OnOpen)# exit_item.Bind(wx.EVT_MENU, self.OnExit)self.Bind(wx.EVT_MENU, self.OnNew, new_item)self.Bind(wx.EVT_MENU, self.OnOpen, open_item)self.Bind(wx.EVT_MENU, self.OnExit, exit_item)# 创建编辑菜单edit_menu = wx.Menu()# 将文件菜单添加到菜单栏menu_bar.Append(file_menu, "&File")menu_bar.Append(edit_menu, "&Edit")# 设置菜单栏self.SetMenuBar(menu_bar)def OnNew(self, event):print("New action")def OnOpen(self, event):print("Open action")def OnExit(self, event):self.Close()# 应用程序的主入口
if __name__ == "__main__":app = wx.App(False)frame = MyFrame(None, "MenuBar")frame.Show()app.MainLoop()

在这里插入图片描述
在这个例子中,我们创建了一个包含“新建”、“打开”和“退出”选项的文件菜单。每个菜单项都绑定了一个事件处理函数,当用户选择相应选项时,这些函数将被触发。

6.2. wx.Toolbar

工具栏是一排可快速访问的按钮,它们提供了对常用功能的快捷访问。

实例:

        ......# 创建工具栏# toolbar = self.CreateToolBar()toolbar = wx.ToolBar(self)# 设置图标大小toolbar.SetToolBitmapSize((20, 20))# 添加工具栏按钮,并绑定事件new_button = toolbar.AddTool(wx.ID_NEW, "New", wx.Bitmap("icons/file.png"))open_button = toolbar.AddTool(wx.ID_OPEN, "Open", wx.Bitmap("icons/open.png"))help_button = toolbar.AddTool(wx.ID_OPEN, "Help", wx.Bitmap("icons/help.png"))about_button = toolbar.AddTool(wx.ID_OPEN, "About", wx.Bitmap("icons/about.png"))toolbar.Bind(wx.EVT_TOOL, self.OnNew, new_button)toolbar.Bind(wx.EVT_TOOL, self.OnOpen, open_button)# 启用工具栏toolbar.Realize()......

在这里插入图片描述
在此代码段中,我们创建了一个工具栏并添加了四个按钮,分别对应于之前在菜单栏中定义的“新建”、“打开”、“帮助”、“关于”操作。为工具栏按钮绑定了相应的事件处理函数,当点击按钮时,这些函数将执行。

6.3. CreateStatusBar

状态栏非常适合于显示实时信息,例如下载进度、操作进度或系统消息。
实例:

......# 创建状态栏statusbar = self.CreateStatusBar()# 设置状态栏字段数量(多个字段可用分隔符分隔)statusbar.SetFieldsCount(3)# 字段占比statusbar.SetStatusWidths([-2, -1, -1])statusbar.SetStatusStyles([wx.SB_RAISED, wx.SB_RAISED, wx.SB_RAISED])# 设置字段的 显示内同statusbar.SetStatusText(u'状态信息0', 0)statusbar.SetStatusText(u'', 1)statusbar.SetStatusText(u'状态信息2', 2)# 模拟下载操作和进度更新# 1000毫秒wx.CallLater(100, self.StartDownload)def StartDownload(self):# 假设下载操作在另一个线程中进行for i in range(0, 101, 10):if i == 100:self.SetStatusText("Download completed.", 0)else:self.SetStatusText(f"Downloading... {i}%", 0)time.sleep(1)
......

在这里插入图片描述

7. wx.SplitterWindow

这个类的对象是一个布局管理器,它持有两个子窗口,其大小可以通过拖动它们之间的边界而动态改变。分割器控件给出一个手柄,可以拖动它来调整控件的大小。
https://www.cnblogs.com/wuhuacong/p/18636134
https://cloud.tencent.com/developer/ask/sof/386727

8. wx.html.HtmlWindow

https://wintel.blog.csdn.net/article/details/130917568?spm=1001.2014.3001.5502

9. AGW 扩展包

https://wintel.blog.csdn.net/article/details/130917682?spm=1001.2014.3001.5502

http://www.lryc.cn/news/606284.html

相关文章:

  • 【ad-hoc构造】P10033 「Cfz Round 3」Sum of Permutation|普及+
  • vscode插件开发(腾讯混元)
  • Go再进阶:结构体、接口与面向对象编程
  • Cesium 快速入门(三)Viewer:三维场景的“外壳”
  • 基于深度学习的医学图像分析:使用BERT实现医学文本分类
  • 零信任网络概念及在网络安全中的应用
  • 【数据库】MySQL 详细安装与基础使用教程(8版本下载及安装)
  • RWA+AI算力賦能全球醫療数字產業升級高峰論壇——暨BitHive BTT 全球發佈會
  • C++面试5题--6day
  • wpf之ContentPresenter
  • PyTorch深度学习快速入门学习总结(三)
  • 【机器学习篇】01day.python机器学习篇Scikit-learn入门
  • 机器学习①【机器学习的定义以及核心思想、数据集:机器学习的“燃料”(组成和获取)】
  • 运行图生视频/文生视频(Wan2.X等)的显卡配置总结
  • 基于deepseek的文本解析 - 超长文本的md结构化
  • CNN卷积神经网络之LeNet和AlexNet经典网络模型(三)
  • 深入解析LLM层归一化:稳定训练的关键
  • 模型优化——在MacOS 上使用 Python 脚本批量大幅度精简 GLB 模型(通过 Blender 处理)
  • 基于PyTorch利用CNN实现MNIST的手写数字识别
  • 【源力觉醒 创作者计划】对比与实践:基于文心大模型 4.5 的 Ollama+CherryStudio 知识库搭建教程
  • 如何系统性了解程序
  • 【Java安全】CC1链
  • <RT1176系列13>LWIP Ping功能入门级应用和基础API解析
  • MySQL 8.0 OCP 1Z0-908 题目解析(41)
  • python制作的软件工具安装包
  • XL2422 无线收发芯片,可用于遥控玩具和智能家居等应用领域
  • 5G-A技术浪潮勾勒通信产业新局,微美全息加快以“5.5G+ AI”新势能深化场景应用
  • 贝锐蒲公英X4 Pro 5G新品路由器:异地组网+8网口+双频WiFi全都有
  • 5G毫米波射频前端设计:从GaN功放到混合信号集成方案
  • arm架构系统打包qt程序--麒麟操作系统为例