实战wxPython:042 - 高级控件之选项卡Notebook

wx.Notebook是wxPython中的一个控件,用于实现选项卡界面,用户可以在不同页面间切换。每个选项卡关联一个窗口页面,可以通过AddPage或InsertPage方法添加。文章介绍了如何禁用主题背景、设置页面样式以及处理页面切换事件。还提供了示例代码,展示如何创建和定制包含两个页面的选项卡应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在wxPython中,book控件允许用户在各种面板之间切换。最常见的例子是带有选项卡界面的浏览器和系统选项对话框。

选项卡wx.Notebook提供了一个选项卡栏和一个“页面区域” 。该页面区域用于显示与每个选项卡相关的页面。默认情况下,选项卡栏显示在页面区域上方,但是可以使用不同的配置。每个选项卡都与一个不同的窗口(称为页面)相关联。页面区域中仅显示当前页面。其他所有页面均被隐藏。

一、选项卡wx.Notebook

要在应用程序中,使用选项卡控件,需要先创建wx.Notebook对象,然后调用wx.Notebook.AddPage方法或者wx.Notebook.InsertPage添加一个窗口到页面上。注意添加到选项卡页面的窗口由wx.Notebook管理,不要显式地删除这些窗口。

在Windows系统上,默认是主题是在选项卡的页面上绘制背景,用三种方法可以禁止使用默认的主题来绘制页面的背景。使用NB_NOPAGETHEM特性来禁止在特定选项卡上绘制主题背景,在单个页面上使用SetBackgroundColor方法禁止使用主题绘制背景。或者调用
wx.SystemOptions.SetOption在整个应用生存周期禁止使用主题来绘制选项卡的页面背景。

全局禁用主题页面:

wx.SystemOptions.SetOption("msw.notebook.themed-background", 0)

将该值设置为1以再次启用它。为了给单个页面设置一个平滑背景:

col = notebook.GetThemeBackgroundColour()

if col.IsOk():
    page.SetBackgroundColour(col)

wx.Notebook支持的窗口样式:

  • wx.NB_TOP:选项卡标签放置在顶部。
  • wx.NB_LEFT:选项卡标签放置在左边。
  • wx.NB_RIGHT:选项卡标签放置在右边。
  • wx.NB_BOTTOM:选项卡标签放置在底部。
  • wx.NB_FIXEDWIDTH:所有选项卡标签将具有相同的宽度(仅限Windows)。
  • wx.NB_MULTILINE:可以有多行选项卡标签(仅限Windows)。
  • wx.NB_NOPAGETHEME:在选项卡页面上纯色显示(仅限Windows)。

wx.Notebook发出的消息:

  • EVT_NOTEBOOK_PAGE_CHANGED:页面选择发生改变后发出。
  • EVT_NOTEBOOK_PAGE_CHANGING:页面选择发生改变时发出。

wx.Notebook常用方法

  • ChangeSelection(selfpage):将选定项更改为给定页面,返回先前选定项。
  • GetPageImage(selfnPage):返回给定页面的图像索引。
  • GetPageText(selfnPage):返回给定页面的文字信息。
  • GetRowCount(self):返回选项卡控件中的行数。
  • GetSelection(self):返回当前选择的页面,如果没有选择,则返回NOT_FOUND。
  • GetThemeBackgroundColour(self):如果在Windows下运行,并且应用程序启用了主题,这个函数返回一个适合绘制选项卡页面背景的颜色,并可以传递给SetBackgroundColour。否则,将返回一个未初始化的颜色。
  • InsertPage(selfindexpagetextselect=FalseimageId=NO_IMAGE):在指定位置插入新页。
  • SetPadding(selfpadding):设置每页图标和标签周围的空间大小(以像素为单位)。
  • SetPageImage(selfpageimage):设置给定页面的图像索引。Image为通过SetImageList设置的图像列表的索引。
  • SetPageText(selfpagetext):设置给定页面的文本。
  • SetSelection(selfpage):将选定项设置为给定页面,返回先前选定项。注意,对该函数的调用将生成页面更改事件,如果不希望生成这些事件,请使用ChangeSelection方法。

 图1:wx.Notebook类继承关系

二、wx.Notebook演示

选项卡控件(wx.Notebook)

import wx

# === 第一个页面 === #
class TabPanelOne(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id = wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)
        title = wx.StaticText(self, wx.ID_ANY, "页面1")
        txtEditor = wx.TextCtrl(self, wx.ID_ANY, "")
        sizer.Add(title, 0, wx.ALL|wx.EXPAND, 5)
        sizer.Add(txtEditor, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

# === 第二个页面 === #
class TabPanelTwo(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id = wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)
        title = wx.StaticText(self, wx.ID_ANY, "页面2")
        button = wx.Button(self, wx.ID_ANY, "按钮", size = (100, 40))
        sizer.Add(title, 0, wx.ALL, 5)
        sizer.Add(button, 0, wx.ALL, 5)
        self.SetSizer(sizer)

class MyNotebook(wx.Notebook):

    def __init__(self, parent):
        wx.Notebook.__init__(self, parent, id = wx.ID_ANY, style = wx.BK_DEFAULT)

        #创建页面并添加到选项卡中
        tabOne = TabPanelOne(self)
        tabOne.SetBackgroundColour("Gray")
        self.AddPage(tabOne, "TabOne")

        tabTwo = TabPanelTwo(self)
        tabTwo.SetBackgroundColour("LightGray")
        self.AddPage(tabTwo, "TabTwo")

        self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
        self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging)

    def OnPageChanged(self, e):
        old = e.GetOldSelection()
        new = e.GetSelection()
        sel = self.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.GetSelection()
        print("OnPageChanging,  old:%d, new:%d, sel:%d\n" % (old, new, sel))
        e.Skip()

class SampleNotebook(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleNotebook, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        #设置标题
        self.SetTitle("实战wxPython: Notebook演示")
        #设置窗口尺寸
        self.SetSize(400, 300)

        panel = wx.Panel(self)

        notebook = MyNotebook(panel)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        panel.SetSizer(sizer)
        self.Layout()

        self.Centre()

def main():
    app = wx.App()
    sample = SampleNotebook(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

上面的代码演示了如何使用wx.Notebook选项卡控件。

tabOne = TabPanelOne(self)
 tabOne.SetBackgroundColour("Gray")
 self.AddPage(tabOne, "TabOne")

 tabTwo = TabPanelTwo(self)
 tabTwo.SetBackgroundColour("LightGray")
 self.AddPage(tabTwo, "TabTwo")

首先我们用类TabPanelOne和TabPanelTwo实现两个页面。创建它们的对象,使用wx.Notebook.AddPage方法添加到选项卡控件中。

 图2:wx.Notebook演示(页面一)

 图3:wx.Notebook演示(页面二)

三、本文知识点

  • 了解和使用页面选项卡wx.Notebook。

前一篇:实战wxPython:041 - 高级控件之树状控件TreeCtrl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值