wxPython 实践(五)高级控件

发布于:2025-08-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

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


官网:
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 wx
 
class 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 listmix
 
musicdata = {
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)

        # 创建list
        self.populateList(musicdata.items())
        # Now that the list exists we can init the other base class,
        # see wx/lib/mixins/listctrl.py
        listmix.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 item
        self.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.py
    def GetListCtrl(self):
        return self.list
         
class 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 gizmos
 
class 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 columns
        self.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" % x
            child = 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 wx

class 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 os
        image_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 wx

class 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)
    
        # 创建第一个页面, 并添加到 Choicebook
        tabOne = TabOne(self.books)
        tabOne.SetBackgroundColour("Gray")
        self.books.AddPage(tabOne, "页面一")
        # 创建第二个页面, 并添加到 Choicebook
        tabTwo = TabTwo(self.books)
        self.books.AddPage(tabTwo, "页面二")
        # 创建第三个页面, 并添加到 Choicebook
        self.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 wx

class 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)

        # 创建第一个页面, 并添加到 Choicebook
        tabOne = TabOne(self.books)
        tabOne.SetBackgroundColour("Gray")
        self.books.AddPage(tabOne, "页面一", imageId=0)
        # 创建第二个页面, 并添加到 Choicebook
        tabTwo = TabTwo(self.books)
        self.books.AddPage(tabTwo, "页面二", imageId=1)
        # 创建第三个页面, 并添加到 Choicebook
        self.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 wx

class 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)

        # 创建第一个页面, 并添加到 Choicebook
        tabOne = TabOne(self.books)
        tabOne.SetBackgroundColour("Gray")
        self.books.AddPage(tabOne, "页面一", imageId=0)
        # 创建第二个页面, 并添加到 Choicebook
        tabTwo = TabTwo(self.books)
        self.books.AddPage(tabTwo, "页面二", imageId=1)
        # 创建第三个页面, 并添加到 Choicebook
        self.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 wx

class 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)

        # 创建第一个页面, 并添加到 Choicebook
        tabOne = TabOne(self.books)
        tabOne.SetBackgroundColour("Gray")
        self.books.AddPage(tabOne, "页面一", imageId=0)
        self.books.AddSubPage(tabOne, "子页面", imageId=0)
        # 创建第二个页面, 并添加到 Choicebook
        tabTwo = TabTwo(self.books)
        self.books.AddPage(tabTwo, "页面二", imageId=1)
        # 创建第三个页面, 并添加到 Choicebook
        self.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, "&Quit")
        # # 绑定事件
        # 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.Menu

菜单项具有ID,该ID为整数,可用于标识选择或以某种方式更改菜单项。具有特殊标识符的菜单项 wx.ID_SEPARATOR 是分隔符项,没有关联的命令,而只是使分隔线出现在菜单中。

菜单项可以是:

  • 普通(normal)项:普通菜单项没有任何特殊属性;
  • 复选项(check):而复选项具有与其关联的布尔标志,并且当设置了标志时它们会在菜单中显示一个对勾;
  • 单选项(radio) :单选项目与复选项相似,不同之处在于,在选中某个单选项时,单选组中的所有其他菜单项都处于未选中状态。单选项组由一系列连续的单选项构成。它从此类的第一项开始,到另一种不同的项(或菜单的结尾)结束。请注意,由于单选项组是根据菜单项的位置定义的,因此在包含单选项的菜单中插入或删除菜单项可能会导致无法正常工作。
  • 菜单可以有一个子菜单。这样可以将类似的命令分组。例如,我们可以将隐藏/显示各种工具栏(例如个人栏,地址栏,状态栏或导航栏)的命令放置在称为工具栏的子菜单中。
  • 在菜单中,我们可以使用分隔符来分隔命令。这是一条简单的线。通常的做法是使用单个分隔符将“新建”,“打开”,“保存”等命令与“打印”,“打印预览”等命令分开。在下面示例中,将看到如何创建子菜单和菜单分隔符。

