在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(self, page):将选定项更改为给定页面,返回先前选定项。
-
GetPageImage(self, nPage):返回给定页面的图像索引。
-
GetPageText(self, nPage):返回给定页面的文字信息。
-
GetRowCount(self):返回选项卡控件中的行数。
-
GetSelection(self):返回当前选择的页面,如果没有选择,则返回NOT_FOUND。
-
GetThemeBackgroundColour(self):如果在Windows下运行,并且应用程序启用了主题,这个函数返回一个适合绘制选项卡页面背景的颜色,并可以传递给SetBackgroundColour。否则,将返回一个未初始化的颜色。
-
InsertPage(self, index, page, text, select=False, imageId=NO_IMAGE):在指定位置插入新页。
-
SetPadding(self, padding):设置每页图标和标签周围的空间大小(以像素为单位)。
-
SetPageImage(self, page, image):设置给定页面的图像索引。Image为通过SetImageList设置的图像列表的索引。
-
SetPageText(self, page, text):设置给定页面的文本。
-
SetSelection(self, page):将选定项设置为给定页面,返回先前选定项。注意,对该函数的调用将生成页面更改事件,如果不希望生成这些事件,请使用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演示(页面二)
三、本文知识点
前一篇:实战wxPython:041 - 高级控件之树状控件TreeCtrl