更多組件
■ 菜單欄 Menu
菜單是很多GUI必不可少的一部分。要建立菜單,必須先創建菜單欄:
menuBar = MenuBar() menu = Menu() item1 = menu.Append(-1,"itemA") #itemA是顯示在菜單上的名字 item2 = menu.Append(-1,"itemB") self.Bind(EVT_MENU,self.processItem1,item1) #注意,不是item對象來Bind而是窗口本身來Bind!而且要有第三個參數指出是哪個item觸發事件 menubar.Append(menu,"menuA") #menuA是顯示在菜單欄上的名字 self.SetMenuBar(menubar)
效果:
MenuBar類的一些方法:
Append(Menu對象)
Remove(pos) 刪除位於pos位置的menu項
GetMenuCount()
Menu類的一些方法:
AppendRadioItem(id,label) 添加一個帶單選項的菜單項
AppendCheckItem(id,label) 添加一個帶復選框的菜單項
AppendMenu(id,'submenu name',Menu) 添加一個子菜單,第三個菜單是子菜單的Menu類對象
AppendSeparator() 添加一條分隔線
*有時候菜單欄先於那些主體組件設置的話會引起布局混亂,我也不知道為什么,總之碰到這種情況的話就把self.SetMenuBar(...)的部分放到所有主體組件后面吧
■ 對話框 Dialog
對話框是個可以不依賴某個Frame類存在的類(或者說其本身就是個已經包裝好的Frame類)。默認對話框中並沒可顯示的組件,需要自己添加。另外Dialog類有些特別的方法和子類可以讓程序員簡化代碼。接下來就主要介紹一些預設對話框,by which可以大大簡化程序設計
● 對話框Dialog
Dialog類是所有對話框的一個基本類,自帶一個面板,可以自己往上面添加文字,按鈕等組件。比如下面這樣一個實例的話:
class MyDialog(wx.Dialog): def __init__(self,parent,text): wx.Dialog.__init__(self,parent,-1,u"確認信息",size=(250,140)) sizer = wx.GridSizer(rows=2,cols=1) label = wx.StaticText(self,-1,text) label.SetFont(wx.Font(10,wx.DEFAULT,wx.NORMAL,wx.BOLD)) okbtn = wx.Button(self,wx.ID_OK,u"確認") okbtn.SetDefault() clbtn = wx.Button(self,wx.ID_CANCEL,u"取消") btnSizer = wx.GridSizer(rows=1,cols=2) btnSizer.Add(okbtn,flag=wx.ALIGN_CENTER) btnSizer.Add(clbtn,flag=wx.ALIGN_CENTER) sizer.Add(label,flag=wx.ALIGN_CENTER) sizer.Add(btnSizer,flag=wx.EXPAND) self.SetSizer(sizer)
當我調用這個對話框類創建一個對話框之后,點擊對話框的確定就返回ID_OK,取消則返回ID_CANCEL,可以拿來做判斷了:
myDialog = MyDialog(self,u"確認嗎?") #寫這個類的時候特意加了一個parent參數,來明確是從哪個窗口打開的對話框 result = myDialog.ShowModal() if result == wx.ID_OK: pass elif result == wx.ID_CANCEL: pass
需要注意:不要忘了調用ShowModal()!!!!對話框和MessageBox不一樣,不會自動顯示!!!
● 提示文本框 MessageBox
MessageBox('text','title')兩個參數都是字符串,第一個是提示框中顯示的文字,第二個是提示框的title寫什么。調用這個就會自動生成一個提示信息的對話框,點擊框中的OK按鈕對話框就自動Destroy()(有點像js里的alert)。
● 文本輸入對話框
調用方法
GetTextFromUser('text','title'[,'defaultvalue']) 對話框中有一個文本輸入框,供用戶輸入一段文本。輸入的文本直接返回,所以可以text = GetTextFromUser(...)。如果按取消則會返回空文本。可以設置defaultvalue來確定對話框在打開時的默認值
GetPasswordFromUser('text','title'[,'defaultvalue']) 和上面類似,只是在輸入的時候顯示的是小黑點。然后返回的仍然是密碼的明文
GetNumberFromUser('label','hint','title',defaultvalue,smallest,biggest) 獲取用戶輸入數字的界面。參數比較多,實例如下:
smallest和biggest分別規定了數字的下限和上限
● 列表項對話框
GetSingleChoice("text","title",list) list是個字符串組成的列表,返回選取字符串的值
● 文件對話框
FileDialog(parent,"title","defaultpath","defaultfile",style) 生成一個選擇文件的對話框。defaultpath決定了打開時對話框在哪個目錄里,可以設置成os.getcwd()。defaultfile指在文件對話框下面的文本框里顯示的文件名的默認值。style可以設置一些這個文件對話框的樣式,比如是打開某文件(FD_OPEN),保存某文件(FD_SAVE),打開文件且要求其一定存在(FD_OPEN+FD_FILE_MUST_EXIST),保存文件並提示是否覆蓋(FD_SAVE+FD_OVERWRITE_PROMPT)等等。
FileDialog只能用於選擇文件,如果要選擇目錄的話就要用DirDialog(...)
需要注意的是,FileDialog和DirDialog不像之前提到的那些對話框一樣會自動顯示。顯示這些文件對話框需要手動控制:
代碼:
fdlg = FileDialog(None,"File",os.getcwd(),"testfile",style=FD_OPEN) fdlg.ShowModal() #不是Show而是ShowModal print fdlg.GetPath() #獲取被選擇的文件的路徑,可以對之進行處理
界面:
■ 零碎積累
● wx的源碼中的中文全部都以unicode的形式存儲比較保險,不會出亂碼。直接寫字符串總是會出現各種各樣的亂碼。。