从前面的文章中,我们已经了解了几种book类控件,它们分别是wx.Notebook(最常用),wx.Choisebook,wx.Listbook,wx.Toolbook和wx.TreeBook,在本文中,我们将继续介绍几种book类控件wx.aui.AuiNotebook,AGW包中的FlatNotebook和AuiNotebook控件
演示所需要的页面,我们继续使用panelOne,panelTwo和panelThree。
一、wx.aui.AuiNotebook
wx.aui.AuiNotebook是wxAUI类框架的一部分,管理多个带有相关选项卡的窗口。
wx.aui.AuiNotebook是一个选项卡控件,它实现了应用程序中常用的可停靠窗格的许多特性。具体来说,wx.aui.AuiNotebook实现了允许用户通过拖放重新排列选项卡顺序的功能,将选项卡窗口拆分为许多不同的拆分器配置,并在不同的主题之间切换以自定义控件的外观。
wx.aui.AuiNotebook支持的窗口样式:
- wx.AUI_NB_DEFAULT_STYLE:等同于wx.AUI_NB_TOP|wx.AUI_NB_TAB_SPLIT |wx.AUI_NB_TAB_MOVE|wx.AUI_NB_SCROLL_BUTTONS|wx.AUI_NB_CLOSE_ON_ACTIVE_TAB| wx.AUI_NB_MIDDLE_CLICK_CLOSE。
- wx.AUI_NB_TAB_SPLIT:允许通过拖动选项卡来分割选项卡控件。
- wx.AUI_NB_TAB_MOVE:允许通过拖动来水平移动选项卡。
- wx.AUI_NB_TAB_EXTERNAL_MOVE:允许将一个选项卡移动到另一个选项卡控件。
- wx.AUI_NB_TAB_FIXED_WIDTH:使用这种样式,所有制表符具有相同的宽度。
- wx.AUI_NB_SCROLL_BUTTONS:使用此样式,将显示左右滚动按钮。
- wx.AUI_NB_WINDOWLIST_BUTTON:使用此样式,可以使用窗口的下拉列表。
- wx.AUI_NB_CLOSE_BUTTON:使用此样式,选项卡栏上有一个关闭按钮。
- wx.AUI_NB_CLOSE_ON_ACTIVE_TAB:使用此样式,关闭按钮在活动选项卡上可见。
- wx.AUI_NB_CLOSE_ON_ALL_TABS:使用这种样式,关闭按钮在所有选项卡上都可见。
- wx.AUI_NB_MIDDLE_CLICK_CLOSE:使用此样式,在一个选项卡上中单击关闭该选项卡。
- wx.AUI_NB_TOP:使用这种风格,标签沿着顶部绘制。
- wx.AUI_NB_BOTTOM:使用这种风格,标签沿着底部绘制。
wx.aui.AuiNotebook发出的事件:
- EVT_AUINOTEBOOK_PAGE_CLOSE:页面即将关闭时发出。
- EVT_AUINOTEBOOK_PAGE_CLOSED:页面关闭后发出。
- EVT_AUINOTEBOOK_PAGE_CHANGED:页面选择后发生改变时发出。
- EVT_AUINOTEBOOK_PAGE_CHANGING:页面选择发生改变时发出。
- EVT_AUINOTEBOOK_BUTTON:已按下窗口列表按钮时发出。
- EVT_AUINOTEBOOK_BEGIN_DRAG:开始拖动后发出。
- EVT_AUINOTEBOOK_END_DRAG:拖动结束后发出。
- EVT_AUINOTEBOOK_DRAG_MOTION:在拖放操作期间发出。
- EVT_AUINOTEBOOK_ALLOW_DND:是否允许使用Tab键拖动时发出。
- EVT_AUINOTEBOOK_DRAG_DONE:通知选项卡已被拖动时发出。
- EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN:在Tab标签上按下鼠标中键时发出。
- EVT_AUINOTEBOOK_TAB_MIDDLE_UP:在Tab标签上释放鼠标中键时发出。
- EVT_AUINOTEBOOK_TAB_RIGHT_DOWN:在Tab标签上按下鼠标右键时发出。
- EVT_AUINOTEBOOK_TAB_RIGHT_UP:在Tab标签上释放鼠标右键时发出。
- EVT_AUINOTEBOOK_BG_DCLICK:双击Tab标签背景区域时发出。
wx.aui.AuiNotebook常用方法:
- AddPage (self, page, caption, select=False, bitmap=BitmapBundle()):添加页面。如果select参数为True,调用它将生成一个页面更改事件。
- AddPage (self, page, text, select, imageId):添加一个新页面。页面必须将选项卡控件本身作为父控件,并且以前不能添加到此控件中。调用此方法可能会生成页面更改事件。
- DeleteAllPages(self):删除所有页面。
- DeletePage(self, page):删除指定页面。
- GetPage(self, page_idx):获取指定索引的页面。
- GetPageCount(self):获取选项卡中的页面数。
- InsertPage (self, index, page, text, select, imageId):在指定位置插入一个新的页面。
二、wx.aui.AuiNotebook演示
#wx.aui.AuiNotebook
import wx
import wx.aui
import panelOne, panelTwo, panelThree
class MyPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
#创建AuiNotebook实例
nb = wx.aui.AuiNotebook(self)
pages = [(panelOne.TabPanel(self), "页面一"),
(panelTwo.TabPanel(self), "页面二"),
(panelThree.TabPanel(self), "页面三")]
for page,label in pages:
nb.AddPage(page, label)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(nb, 1, wx.EXPAND)
self.SetSizer(sizer)
class SampleAuiNotebook(wx.Frame):
def __init__(self, *args, **kw):
super(SampleAuiNotebook, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
self.SetTitle("实战wxPython: AuiNotebook演示")
self.SetSize(600, 400)
panel = MyPanel(self)
self.Centre()
def main():
app = wx.App()
sample = SampleAuiNotebook(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上面的例子通过对wx.aui. AuiNotebook(self)实例化并传入一个wx.Panel来创建一个AuiNotebook实例。然后使用AuiNotebook的AddPage()方法添加了一些页面。注意,可以通过单击其单个“x”来关闭任何选项卡。
图1:wx.aui.AuiNotebook演示
三、wx.lib.agw.flatnotebook.FlatNotebook
AGW中FlatNotebook是Notebook的完整实现,旨在成为Notebook的替代品。API函数是相似的,因此可以期望函数以相同的方式运行。
FlatNotebook具有以下一些特点:
- 按钮以火狐风格高亮显示。
- 滚动以大量的标签完成(所以,滚动更快,更好)。
- 按钮区域永远不会被选项卡覆盖。
- 它是一个通用控件。
- 鼠标中键点击可以用来关闭标签。
- 为选项卡添加右键菜单的函数(简单如SetRightClickMenu)。
- 所有样式都有底部样式(它们可以在屏幕底部绘制)。
- 隐藏“X”按钮或导航按钮(单独)的选项。
- 所选选项卡和边框的渐变着色。
- 支持拖放标签,无论是在同一Notebook或另一个Notebook。
- 在活动标签上可以直接有关闭按钮。
- 支持禁用标签。
- 活动/非活动标签和标题的颜色设置。
- 支持以“列/行模式”显示页面,这意味着所有页面将以“平铺”模式显示,而选项卡是隐藏的。
- 可能添加一个自定义面板,以显示徽标或HTML文档或任何你喜欢的。
四、FlatNotebook演示
#wx.lib.agw.flatnotebook.FlatNotebook
import wx
import wx.lib.agw.flatnotebook as fnb
import panelOne, panelTwo, panelThree
class MyFlatNotebook(fnb.FlatNotebook):
def __init__(self, parent):
fnb.FlatNotebook.__init__(self, parent)
pageOne = panelOne.TabPanel(self)
pageTwo = panelTwo.TabPanel(self)
pageThree = panelThree.TabPanel(self)
self.AddPage(pageOne, "页面一")
self.AddPage(pageTwo, "页面二")
self.AddPage(pageThree, "页面三")
class SampleFlatNotebook(wx.Frame):
def __init__(self, *args, **kw):
super(SampleFlatNotebook, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
self.SetTitle("实战wxPython: FlatNotebook演示")
self.SetSize(600, 400)
panel = wx.Panel(self)
notebook = MyFlatNotebook(panel)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(notebook, 1, wx.EXPAND|wx.ALL, 5)
panel.SetSizer(sizer)
self.Layout()
self.Centre()
def main():
app = wx.App()
sample = SampleFlatNotebook(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
运行上面的代码,可以发现FlatNotebook允许用户重新排列选项卡,关闭选项卡,它还包括一些上/下一按钮,以防有太多的选项卡无法一次性在屏幕上显示。
图2:AGW包中FlatNotebook演示
五、wx.lib.agw.aui.AuiNotebook
AGW中AuiNotebook是wx.aui.AuiNotebook的完整实现,可以看作是wx.aui.AuiNotebook的替代品。
#wx.lib.agw.aui.AuiNotebook
import wx
import wx.lib.agw.aui as aui
class MyTabPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent = parent, id = wx.ID_ANY)
sizer = wx.BoxSizer(wx.VERTICAL)
textOne = wx.TextCtrl(self, wx.ID_ANY, "")
textTwo = wx.TextCtrl(self, wx.ID_ANY, "")
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(textOne, 0, wx.ALL, 5)
sizer.Add(textTwo, 0, wx.ALL, 5)
self.SetSizer(sizer)
class SampleAuiNotebook(wx.Frame):
def __init__(self, *args, **kw):
super(SampleAuiNotebook, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
self.SetTitle("实战wxPython: AuiNotebook演示")
self.SetSize(600, 400)
self._mgr = aui.AuiManager()
# tell AuiManager to manage this frame
self._mgr.SetManagedWindow(self)
notebook = aui.AuiNotebook(self)
panelOne = MyTabPanel(notebook)
panelTwo = MyTabPanel(notebook)
notebook.AddPage(panelOne, "页面一", False)
notebook.AddPage(panelTwo, "页面二", False)
self._mgr.AddPane(notebook, aui.AuiPaneInfo().Name("notebook_content").CenterPane().PaneBorder(False))
self._mgr.Update()
self.Centre()
def main():
app = wx.App()
sample = SampleAuiNotebook(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
AGW包中的AuiNotebook和aui.AuiNotbook有一定的区别,它需要一个AuiManager对象。第一步是实例化AuiManager,然后通过它的SetManagedWindow()方法给它一个要管理的框架,然后添加AGW的AuiNotebook对象。
图3:AGW包中AuiNotebook演示
六、本文知识点
- 了解和使用wx.AuiNotebook。
- 了解和使用wx.lib.agw.flatnotebook.FlatNotebook。
- 了解和使用wx.lib.agw.aui.AuiNotebook。
前一篇: