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

2023-11-20

在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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战wxPython:042 - 高级控件之选项卡Notebook 的相关文章

随机推荐

  • 手游幻想神域服务器显示,幻想神域手游最详细攻略介绍

    幻想神域 是一款公测于2018年的动漫手游 是角色扮演类的游戏 游戏凭借二次元的日系风格 Q萌的人物画风 饱满的人物设定而吸引了很多玩家 游戏玩得多的人得心应手 但是玩得比较少的可能会有点摸不着头脑 那么接下来就给大家介绍一下 幻想神域 的
  • 接口的幂等性设计

    在高并发或者是安全要求下 后端接口会有多次执行的结果与一次执行的结果要一致的要求 这种接口就叫幂等性接口 需要用到幂等性的接口比较常见的就是用户下单支付等 防止出现重试时对业务造成巨大灾害的危险 下文为设计方案的各个要点 前端幂等控制 按钮
  • Qt使用QChart制作多路虚拟示波器

    使用QT做虚拟示波器 共16通道 波形是重叠在一起 不同颜色区分 想用写好的TCP传输来让单片机与电脑通信 解刨数据 放入到示波器中进行显示 准备工作 首先我缺一个绘图的控件 于是在网上找了找 网上给我介绍的有三种 分别是qcustompl
  • C、C++、C#、python、java编程—函数

    C资料 菜鸟教程 C语言中文网 C community C 资料 菜鸟教程 cplusplus C community C 资料 菜鸟教程 microsoftC 文档 python资料 菜鸟教程 python标准库 Java资料 菜鸟教程
  • 【Ansible故障解决】解决Ansible初始连接host服务器需验证问题

    Ansible故障解决 解决Ansible初始连接host服务器需验证问题 一 ansible介绍 二 修改ansible cfg配置文件 1 ansible的配置文件修改 2 修改配置文件中的其他部分 3 编辑主机清单 三 测试ansib
  • sh、bash 和 dash 几种 shell 的区别是什么?

    在调试基于 Debian 的 Docker 镜像时 进入容器后在终端中按上箭头键后终端显示 A 下箭头显示 B 右箭头显示 C 左箭头显示 D 按删除键也是显示了几个特殊字符 很奇怪 仔细看了一下 原来进入容器的时候终端使用的 sh 切换为
  • iPhone惊爆史诗级漏洞:亿万台手机可永久越狱 苹果无法修复

    在我认为完美越狱已死的时候没想到国外大神爆出了一个 不可修补 iPhone漏洞 这个漏洞会让iPhone永久越狱从iPhone 4S到iPhone X的所有设备均会受到影响 但是目前还是不支持A12芯片的 据发现它的安全研究员axi0mX称
  • C++实现大数运算(加减乘除求余)

    前言 只有部分GCC编译器支持int128 而我们平常使用的软件 最大只有 int64 当这些不够用时 我们该怎么办 我本身想写代码实现整数型大数据的加减乘除和求余 结果写着写着想着连小数运算的也一起写上 反正加的代码不多 电脑是死的 人是
  • 报错解决:No module named tensorflow.contrib

    今天在跑代码的时候发现一个报错 如下图所示 于是乎我就按照下面的提示安装啊 可惜的是 无效 然后我就去查了下自己的TensorFlow版本 是1 15 再看了下Readme md 怀疑是不是版本太高了 想到就做 换了个低版本的TensorF
  • ruoyi(若依)分离版框架,FluentMybatis封装后,导入功能的前后端实现

    我这里使用的是车辆来作为示例 首先是前端 导入按钮 点击导入按钮后的对话框 导入的一系列方法 下面是后端 Controller层 我们使用了FluentMybatis进行了封装 mapper层被封装了 但会有一些封装好的方法 我们只要 利用
  • vue 项目中使用高德地图

    官方文档 高德地图API官网 高德地图2 0参考手册 高德地图JS API 2 0 示例 在项目中使用 vue amap 高德地图JSAPI在Vue框架下使用 高德地图在线 JS API 示例 一 账号准备 首先 需要注册并登录高德地图开放
  • uni-app 之 表格设置

    uni app 之 表格设置 image png
  • QT connect()连接函数

    函数重载 连接函数后多种重载方法 常用的有 函数4个参数 发射信号的对象 发射的信号 接受信号的对象 要执行的槽 按键单击信号连接到按键槽函数 方法1 connect ui gt pushButton SIGNAL clicked bool
  • java与C++之间的区别

    前言 研究生期间主要使用的是C 语言 因工作的要求 现在需要学习java语言 在学习的这段时间里 发现两种语言之间有着很多相似的地方 但又有一些区别 下面说一下java和c 中比较显著的区别 适用于有c 基础的读者 一 在数据类型 关键字方
  • 销售人员的月工资数量(月工资=基本工资+提成,提成=商品数*1.5)

    include
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • JDBC乱码解决方法

    JDBC操作数据库出现中文乱码解决方案 学习JDBC的时候 我不止一次碰到过数据库中文乱码问题 解决方法其实很简单 在配置文件的url中加入如下语句就ok了 useUnicode true characterEncoding utf8 出现
  • MySQL幻读:大家好,我是幻读,我今天又被解决了

    什么是幻读 幻读的定义我这里还得补充一句 幻读仅专指 新插入的行 中途通过 update 更新数据而出现同一个事务前后两次查询的 结果集合 不一样 这种不算幻读 然后前几天有位读者跟我说 这个幻读例子不是已经被 可重复读 隔离级别解决了吗
  • localStorage和sessionStorage和Cookie的区别

    localStorage和sessionStorage和Cookie是前端开发中三种常见的临时存储客户端会话信息或者数据的方法 它们都存储在客户端中 区别 一 三者存储的有效时期不同 1 Cookie存储的有效时期可以设置 一般在浏览器关闭
  • 实战wxPython:042 - 高级控件之选项卡Notebook

    在wxPython中 book控件允许用户在各种面板之间切换 最常见的例子是带有选项卡界面的浏览器和系统选项对话框 选项卡wx Notebook提供了一个选项卡栏和一个 页面区域 该页面区域用于显示与每个选项卡相关的页面 默认情况下 选项卡