6.2.3 如何添加一个工具栏
菜单栏和工具栏通常是紧密联系在一起的,工具栏的绝大部分功能与菜单 项相对应。在wxPython中,这通过工具栏被敲击时发出wx.EVT_MENU事件,这样就可很容易地在处理菜单项的选择和工具栏的敲击时使用相同的 方法。一个wxPython工具栏是类wx.ToolBar的一个实例,正如我们在第二章中所见的,可以使用框架的方法CreateToolBar()来 创建。和状态栏一样,工具栏的大小也随其父框架的改变而自动改变。工具栏与其它的wxPython窗口一样可以拥有任意的子窗口。工具栏也包含创建工具按 钮的方法。图6.4显示了带有一个工具栏的sketch窗口的一部分,这个工具栏使用了6.2.2中菜单的相应方法,以与菜单项的功能相对应。
图6.4
例6.5中,我们没有重复使用菜单改变画笔颜色的代码,而是使用了新的方法。
例6.5 添加一个工具栏到sketch应用程序
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Sketch Frame",
size=(800,600))
self.sketch = SketchWindow(self, -1)
self.sketch.Bind(wx.EVT_MOTION, self.OnSketchMotion)
self.initStatusBar()
self.createMenuBar()
self.createToolBar()
def createToolBar(self):#1创建工具栏
toolbar = self.CreateToolBar()
for each in self.toolbarData():
self.createSimpleTool(toolbar, *each)
toolbar.AddSeparator()
for each in self.toolbarColorData():
self.createColorTool(toolbar, each)
toolbar.Realize()#2 显现工具栏
def createSimpleTool(self, toolbar, label, filename,help, handler):#3 创建常规工具
if not label:
toolbar.AddSeparator()
return
bmp = wx.Image(filename,
wx.BITMAP_TYPE_BMP).ConvertToBitmap()
tool = toolbar.AddSimpleTool(-1, bmp, label, help)
self.Bind(wx.EVT_MENU, handler, tool)
def toolbarData(self):
return (("New", "new.bmp", "Create new sketch",
self.OnNew),
("", "", "", ""),
("Open", "open.bmp", "Open existing sketch",
self.OnOpen),
("Save", "save.bmp", "Save existing sketch",
self.OnSave))
def createColorTool(self, toolbar, color):#4 创建颜色工具
bmp = self.MakeBitmap(color)
newId = wx.NewId()
tool = toolbar.AddRadioTool(-1, bmp, shortHelp=color)
self.Bind(wx.EVT_MENU, self.OnColor, tool)
def MakeBitmap(self, color):#5 创建纯色的位图
bmp = wx.EmptyBitmap(16, 15)
dc = wx.MemoryDC()
dc.SelectObject(bmp)
dc.SetBackground(wx.Brush(color))
dc.Clear()
dc.SelectObject(wx.NullBitmap)
return bmp
def toolbarColorData(self):
return ("Black", "Red", "Green", "Blue")
def OnColor(self, event):#6 改变画笔颜色以响应工具栏的敲击
menubar = self.GetMenuBar()
itemId = event.GetId()
item = menubar.FindItemById(itemId)
if not item:
toolbar = self.GetToolBar()
item = toolbar.FindById(itemId)
color = item.GetShortHelp()
else:
color = item.GetLabel()
self.sketch.SetColor(color)
#1:工具栏的代码在设置上类似于菜单代码。然而,这里,我们对常规的按钮和单选切换按钮使用了不同的循环设置。
#2:Realize()方法实际上是在工具栏中布局工具栏对象。它在工具栏被显示前必须被调用,如果工具栏中的添加或删除了工具,那么这个方法也必须被调用。
#3:这个方法类似于菜单项的创建。主要区别是工具栏上的工具要求显示位图。这里我们使用了三个位于同一目录下基本位图。在该方法的最后,我们绑定了菜单项所使用的相同的wx.EVT_MENU事件。
#4:颜色工具的创建类似于常规的工具。唯一的不同是使用了一个不同的方法去告诉工具栏它们是单选工具。纯色的位图由MakeBitmap()方法创建。
#5:该方法为单选工具创建纯色的位图。
#6:该方法在原有的基础上添加了搜索正确的工具以具此来改变颜色。然而,所写的代码的问题是,通过菜单项使画笔颜色改变了,但是工具栏上的单选工具的状态没有相应改变,反过来也是一样。
工具栏中的工具在鼠标右键敲击时能够产生wx.EVT_TOOL_RCLICKED类型事件。工具栏也有一些不同的样式,它们被作为位图参数传递给CreateToolBar()。表6.4列出了一些工具栏的样式。
表6.4 wx.ToolBar类的样式
wx.TB_3DBUTTONS:3D外观
wx.TB_HORIZONTAL:默认样式,工具栏水平布置
wx.TB_NOICONS:不为每个工具显示位图
wx.TB_TEXT:根据不同的位图显示简短的帮助文本
wx.TB_VERTICAL:垂直放置工具栏
工具栏比状态栏更复杂。表6.5显示了其常用的一些方法。
表6.5 wx.ToolBar的常用方法
AddControl(control):添加一个任意的wxPython控件到工具栏。相关方法InsertControl()。
AddSeparator():在工具之间放置空格。
AddSimpleTool(id, bitmap,shortHelpString="",kind=wx.ITEM_NORMAL):添加一个简单的带有给定位图的工具到工具栏。shortHelpString作为提示显示。kind的值可以是wx.ITEM_NORMAL, wx.ITEM_CHECKBOX, 或wx.ITEM_RADIO。
AddTool(id, bitmap,bitmap2=wx.NullBitmap,kind=wx.ITEM_NORMAL,shortHelpString="",longHelpString="",
clientData=None):简单工具的其它参数。bitmap2是当该工具被按下时所显示的位图。longHelpString是当指针位于该工具中时显示在状态栏中的帮助字符串。clientData用于将任意的一块数据与工具相联系起来。相关方法InsertTool()。
AddCheckTool(...):添加一个复选框切换工具,所要求参数同AddTool()。
AddRadioTool(...):添加一个单选切换工具,所要求参数同AddTool()。对于连续的未分隔的单选工具被视为一组。
DeleteTool(toolId)
DeleteToolByPosition(x, y):删除所给定的id的工具,或删除给定显示位置的工具。
FindControl(toolId)
FindToolForPosition(x, y):查找并返回给定id或显示位置的工具。
ToggleTool(toolId, toggle):根据布尔什toggle来设置给定id的工具的状态。
下一节,我们将给你展示如何使用通用对话框来得到用户的信息。
菜单栏和工具栏通常是紧密联系在一起的,工具栏的绝大部分功能与菜单 项相对应。在wxPython中,这通过工具栏被敲击时发出wx.EVT_MENU事件,这样就可很容易地在处理菜单项的选择和工具栏的敲击时使用相同的 方法。一个wxPython工具栏是类wx.ToolBar的一个实例,正如我们在第二章中所见的,可以使用框架的方法CreateToolBar()来 创建。和状态栏一样,工具栏的大小也随其父框架的改变而自动改变。工具栏与其它的wxPython窗口一样可以拥有任意的子窗口。工具栏也包含创建工具按 钮的方法。图6.4显示了带有一个工具栏的sketch窗口的一部分,这个工具栏使用了6.2.2中菜单的相应方法,以与菜单项的功能相对应。
图6.4
例6.5中,我们没有重复使用菜单改变画笔颜色的代码,而是使用了新的方法。
例6.5 添加一个工具栏到sketch应用程序
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Sketch Frame",
size=(800,600))
self.sketch = SketchWindow(self, -1)
self.sketch.Bind(wx.EVT_MOTION, self.OnSketchMotion)
self.initStatusBar()
self.createMenuBar()
self.createToolBar()
def createToolBar(self):#1创建工具栏
toolbar = self.CreateToolBar()
for each in self.toolbarData():
self.createSimpleTool(toolbar, *each)
toolbar.AddSeparator()
for each in self.toolbarColorData():
self.createColorTool(toolbar, each)
toolbar.Realize()#2 显现工具栏
def createSimpleTool(self, toolbar, label, filename,help, handler):#3 创建常规工具
if not label:
toolbar.AddSeparator()
return
bmp = wx.Image(filename,
wx.BITMAP_TYPE_BMP).ConvertToBitmap()
tool = toolbar.AddSimpleTool(-1, bmp, label, help)
self.Bind(wx.EVT_MENU, handler, tool)
def toolbarData(self):
return (("New", "new.bmp", "Create new sketch",
self.OnNew),
("", "", "", ""),
("Open", "open.bmp", "Open existing sketch",
self.OnOpen),
("Save", "save.bmp", "Save existing sketch",
self.OnSave))
def createColorTool(self, toolbar, color):#4 创建颜色工具
bmp = self.MakeBitmap(color)
newId = wx.NewId()
tool = toolbar.AddRadioTool(-1, bmp, shortHelp=color)
self.Bind(wx.EVT_MENU, self.OnColor, tool)
def MakeBitmap(self, color):#5 创建纯色的位图
bmp = wx.EmptyBitmap(16, 15)
dc = wx.MemoryDC()
dc.SelectObject(bmp)
dc.SetBackground(wx.Brush(color))
dc.Clear()
dc.SelectObject(wx.NullBitmap)
return bmp
def toolbarColorData(self):
return ("Black", "Red", "Green", "Blue")
def OnColor(self, event):#6 改变画笔颜色以响应工具栏的敲击
menubar = self.GetMenuBar()
itemId = event.GetId()
item = menubar.FindItemById(itemId)
if not item:
toolbar = self.GetToolBar()
item = toolbar.FindById(itemId)
color = item.GetShortHelp()
else:
color = item.GetLabel()
self.sketch.SetColor(color)
#1:工具栏的代码在设置上类似于菜单代码。然而,这里,我们对常规的按钮和单选切换按钮使用了不同的循环设置。
#2:Realize()方法实际上是在工具栏中布局工具栏对象。它在工具栏被显示前必须被调用,如果工具栏中的添加或删除了工具,那么这个方法也必须被调用。
#3:这个方法类似于菜单项的创建。主要区别是工具栏上的工具要求显示位图。这里我们使用了三个位于同一目录下基本位图。在该方法的最后,我们绑定了菜单项所使用的相同的wx.EVT_MENU事件。
#4:颜色工具的创建类似于常规的工具。唯一的不同是使用了一个不同的方法去告诉工具栏它们是单选工具。纯色的位图由MakeBitmap()方法创建。
#5:该方法为单选工具创建纯色的位图。
#6:该方法在原有的基础上添加了搜索正确的工具以具此来改变颜色。然而,所写的代码的问题是,通过菜单项使画笔颜色改变了,但是工具栏上的单选工具的状态没有相应改变,反过来也是一样。
工具栏中的工具在鼠标右键敲击时能够产生wx.EVT_TOOL_RCLICKED类型事件。工具栏也有一些不同的样式,它们被作为位图参数传递给CreateToolBar()。表6.4列出了一些工具栏的样式。
表6.4 wx.ToolBar类的样式
wx.TB_3DBUTTONS:3D外观
wx.TB_HORIZONTAL:默认样式,工具栏水平布置
wx.TB_NOICONS:不为每个工具显示位图
wx.TB_TEXT:根据不同的位图显示简短的帮助文本
wx.TB_VERTICAL:垂直放置工具栏
工具栏比状态栏更复杂。表6.5显示了其常用的一些方法。
表6.5 wx.ToolBar的常用方法
AddControl(control):添加一个任意的wxPython控件到工具栏。相关方法InsertControl()。
AddSeparator():在工具之间放置空格。
AddSimpleTool(id, bitmap,shortHelpString="",kind=wx.ITEM_NORMAL):添加一个简单的带有给定位图的工具到工具栏。shortHelpString作为提示显示。kind的值可以是wx.ITEM_NORMAL, wx.ITEM_CHECKBOX, 或wx.ITEM_RADIO。
AddTool(id, bitmap,bitmap2=wx.NullBitmap,kind=wx.ITEM_NORMAL,shortHelpString="",longHelpString="",
clientData=None):简单工具的其它参数。bitmap2是当该工具被按下时所显示的位图。longHelpString是当指针位于该工具中时显示在状态栏中的帮助字符串。clientData用于将任意的一块数据与工具相联系起来。相关方法InsertTool()。
AddCheckTool(...):添加一个复选框切换工具,所要求参数同AddTool()。
AddRadioTool(...):添加一个单选切换工具,所要求参数同AddTool()。对于连续的未分隔的单选工具被视为一组。
DeleteTool(toolId)
DeleteToolByPosition(x, y):删除所给定的id的工具,或删除给定显示位置的工具。
FindControl(toolId)
FindToolForPosition(x, y):查找并返回给定id或显示位置的工具。
ToggleTool(toolId, toggle):根据布尔什toggle来设置给定id的工具的状态。
下一节,我们将给你展示如何使用通用对话框来得到用户的信息。