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的工具的狀態。
下一節,我們將給你展示如何使用通用對話方塊來得到使用者的資訊。