实战wxPython:008 - 为应用添加工具栏

工具栏也是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(selftoolIdlabelbitmap1bmpDisabled=NullBitmapshortHelp=""longHelp=""clientData=None):向工具栏添加新的复选(或切换)工具。
  • AddControl(selfcontrollabel=""):将任何控件添加到工具栏,通常是 wx.ComboBox。
  • AddRadioTool(selftoolIdlabelbitmap1bmpDisabled=NullBitmapshortHelp=""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(selftoolId):从工具栏中删除指定的工具并释放它。
  • RemoveTool(selfid):从工具栏中删除指定的工具但不释放它。
  • Realize(self):添加完工具后,调用此函数完成工具栏的构建。
  • SetDropdownMenu(selfidmenu):设置由其id给出的工具的下拉菜单。
  • SetMargins (self, size):设置工具栏的边距。
  • SetToolBitmapSize(selfsize):设置每个工具的位图缺省尺寸,系统缺省值为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调用管理的工具栏;
  • 在窗口中添加多个工具栏;
  • 启用和禁用工具栏中的控件。

前一篇:实战wxPython:007 - 复选菜单项和上下文菜单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值