工具栏也是GUI程序一个常见的组成部分,使用工具栏可以快速访问应用程序最常见的命令。在wxPython中,工具栏通常位于wx.Frame中的菜单栏下方,由按钮或者其他控件构成工具栏, 工具栏由wx.ToolBar类来实现。
wx.ToolBar
在wxPython中,可以使用wx.Frame.CreateToolBar()来创建一个由wx.Frame调用管理的工具栏,也可以创建一个工具栏,添加到布局中,再设置到窗口中去。工具栏添加完所需的所有工具后,必须调用Realize 以有效地构造和显示工具栏。
wx.ToolBar类继承关系如下图:
wx.ToolBar工具栏支持以窗口样式:
- wx.TB_FLAT:使工具栏具有平坦外观(仅Windows和GTK)。
- wx.TB_DOCKABLE:使工具栏可浮动和可固定(仅适用于GTK)。
- wx.TB_HORIZONTAL:指定水平布局(默认)。
- wx.TB_VERTICAL:指定垂直布局。
- wx.TB_TEXT:在工具栏按钮中显示文本;默认情况下,仅显示图标。
- wx.TB_NOICONS:在工具栏按钮中未指定任何图标;默认情况下显示它们。
- wx.TB_NODIVIDER:在工具栏上方不指定分隔线(边界)(仅Windows)
- wx.TB_NOALIGN:指定不与父窗口对齐(仅Windows,不是很有用)。
- wx.TB_HORZ_LAYOUT:显示文字和图标,而不是垂直堆叠(仅Windows和GTK 2)。此样式必须与一起使用 TB_TEXT。
- wx.TB_HORZ_TEXT:TB_HORZ_LAYOUT 和的 组合 TB_TEXT。
- wx.TB_NO_TOOLTIPS:当鼠标悬停在工具上方时,请勿显示该工具的简短帮助工具提示。
- wx.TB_BOTTOM:将工具栏与父窗口底部对齐。
- wx.TB_RIGHT:将工具栏与父窗口的右侧对齐。
- wx.TB_DEFAULT_STYLE: TB_HORIZONTAL 风格。
wx.ToolBar常用方法:
- AddCheckTool(self, toolId, label, bitmap1, bmpDisabled=NullBitmap, shortHelp="", longHelp="", clientData=None):向工具栏添加新的复选(或切换)工具。
- AddControl(self, control, label=""):将任何控件添加到工具栏,通常是 wx.ComboBox。
- AddRadioTool(self, toolId, label, bitmap1, bmpDisabled=NullBitmap, shortHelp="", longHelp="", clientData=None):向工具栏添加新的单选工具。
- AddSeparator(self):添加用于分隔工具组的分隔符。
- AddStretchableSpace(self):在工具栏上添加一个可拉伸的空间。
- AddTool (self, tool):将tool添加到工具栏。
- AddTool (self, toolId, label, bitmap, shortHelp=””, kind=ITEM_NORMAL):向工具栏添加一个工具。
- AddTool (self, toolId, label, bitmap, bmpDisabled, kind=ITEM_NORMAL, shortHelp=””, longHelp=””, clientData=None):向工具栏添加一个工具。
- ClearTools(self):删除工具栏中的所有工具。
- CreateTool (self, control, label):创建一个新的工具栏控件。
- DeleteTool(self, toolId):从工具栏中删除指定的工具并释放它。
- RemoveTool(self, id):从工具栏中删除指定的工具但不释放它。
- Realize(self):添加完工具后,调用此函数完成工具栏的构建。
- SetDropdownMenu(self, id, menu):设置由其id给出的工具的下拉菜单。
- SetMargins (self, size):设置工具栏的边距。
- SetToolBitmapSize(self, size):设置每个工具的位图缺省尺寸,系统缺省值为16x15像素。
简单工具栏演示
在下面的示例中,我们使用wx.Frame.CreateToolBar()方法来创建工具栏。
import wx
import os
class Example(wx.Frame):
def __init__(self, *args, **kwargs):
super(Example, self).__init__(*args, **kwargs)
self.SetTitle('实战wxPython: 工具栏示例')
self.SetSize(400, 300)
self.InitUi()
self.Centre()
def InitUi(self):
toolbar = self.CreateToolBar()
quit = toolbar.AddTool(wx.ID_ANY, '退出', wx.Bitmap(os.path.dirname(__file__) + '/file_exit.png'))
toolbar.Realize()
self.Bind(wx.EVT_TOOL, self.OnQuit, quit)
def OnQuit(self, e):
self.Close()
def main():
app = wx.App()
window = Example(None)
window.Show()
app.MainLoop()
if __name__ == '__main__':
main()
在示例程序中,创建一带有一个按钮的工具栏,但点击该按钮时,将关闭应用程序。
toolbar = self.CreateToolBar()
创建一个工具栏。默认情况下,工具栏是水平放置,没有边框,只显示图标。
quit = toolbar.AddTool(wx.ID_ANY, '退出', wx.Bitmap(os.path.dirname(__file__) + '/file_exit.png'))
调用AddTool()方法为工具栏添加一个工具。第二个参数是工具的标签,第三个参数是工具的图像。注意,默认样式下标签不可见仅显示图标。
toolbar.Realize()
最后调用Realize() 方法,完成工具栏的构建。
self.Bind(wx.EVT_TOOL, self.OnQuit, quit)
使用wx.EVT_TOOL来绑定处理工具栏事件。
简单工具栏
创建多个工具栏
要在程序中添加多个工具栏,必须使用其他方式来实现
import wx
import os
class Example(wx.Frame):
def __init__(self, *args, **kwargs):
super(Example, self).__init__(*args, **kwargs)
self.SetTitle('实战wxPython: 多工具栏示例')
self.SetSize(400, 300)
self.InitUi()
self.Centre()
def InitUi(self):
vbox = wx.BoxSizer(wx.VERTICAL)
toolbar1 = wx.ToolBar(self)
toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap(os.path.dirname(__file__) + '/file_new.png'))
toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap(os.path.dirname(__file__) + '/file_open.png'))
toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap(os.path.dirname(__file__) + '/file_save.png'))
toolbar1.Realize()
toolbar2 = wx.ToolBar(self)
quit = toolbar2.AddTool(wx.ID_EXIT, '退出', wx.Bitmap(os.path.dirname(__file__) + '/file_exit.png'))
toolbar2.Realize()
vbox.Add(toolbar1, 0, wx.EXPAND)
vbox.Add(toolbar2, 0, wx.EXPAND)
self.Bind(wx.EVT_TOOL, self.OnQuit, quit)
self.SetSizer(vbox)
def OnQuit(self, e):
self.Close()
def main():
app = wx.App()
window = Example(None)
window.Show()
app.MainLoop()
if __name__ == '__main__':
main()
在上面的示例中,创建了两个工具栏
toolbar1 = wx.ToolBar(self)
... ...
toolbar2 = wx.ToolBar(self)
创建两个工具栏对象,并将其添加到垂直布局中,运行结果如下图:
多工具栏示例
启用/禁用工具栏中的控件
在下面的例子中,演示了如何启用和禁用工具栏按钮。
import wx
import os
class Example(wx.Frame):
def __init__(self, *args, **kwargs):
super(Example, self).__init__(*args, **kwargs)
self.SetTitle('实战wxPython: 禁用/启用工具栏按钮')
self.SetSize(400, 300)
self.InitUi()
self.Centre()
def InitUi(self):
self.count = 5
self.toolbar = self.CreateToolBar()
tundo = self.toolbar.AddTool(wx.ID_UNDO, '', wx.Bitmap(os.path.dirname(__file__) + '/undo.png'))
tredo = self.toolbar.AddTool(wx.ID_REDO, '', wx.Bitmap(os.path.dirname(__file__) + '/redo.png'))
self.toolbar.EnableTool(wx.ID_REDO, False)
self.toolbar.AddSeparator()
texit = self.toolbar.AddTool(wx.ID_EXIT, '退出', wx.Bitmap(os.path.dirname(__file__) + '/file_exit.png'))
self.toolbar.Realize()
self.Bind(wx.EVT_TOOL, self.OnQuit, texit)
self.Bind(wx.EVT_TOOL, self.OnUndo, tundo)
self.Bind(wx.EVT_TOOL, self.OnRedo, tredo)
def OnQuit(self, e):
self.Close()
def OnUndo(self, e):
if self.count > 1 and self.count <= 5:
self.count -= 1
if self.count == 1:
self.toolbar.EnableTool(wx.ID_UNDO, False)
if self.count == 4:
self.toolbar.EnableTool(wx.ID_REDO, True)
def OnRedo(self, e):
if self.count < 5 and self.count >= 1:
self.count += 1
if self.count == 5:
self.toolbar.EnableTool(wx.ID_REDO, False)
if self.count == 2:
self.toolbar.EnableTool(wx.ID_UNDO, True)
def main():
app = wx.App()
window = Example(None)
window.Show()
app.MainLoop()
if __name__ == '__main__':
main()
在示例中,创建了三个工具栏按钮,一个按钮用于退出应用程序。其他两个按钮是撤消和重做按钮。它们模拟应用程序中的撤消/重做功能。进行了4次更改后。撤消和重做按钮相应地被禁用。
self.toolbar.EnableTool(wx.ID_REDO, False)
self.toolbar.AddSeparator()
通过调用 EnableTool()方法来实现禁用重做按钮。调用AddSeparator()方法添加一条垂直线(该垂线可能显示为空白,情况视系统而定)将各种按钮组分开以在工具栏中创建一些逻辑组。
在OnUndo()和OnRedo()方法中,我们模拟撤消和重做功能,如果没有什么可撤消/重做的,则相应按钮被禁用, 对应重启重做/撤消按钮。
撤消重做
本文知识点
- 了解wx.ToolBar;
- 使用wx.Frame.CreateToolBar()来创建一个由wx.Frame调用管理的工具栏;
- 在窗口中添加多个工具栏;
- 启用和禁用工具栏中的控件。