常用方法:

  • Append (self, id, item=””, helpString=””, kind=ITEM_NORMAL):添加菜单项。id为菜单命令标识符;item为出现在菜单项上的字符串;helpString为与项目关联的可选帮助字符串。kind可能是 ITEM_SEPARATOR, ITEM_NORMAL, ITEM_CHECK 或 ITEM_RADIO。
  • Append (self, id, item, subMenu, helpString=””):添加一个子菜单。id为菜单命令标识符。subMenu为添加的子菜单;item为出现在菜单项上的字符串;helpString为与项目关联的可选帮助字符串。
  • Append (self, menuItem):添加菜单项对象
  • AppendCheckItem(self, id, item, help=“”):在菜单末尾添加一个复选菜单项
  • AppendRadioItem(self, id, item, help=“”):在菜单末尾添加一个单选菜单项
  • AppendSeparator(self):在菜单末尾添加分隔符。
  • AppendSubMenu(self, submenu, text, help=“”):将给定的submenu添加 到此菜单。
  • Break(self):在菜单中插入一个分隔符,使下一个附加菜单项出现在新列中。
  • Check(self, id, check):选中或取消选中菜单项。
  • Delete (self, id):从菜单中删除指定id的菜单项。
  • Delete (self, item):从菜单中删除菜单项item。
  • DestroyItem (self, id):从菜单中删除指定id的菜单项,并释放该菜单项。
  • DestroyItem (self, item):从菜单中删除菜单项item,并释放该菜单项。
  • Enable(self, id, enable):启用或禁用(灰色)菜单项。
  • FindChildItem(self, id):查找与给定菜单项标识符关联的菜单项对象,以及与菜单项相关的位置(可选)。
  • FindItem (self, id):查找与给定菜单项标识符以及(可选)其所属的(子)菜单关联的菜单项对象。
  • FindItemById(self, id):查找与给定菜单项标识符关联的菜单项对象。
  • FindItemByPosition(self, position):返回 给定的 wx.MenuItem在菜单中的位置。
  • Insert (self, pos, id, item=””, helpString=””, kind=ITEM_NORMAL):在位置pos之前插入菜单项item。
  • Insert (self, pos, id, text, submenu, help=””):在位置pos之前插入给定的子submenu。
  • InsertCheckItem(self, pos, id, item, helpString=“”):在给定位置插入一个复选菜单项。
  • InsertRadioItem(self, pos, id, item, helpString=“”):在给定位置插入一个单选菜单项。
  • InsertSeparator(self, pos):在给定位置插入分隔符。
  • Remove(self, item):从菜单中删除菜单项,但不释放菜单项对象。
  • SetLabel(self, id, label):设置菜单项的标签。
  • SetTitle(self, title):设置菜单的标题。
	......
        # 增加分割线
        file_menu.AppendSeparator()

        # 子菜单
        subImport = wx.Menu()
        subImport.Append(wx.ID_ANY, '导入文章列表...')
        subImport.Append(wx.ID_ANY, '导入书签...')
        subImport.Append(wx.ID_ANY, '导入邮件...')
        # file_menu.Append(wx.ID_ANY, '&Import', subImport)
        file_menu.AppendSubMenu(subImport, '&Import')
	.......

在这里插入图片描述

6.3. wx.MenuItem(菜单项)

给菜单添加图标和快捷键
类 wx.MenuItem 是 wxPython 中菜单项的实现,它表示菜单中的项,通常情况下,我们无需直接创建 wx.MenuItem 对象,而是使用 wx.Menu 的方法来获得一个wx.MenuItem 对象。

常用方法:

  • Check(self, check=True):选中或取消选中菜单项。仅在该菜单项已附加到菜单后才起作用。
  • Enable(self, enable=True):启用或禁用菜单项。
  • SetBackgroundColour(self, colour): 设置与菜单项关联的背景色。
  • SetBitmap(self, bmp, checked=True):设置菜单项的位图。
  • SetBitmaps(self, checked, unchecked=NullBitmap):设置菜单项的选中/未选中位图。
  • SetDisabledBitmap(self, disabled):设置用于禁用菜单项的位图。
  • SetFont(self, font):设置与菜单项关联的字体。
  • SetHelp(self, helpString):设置菜单项的帮助字符串。
  • SetItemLabel(self, label):设置与菜单项关联的标签。如果此菜单项的ID为系统中的内建ID,则不必指定标签。
  • SetAccel(self, accel):设置菜单项的加速键。
  • SetMarginWidth(self, width):设置菜单项选中标记位图的宽度。
  • SetMenu(self, menu):设置将包含此菜单项的父菜单。
  • SetSubMenu(self, menu):设置此菜单项的子菜单。
  • SetTextColour(self, colour):设置与菜单项关联的文本颜色。
	......
        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, "&Quit")
		
        new_img = wx.Image("icons/file.png").Rescale(20, 20)
        new_item.SetBitmap(wx.Bitmap(new_img))
        open_img = wx.Image("icons/open.png").Rescale(20, 20)
        open_item.SetBitmap(wx.Bitmap(open_img))
        exit_img = wx.Image("icons/close.png").Rescale(20, 20)
        exit_item.SetBitmap(wx.Bitmap(exit_img))
	......
	    menu_bar.Append(file_menu, "&File")
        menu_bar.Append(edit_menu, "&Edit")
    ......
  • &字符指定快捷键,"&"号后面的字符。如当且 book 在编辑页,快捷键‘F’,可以切换成新建页。字符不区分大小写。
  • 指定 Ctrl+Q 作为这个菜单项的快捷键。可以在&字符串和快捷方式之间放置一个制表符\t。点击该菜单项或者按下Ctrl+Q 快捷键,应用将退出。
  • 调用 SetBitmap() 为该菜单项添加了一个图标。然后使用 wx.Menu() 的 Append() 方法将手动创建的菜单项附加到菜单上。再使用菜单项的 id,和应用退出函数绑定。
    在这里插入图片描述

6.4. 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.5. 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


网站公告

今日签到

点亮在社区的每一天
去签到