乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python實例講解——wxPython的基本控件實現(xiàn)

       JasonQue 2012-03-12

      使用按鈕工作

       

      wxPython 中有很多不同類型的按鈕。這一節(jié),我們將討論文本按鈕、位圖按鈕、開關按鈕(toggle buttons )和通用(generic )按鈕。

       

      如何生成一個按鈕?

       

      在第一部分(part 1)中,我們已經(jīng)說明了幾個按鈕的例子,所以這里我們只簡短的涉及它的一些基本的東西。圖7.4顯示了一個簡單的按鈕。

       

      圖7.4

      w7.4.gif

       

      使用按鈕是非常簡單的。例7.4顯示了該簡單按鈕的代碼。

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class ButtonFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Button Example',   
      6.                 size=(300100))  
      7.         panel = wx.Panel(self, -1)  
      8.         self.button = wx.Button(panel, -1"Hello", pos=(5020))  
      9.         self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)  
      10.         self.button.SetDefault()  
      11.   
      12.     def OnClick(self, event):  
      13.         self.button.SetLabel("Clicked")  
      14.           
      15. if __name__ == '__main__':  
      16.     app = wx.PySimpleApp()  
      17.     frame = ButtonFrame()  
      18.     frame.Show()  
      19.     app.MainLoop()  
       

      wx.Button 的構造函數(shù)類似于我們已經(jīng)看到過的,如下所示:

      wx.Button(parent , id , label , pos , size =wxDefaultSize , style =0, validator , name ="button ")

       

      參數(shù)label 是顯示在按鈕上的文本。它可以在程序運行期間使用SetLabel() 來改變,并且使用GetLabel() 來獲取。另外兩個有用的方法是GetDefaultSize()SetDefault() 。GetDefaultSize() 返回系統(tǒng)默認按鈕的尺寸(對于框架間的一致性是有用的);SetDefault() 設置按鈕為對話框或框架的默認按鈕。默認按鈕的繪制不同于其它按鈕,它在對話框獲得焦點時,通常按下回車鍵被激活。

       

      wx.Button 類有一個跨平臺的樣式標記:wx.BU_EXACTFIT 。如果定義了這個標記,那么按鈕就不把系統(tǒng)默認的尺寸作為最小的尺寸,而是把能夠恰好填充標簽的尺寸作為最小尺寸。如果本地窗口部件支持的話,你可以使用標記wx.BU_LEFT , wx.BU_RIGHT , wx.BU_TOP , 和 wx.BU_BOTTOM 來改變按鈕中標簽的對齊方式。每個標記對齊標簽到邊,該邊你根據(jù)標記的名字可以知道。正如我們在第一部分中所討論過的,wx.Button 在被敲擊時觸發(fā)一個命令事件,事件類型是EVT_BUTTON 。

       

      如何生成一個位圖按鈕?

       

      有時候,你可能想在你的按鈕上顯示一個圖片,而非一個文本標簽,如圖7.5所示。

       

      w7.5.gif

       

      wxPython 中,使用類wx.BitmapButton 來創(chuàng)建一個位圖按鈕。處理一個wx.BitmapButton 的代碼是與通用按鈕的代碼非常類似的,例7.5顯示了產(chǎn)生7.5的代碼。

       

      例7.5 創(chuàng)建一個位圖按鈕

       

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class BitmapButtonFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Bitmap Button Example',   
      6.                 size=(200150))  
      7.         panel = wx.Panel(self, -1)  
      8.         bmp = wx.Image("bitmap.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()  
      9.         self.button = wx.BitmapButton(panel, -1, bmp, pos=(1020))  
      10.         self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)  
      11.         self.button.SetDefault()  
      12.         self.button2 = wx.BitmapButton(panel, -1, bmp, pos=(10020),   
      13.             style=0)  
      14.         self.Bind(wx.EVT_BUTTON, self.OnClick, self.button2)  
      15.   
      16.     def OnClick(self, event):  
      17.         self.Destroy()  
      18.           
      19. if __name__ == '__main__':  
      20.     app = wx.PySimpleApp()  
      21.     frame = BitmapButtonFrame()  
      22.     frame.Show()  
      23.     app.MainLoop()  
       

      與普通按鈕的主要的區(qū)別是你需要提供一個位圖,而非一個標簽。否則,構造器和大部分代碼是與文本按鈕的例子相同的。位圖按鈕在被敲擊時同樣產(chǎn)生EVT_BUTTON 事件。

       

      關于位圖按鈕有幾個有趣的特性。首先,一個樣式標記wx.BU_AUTODRAW ,它是默認的。如果該標記是打開的,那么位圖將帶有一個3D的邊框,這使它看起來像一個文本按鈕(圖7.5中的左按鈕),并且按鈕比原位圖大幾個像素。如果該標記是關閉的,則位圖被簡單地繪制為按鈕而沒有邊框。通過設置style =0使圖7.5中右邊的按鈕關閉默認設置,它沒有了3D的效果。

       

      默認情況下,給wxPython 傳遞單個位圖作為主顯示的位圖,在當按鈕被按下或獲得焦點或無效時,wxPython 自動創(chuàng)建一個標準的派生自主顯示的位圖的位圖作為此時顯示在按鈕上的位圖。如果自動創(chuàng)建的位圖不是你想要的,你可以使用下面的方法: SetBitmapDisabled() , SetBitmapFocus() ,SetBitmapLabel() , 和SetBitmap -Selected() 顯式地告訴wxPython 你要使用哪個位圖。這些方法都要求一個wx.Bitmap 對象作為參數(shù),并且它們都有相應的get *()方法。

       

      你不能通過使用標準的wxWidgets C++庫來合并一個位圖和文本。你可以創(chuàng)建一個包含文本的位圖。然而,正如我們將在通用按鈕問題討論中所看到的,wxPython 有額外的方法來實現(xiàn)這一合并行為。

       

       

      === 如何創(chuàng)建開關按鈕(toggle button )?===

       

      你可以使用wx.ToggleButton 創(chuàng)建一個開關按鈕(toggle button )。開關按鈕(toggle button )看起來十分像文本按鈕,但它的行為更像復選框,它的選擇或非選擇狀態(tài)是可視化的。換句話說,當你按下一個開關按鈕(toggle button )時,它將一直保持被按下的狀態(tài)直到你再次敲擊它。

       

      wx.ToggleButton 與父類wx.Button 之間只有丙個區(qū)別:

      1、當被敲擊時,wx.ToggleButton 發(fā)送一個EVT_TOGGLEBUTTON 事件。

      2、wx.ToggleButtonGetValue()SetValue() 方法,它們處理按鈕的二進制狀態(tài)。

       

      開關按鈕(toggle button )是有用的,它相對于復選框是另一好的選擇,特別是在工具欄中。記住,你不能使用wxWidgets 提供的對象來將開關按鈕(toggle button )與位圖按鈕合并,但是wxPython 有一個通用按鈕類,它提供了這種行為,我們將在下一節(jié)對其作討論。

       

      什么是通用按鈕,我為什么要使用它?

       

      通用按鈕是一個完全用Python 重新實現(xiàn)的一個按鈕窗口部件,回避了本地系統(tǒng)窗口部件的用法。它的父類是wx.lib.buttons. GenButton 。通用按鈕有通用位圖和切換按鈕。

       

      這兒有幾個使用通用按鈕的原因:

      1、通用按鈕比本地按鈕具有更好的跨平臺的外觀。另一方面,通用按鈕可能在具體的系統(tǒng)上看起來與本地按鈕有些微的不同。

      2、使用通用按鈕,你對它的外觀有更多的控制權,并且能改變屬性,如3D斜面的寬度和顏色,而這對于本地控件可能是不允許的。

      3、通用按鈕類允許特性的合并,而wxWidget 按鈕不行。比如GenBitmapTextButton 允許文本標簽和位圖的組合,GenBitmapToggleButton 實現(xiàn)一個位圖切換按鈕。

      4、如果你正在創(chuàng)建一個按鈕類,使用通用按鈕是較容易的。由于其代碼和參數(shù)是用Python 寫的,所以當創(chuàng)建一個新的子類的時候,對于檢查和覆蓋,它們的可用性更好。

       

      圖7.6顯示了實際的通用按鈕和常規(guī)按鈕的對照。

       

      圖7.6

      w7.6.gif

       

      例7.6顯示了產(chǎn)生圖7.6的代碼。第二個導入語句:import wx.lib.buttons as buttons ,是必須的,它使得通用按鈕類可用。

       

      例7.6 創(chuàng)建和使用wxPython 的通用按鈕

       

      Python代碼  收藏代碼
      1. import wx  
      2. import wx.lib.buttons as buttons  
      3.   
      4. class GenericButtonFrame(wx.Frame):  
      5.     def __init__(self):  
      6.         wx.Frame.__init__(selfNone, -1'Generic Button Example',   
      7.                 size=(500350))  
      8.         panel = wx.Panel(self, -1)  
      9.   
      10.         sizer = wx.FlexGridSizer(132020)  
      11.         b = wx.Button(panel, -1"A wx.Button")  
      12.         b.SetDefault()  
      13.         sizer.Add(b)  
      14.   
      15.         b = wx.Button(panel, -1"non-default wx.Button")  
      16.         sizer.Add(b)  
      17.         sizer.Add((10,10))  
      18.   
      19.         b = buttons.GenButton(panel, -1'Genric Button')#基本的通用按鈕  
      20.         sizer.Add(b)  
      21.   
      22.         b = buttons.GenButton(panel, -1'disabled Generic')#無效的通用按鈕  
      23.         b.Enable(False)  
      24.         sizer.Add(b)  
      25.   
      26.         b = buttons.GenButton(panel, -1'bigger')#自定義尺寸和顏色的按鈕  
      27.         b.SetFont(wx.Font(20, wx.SWISS, wx.NORMAL, wx.BOLD, False))  
      28.         b.SetBezelWidth(5)  
      29.         b.SetBackgroundColour("Navy")  
      30.         b.SetForegroundColour("white")  
      31.         b.SetToolTipString("This is a BIG button...")  
      32.         sizer.Add(b)    
      33.   
      34.         bmp = wx.Image("bitmap.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()  
      35.         b = buttons.GenBitmapButton(panel, -1, bmp)#通用位圖按鈕  
      36.         sizer.Add(b)  
      37.   
      38.         b = buttons.GenBitmapToggleButton(panel, -1, bmp)#通用位圖開關按鈕  
      39.         sizer.Add(b)  
      40.           
      41.         b = buttons.GenBitmapTextButton(panel, -1, bmp, "Bitmapped Text",  
      42.                 size=(17575))#位圖文本按鈕  
      43.         b.SetUseFocusIndicator(False)  
      44.         sizer.Add(b)  
      45.   
      46.         b = buttons.GenToggleButton(panel, -1"Toggle Button")#通用開關按鈕  
      47.         sizer.Add(b)  
      48.   
      49.         panel.SetSizer(sizer)  
      50.   
      51. if __name__ == '__main__':  
      52.     app = wx.PySimpleApp()  
      53.     frame = GenericButtonFrame()  
      54.     frame.Show()  
      55.     app.MainLoop()    
       

      在例7.6中,通用按鈕的用法非常類似于常規(guī)按鈕。通用按鈕產(chǎn)生與常規(guī)按鈕同樣的EVT_BUTTONEVT_TOGGLEBUTTON 事件。通用按鈕引入了GetBevelWidth()SetBevelWidth() 方法來改變3D斜面效果。它們用在了圖7.6中大按鈕上。

       

      通用位圖按鈕類GenBitmapButton 工作的像標準的wxPython 版本。在構造器中。GenBitmapTextButton 要求先要一個位圖,然后是文本。通用類GenToggleButton ,GenBitmapToggleButton ,和 GenBitmapTextToggleButton 與非開關版的一樣,并且對于處理按鈕的開關狀態(tài)響應于GetToggle()SetToggle() 。

       

      在下一節(jié),我們將討論關于使你的用戶能夠輸入或觀看一個數(shù)字值的方案。

       

      輸入并顯示數(shù)字

       

      有時你想要顯示圖形化的數(shù)字信息,或你想讓用戶不必使用鍵盤來輸入一個數(shù)字量。在這一節(jié),我們將瀏覽wxPython 中用于數(shù)字輸入和顯示的工具:滑塊(slider )、微調(diào)控制框和顯示量度的標尺。

       

      如何生成一個滑塊?

       

      滑塊是一個窗口部件,它允許用戶通過在該控件的尺度內(nèi)拖動指示器來選擇一個數(shù)值。在wxPython 中,該控件類是wx.Slider ,它包括了滑塊的當前值的只讀文本的顯示。圖7.7顯示了水平和垂直滑塊的例子。

       

      圖7.7

      w7.7.gif

       

      滑塊的基本使用是十分簡單的,但是你可以增加許多事件。

       

      如何使用滑塊

       

      例7.7是產(chǎn)生圖7.7的例子。

       

      例7.7 水平和垂直滑塊的顯示代碼

       

       

      Python代碼  收藏代碼
      1. import wx   
      2.   
      3. class SliderFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Slider Example',   
      6.                 size=(300350))  
      7.         panel = wx.Panel(self, -1)  
      8.         self.count = 0  
      9.         slider = wx.Slider(panel, 100251100, pos=(1010),  
      10.                 size=(250, -1),  
      11.                 style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )  
      12.         slider.SetTickFreq(51)  
      13.         slider = wx.Slider(panel, 100251100, pos=(12570),  
      14.                 size=(-1250),  
      15.                 style=wx.SL_VERTICAL | wx.SL_AUTOTICKS | wx.SL_LABELS )  
      16.         slider.SetTickFreq(201)  
      17.           
      18. if __name__ == '__main__':  
      19.     app = wx.PySimpleApp()  
      20.     frame = SliderFrame()  
      21.     frame.Show()  
      22.     app.MainLoop()   
       

       

      通常,當你使用wx.Slider 類時,所有你所需要的就是一個構造函數(shù),它與別的調(diào)用不同,如下所示:

      wx.Slider(parent , id , value , minValue , maxValue , pos =wxDefaultPosition , size =wx.DefaultSize , style =wx.SL_HORIZONTAL , validator =wx.DefaultValidator , name ="slider ")

      value 是滑塊的初始值,而minValuemaxValue 是兩端的值。

       

      使用滑塊樣式工作

       

      滑塊的樣式管理滑塊的位置和方向,如下表7.9所示。

       

      表7.9 wx.Slider 的樣式

       

      wx.SL_AUTOTICKS :如果設置這個樣式,則滑塊將顯示刻度??潭乳g的間隔通過SetTickFreq 方法來控制。

      wx.SL_HORIZONTAL :水平滑塊。這是默認值。

      wx.SL_LABELS :如果設置這個樣式,那么滑塊將顯示兩頭的值和滑塊的當前只讀值。有些平臺可能不會顯示當前值。

      wx.SL_LEFT :用于垂直滑塊,刻度位于滑塊的左邊。

      wx.SL_RIGHT :用于垂直滑塊,刻度位于滑塊的右邊。

      wx.SL_TOP :用于水平滑塊,刻度位于滑塊的上部。

      wx.SL_VERTICAL :垂直滑塊。

       

      如果你想通過改變滑塊中的值來影響你的應用程序中的其它的部分,那么這兒有幾個你可使用的事件。這些事件與窗口滾動條所發(fā)出的是相同的,詳細的說明參見第8章的滾動條部分。

       

      表7.10列出了你可用于滑塊的Set *()方法。每個Set *()方法都有一個對應的Get 方法——Get 方法的描述參考其對應的Set *()方法。

       

      表7.10

       

      GetRange() SetRange(minValue , maxValue) :設置滑塊的兩端值。

      GetTickFreq() SetTickFreq(n , pos) :使用參數(shù)n設置刻度的間隔。參數(shù)pos 沒有被使用,但是它仍然是必要的,將它設置為1。

      GetLineSize() SetLineSize(lineSize) :設置你每按一下方向鍵,滑塊所增加或減少的值。

      GetPageSize() SetPageSize(pageSize) :設置你每按一下PgUpPgDn 鍵,滑塊所增加或減少的值。

      GetValue() SetValue(value) :設置滑塊的值。

       

      盡管滑塊提供了一個可能范圍內(nèi)的值的快速的可視化的表示,但是它們也有兩個缺點。其一是它們占據(jù)了許多的空間,另外就是使用鼠標精確地設置滑塊是困難的。下面我們將討論的微調(diào)控制器解決了上面的這兩個問題。

       

      如何得到那些靈巧的上下箭頭按鈕?

       

      微調(diào)控制器是文本控件和一對箭頭按鈕的組合,它用于調(diào)整數(shù)字值,并且在你要求一個最小限度的屏幕空間的時候,它是替代滑塊的最好選擇。圖7.8顯示了wxPython 的微調(diào)控制器控件。

       

      圖7.8

      w7.8.gif

       

      wxPython 中,類wx.SpinCtrl 管理微調(diào)按鈕和相應的文本顯示。在接下來的部分,我們將創(chuàng)建一個微調(diào)控制器。

       

      如何創(chuàng)建一個微調(diào)控制器

       

      要使用wx.SpinCtrl 來改變值,可通過按箭頭按鈕或通過在文本控件中輸入。鍵入的非數(shù)字的文本將被忽略,盡管控件顯示的是鍵入的非數(shù)字的文本。一個超出范圍的值將被認作是相應的最大或最小值,盡管顯示的是你輸入的值。例7.8顯示了wx.SpinCtrl 的用法。

       

      例7.8 使用wx.SpinCtrl

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class SpinnerFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Spinner Example',   
      6.                 size=(100100))  
      7.         panel = wx.Panel(self, -1)  
      8.         sc = wx.SpinCtrl(panel, -1, "", (3020), (80, -1))  
      9.         sc.SetRange(1,100)  
      10.         sc.SetValue(5)  
      11.   
      12. if __name__ == '__main__':  
      13.     app = wx.PySimpleApp()  
      14.     SpinnerFrame().Show()  
      15.     app.MainLoop()     
       

       

      幾乎微調(diào)控件所有復雜的東西都是在其構造函數(shù)中,其構造函數(shù)如下:

       

      Python代碼  收藏代碼
      1. wx.SpinCtrl(parent, id=-1, value=wx.EmptyString, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.SP_ARROW_KEYS, min=0, max=100, initial=0, name="wxSpinCtrl")   
       

       

      參數(shù)value 是虛設的。使用initial 參數(shù)來設置該控件的值,并使用minmax 來設置該控件的范圍。

      對于wx.SpinCtrl 有兩個樣式標記。默認樣式是wx.SP_ARROW_KEYS ,它允許用戶通過鍵盤上的上下箭頭鍵來改變控件的值。樣式wx.SP_WRAP 使得控件中的值可以循環(huán)改變,也就是說你通過箭頭按鈕改變控件中的值到最大或最小值時,如果再繼續(xù),值將變?yōu)樽钚』蜃畲?,從一個極端到另一個極端。

       

      你也可以捕獲EVT_SPINCTRL 事件,它在當控件的值改變時產(chǎn)生(即使改變是直接由文本輸入引起的)。如果文本改變了,將引發(fā)一個EVT_TEXT 事件,就如同你使用一個單獨的文本控件時一樣。

       

      如例7.8所示,你可以使用SetRange(minVal , maxVal)SetValue(value) 方法來設置范圍和值。SetValue() 函數(shù)要求一個字符串或一個整數(shù)。要得到值,使用方法:GetValue() (它返回一個整數(shù)), GetMin() , 和 GetMax() 。

       

      當你需要對微調(diào)控制器的行為有更多的控制時,如允許浮點數(shù)或一個字符串的列表,你可以把一個wx.SpinButton 和一個wx.TextCtrl 放到一起,并在它們之間建立一個聯(lián)系。然后捕獲來自wx.SpinButton 的事件,并更新wx.TextCtrl 中的值。

       

      如何生成一個進度條?

       

      如果你只想圖形化地顯示一個數(shù)字值而不允許用戶改變它,那么使用相應的wxPython 窗口部件wx.Gauge 。 相關的例子就是圖7.9所顯示的進度條。

       

      圖7.9

      w7.9.gif

       

      例7.9顯示了產(chǎn)生圖7.9的代碼。與本章中許多別的例子不同的是,這里我們增加了一個事件處理器。下面的代碼在空閉時調(diào)整標尺的值,使得值周而復始的變化。

       

      例7.9 顯示并更新一個wx.Gauge

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class GaugeFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Gauge Example',   
      6.                 size=(350150))  
      7.         panel = wx.Panel(self, -1)  
      8.         self.count = 0  
      9.         self.gauge = wx.Gauge(panel, -150, (2050), (25025))  
      10.         self.gauge.SetBezelFace(3)  
      11.         self.gauge.SetShadowWidth(3)  
      12.         self.Bind(wx.EVT_IDLE, self.OnIdle)  
      13.   
      14.     def OnIdle(self, event):  
      15.         self.count = self.count + 1  
      16.         if self.count  == 50:  
      17.             self.count = 0  
      18.         self.gauge.SetValue(self.count)  
      19.           
      20. if __name__ == '__main__':  
      21.     app = wx.PySimpleApp()  
      22.     GaugeFrame().Show()  
      23.     app.MainLoop()    
       

      wx.Gauge 的構造函數(shù)類似于其它的數(shù)字的窗口部件:

       

      Python代碼  收藏代碼
      1. wx.Gauge(parent, id, range, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.GA_HORIZONTAL, validator=wx.DefaultValidator, name="gauge")   
       

       

      當你使用參數(shù)range 來指定數(shù)字值時,該值代表標尺的上限,而下限總是0。默認樣式wx.GA_HORIZONTAL 提供了一個水平條。要將它旋轉(zhuǎn)90度,使用wx.GA_VERTICAL 樣式。如果你是在Windows 上,那么樣式wx.GA_PROGRESSBAR 給你的是來自Windows 工具包的本地化的進度條。

       

      作為一個只讀控件,wx.Gauge 沒有事件。然而,它的屬性你可以設置。你可以使用GetValue() , Set -Value(pos) , GetRange() , 和 SetRange(range) 來調(diào)整它的值和范圍。如果你是在Windows 上,并且沒有使用本地進度條樣式,那么你可以使用SetBezelFace(width) and SetShadowWidth() 來改變3D效果的寬度。

       

      給用戶以選擇

       

      幾乎每個應用程序都要求用戶在一套預先定義的選項間進行選擇。在wxPython 中,有多種窗口部件幫助用戶處理這種任務,包括復選框、單選按鈕、列表框和組合框。接下來的部分將介紹這些窗口部件。

       

      如何創(chuàng)建一個復選框?

       

      復選框是一個帶有文本標簽的開關按鈕。復選框通常成組的方式顯示,但是每個復選框的開關狀態(tài)是相互獨立的。當你有一個或多個需要明確的開關狀態(tài)的選項時,可以使用復選框。圖7.10顯示了一組復選框。

       

      圖7.10

      w7.10.gif

       

      wxPython 中復選框很容易使用。它們是wx.CheckBox 類的實例,并且通過把它們一起放入一個父容器中可以讓它們在一起顯示。例7.10提供了生成圖7.10的代碼。

       

      例7.10 插入三個復選框到一個框架中

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class CheckBoxFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Checkbox Example',   
      6.                 size=(150200))  
      7.         panel = wx.Panel(self, -1)  
      8.         wx.CheckBox(panel, -1"Alpha", (3540), (15020))  
      9.         wx.CheckBox(panel, -1"Beta", (3560), (15020))  
      10.         wx.CheckBox(panel, -1"Gamma", (3580), (15020))  
      11.   
      12. if __name__ == '__main__':  
      13.     app = wx.PySimpleApp()  
      14.     CheckBoxFrame().Show()  
      15.     app.MainLoop()    
       

      wx.CheckBox 有一個典型的wxPython 構造函數(shù):

       

      Python代碼  收藏代碼
      1. wx.CheckBox(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="checkBox")   
       

       

      label 參數(shù)是復選框的標簽文本。復選框沒有樣式標記,但是它們產(chǎn)生屬于自己的獨一無二的命令事件:EVT_CHECKBOX 。wx.CheckBox 的開關狀態(tài)可以使用GetValue()SetValue(state) 方法來訪問,并且其值是一個布爾值。IsChecked() 方法等同于GetValue() 方法,只是為了讓代碼看起來更易明白。

       

      如何創(chuàng)建一組單選按鈕(radio button )?

      單選按鈕是一種允許用戶從幾個選項中選擇其一的窗口部件。與復選框不同,單選按鈕是顯式地成組配置,并且只能選擇其中一個選項。當選擇了新的選項時,上次的選擇就關閉了。單選按鈕的使用比復選框復雜些,因為它需要被組織到一組中以便使用。radio button 的名字得自于老式轎車上有著同樣行為的成組的選擇按鈕。

       

      wxPython 中,有兩種方法可以創(chuàng)建一組單選按鈕。其一,wx.RadioButton ,它要求你一次創(chuàng)建一個按鈕,而wx.RadioBox 使你可以使用單一對象來配置完整的一組按鈕,這些按鈕顯示在一個矩形中。

       

      wx.RadioButton 類更簡單些,在單選按鈕對其它窗口部件有直接影響或單選按鈕不是布置在一個單一的矩形中的情況下,它是首選。圖7.11顯示了一組wx.RadioButton 對象的列子。

       

      圖7.11

      w7.11.gif

       

      我們在這個例子中使用wx.RadioButton 的原因是因為每個單選按鈕控制著一個關聯(lián)的文本控件。由于窗口部件是位于這組單選按鈕之外的,所以我們不能只用一個單選按鈕框。

       

      如何創(chuàng)建單選按鈕

       

      例7.11顯示了圖7.11的代碼,它管理單選按鈕和文本控件之間的聯(lián)系。

       

      例7.11 使用wx.RadioButton 來控制另一個窗口部件

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class RadioButtonFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Radio Example',   
      6.                 size=(200200))  
      7.         panel = wx.Panel(self, -1)  
      8.   
      9. #創(chuàng)建單選按鈕  
      10.         radio1 = wx.RadioButton(panel, -1"Elmo", pos=(2050), style=wx.RB_GROUP)  
      11.         radio2 = wx.RadioButton(panel, -1"Ernie", pos=(2080))  
      12.         radio3 = wx.RadioButton(panel, -1"Bert", pos=(20110))  
      13.   
      14. #創(chuàng)建文本控件  
      15.         text1 = wx.TextCtrl(panel, -1, "", pos=(8050))  
      16.         text2 = wx.TextCtrl(panel, -1, "", pos=(8080))  
      17.         text3 = wx.TextCtrl(panel, -1, "", pos=(80110))  
      18.         self.texts = {"Elmo": text1, "Ernie": text2, "Bert": text3}#連接按鈕和文本  
      19.         for eachText in [text2, text3]:  
      20.             eachText.Enable(False)  
      21.         for eachRadio in [radio1, radio2, radio3]:#綁定事件  
      22.             self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)  
      23.         self.selectedText = text1  
      24.   
      25.     def OnRadio(self, event):#事件處理器  
      26.         if self.selectedText:  
      27.             self.selectedText.Enable(False)  
      28.         radioSelected = event.GetEventObject()  
      29.         text = self.texts[radioSelected.GetLabel()]  
      30.         text.Enable(True)  
      31.         self.selectedText = text  
      32.   
      33. if __name__ == '__main__':  
      34.     app = wx.PySimpleApp()  
      35.     RadioButtonFrame().Show()  
      36.     app.MainLoop()   
       

      我們創(chuàng)建了單選按鈕和文本框,然后使用字典來建立它們間的連接。一個for 循環(huán)使得兩個文本框無效,另一個for 循環(huán)綁定單選按鈕命令事件。當事件發(fā)生的時候,當前活動的文本框變?yōu)闊o效,與被敲擊的按鈕相匹配的文本框變?yōu)橛行А?

      wx.RadioButton 的使用類似于是wx.CheckBox 。它們的構造函數(shù)幾乎是相同的,如下所示:

       

      Python代碼  收藏代碼
      1. wx.RadioButton(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="radioButton")   
       

       

      在復選框中,label 是相應按鈕的顯示標簽。

       

      wx.RB_GROUP 樣式聲明該按鈕位于一組單選按鈕開頭。一組單選按鈕的定義是很重要的,因為它控制開關行為。當組中的一個按鈕被選中時,先前被選中的按鈕被切換到未選中狀態(tài)。在一個單選按鈕使用wx.RB_GROUP 被創(chuàng)建后,所有后來的被添加到相同父窗口部件中的單選按鈕都被添加到同一組,直到另一單選按鈕使用wx.RB_GROUP 被創(chuàng)建,并開始下一個組。在例7.11中,第一個單選按鈕是使用wx.RB_GROUP 聲明的,而后來的沒有。結(jié)果導致所有的按鈕都被認為在同一組中,這樣一來,敲擊它們中的一個時,先前被選中按鈕將關閉。

       

      使用單選框

       

      通常,如果你想去顯示一組按鈕,分別聲明它們不是最好的方法。取而代之,wxPython 使用wx.RadioBox 類讓你能夠創(chuàng)建一個單一的對象,該對象包含了完整的組。如圖7.12所示,它看起來非常類似一組單選按鈕。

       

      圖7.12

      w7.12.gif

       

      要使用wx.RadioBox 類,你所需要的全部就是構造函數(shù)。例7.12顯示了圖7.12的代碼。

       

      例7.12 建造單選框

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class RadioBoxFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Radio Box Example',   
      6.                 size=(350200))  
      7.         panel = wx.Panel(self, -1)  
      8.         sampleList = ['zero''one''two''three''four''five',  
      9.                       'six''seven''eight']  
      10.         wx.RadioBox(panel, -1"A Radio Box", (1010), wx.DefaultSize,  
      11.                         sampleList, 2, wx.RA_SPECIFY_COLS)  
      12.   
      13.         wx.RadioBox(panel, -1, "", (15010), wx.DefaultSize,  
      14.                         sampleList, 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER)  
      15.   
      16. if __name__ == '__main__':  
      17.     app = wx.PySimpleApp()  
      18.     RadioBoxFrame().Show()  
      19.     app.MainLoop()   
       

      wx.RadioBox 的構造函數(shù)比簡單的單選按鈕更復雜,因為你需要去一下子為所有的按鈕指定數(shù)據(jù),如下所示:

       

      Python代碼  收藏代碼
      1. wx.RadioBox(parent, id, label, pos=wx.DefaultPosition,  
      2.         size=wxDefaultSize, choices=None, majorDimension=0,  
      3.         style=wx.RA_SPECIFY_COLS, validator=wx.DefaultValidator,  
      4.         name="radioBox")  
       

      label 參數(shù)是靜態(tài)文本,它顯示在單選框的邊框上。這些按鈕使用choices 參數(shù)指定,它是一個Python 的字符串標簽的序列。

       

      如同網(wǎng)格的sizer 一樣,你通過使用規(guī)定一個維數(shù)的尺寸來指定wx.RadioBox 的尺度,wxPython 在另一維度上自動填充。維度的主尺寸使用majorDimension 參數(shù)指定。哪一維是主要的由樣式標記決定。默認值是wx.RA_SPECIFY_COLS 。在本例中,左框的列數(shù)被設置為2,右框的列數(shù)被設置為3,行數(shù)由choices 列表中的元素數(shù)量動態(tài)的決定。如果你想得到相反的行為,你要將樣式設置為wx.RA_SPECIFY_ROWS 。如果你想在單選框被敲擊時響應命令事件,那么這個命令事件是EVT_RADIOBOX 。

       

      wx.RadioBox 類有許多方法來管理框中的不同的單選按鈕。這些方法使你能夠處理一個特定的內(nèi)部按鈕,傳遞該按鈕的索引。索引以0為開始,并按嚴格的順序展開,它的順序就是按鈕標簽傳遞給構造函數(shù)的順序。表7.11列出了這些方法。

       

      表7.11 wx.RadioBox 的方法

      EnableItem(n , flag)flag 參數(shù)是一個布爾值,它用于使索引為n的按鈕有效或無效。要使整個框立即有效,使用Enable() 。

      FindString(string) :根據(jù)給定的標簽返回相關按鈕的整數(shù)索引值,如果標簽沒有發(fā)現(xiàn)則返回-1。

      GetCount() :返回框中按鈕的數(shù)量。

      GetItemLabel(n) SetItemLabel(n , string) :返回或設置索引為n的按鈕的字符串標簽。

      GetSelection() GetStringSelection() SetSelection(n) SetStringSelection( string)GetSelection()SetSelection() 方法處理當前所選擇的單選按鈕的整數(shù)索引。GetStringSelection() 返回當前所選擇的按鈕的字符串標簽,SetStringSelection() 改變所選擇的按鈕的字符串標簽為給定值。沒有set *()產(chǎn)生EVT_RADIOBOX 事件。

      ShowItem(item , show)show 參數(shù)是一個布爾值,用于顯示或隱藏索引為item 的按鈕。

       

      單選按鈕不是給用戶一系列選擇的唯一方法。列表框和組合框占用的空間也少,也可以被配置來讓用戶從同一組中作多個選擇。

       

      如何創(chuàng)建一個列表框?

       

      列 表框是提供給用戶選擇的另一機制。選項被放置在一個矩形的窗口中,用戶可以選擇一個或多個。列表框比單選按鈕占據(jù)較少的空間,當選項的數(shù)目相對少的時候, 列表框是一個好的選擇。然而,如果用戶必須將滾動條拉很遠才能看到所有的選項的話,那么它的效用就有所下降了。圖7.13顯示了一個wxPython 列表框。

       

      w7.13.gif

       

      wxPython 中,列表框是類wx.ListBox 的元素。該類的方法使你能夠處理列表中的選擇。

       

      如何創(chuàng)建一個列表框

       

      例7.13顯示了產(chǎn)生圖7.13的代碼

       

      例7.13 使用wx.ListBox

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class ListBoxFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'List Box Example',   
      6.                 size=(250200))  
      7.         panel = wx.Panel(self, -1)  
      8.   
      9.         sampleList = ['zero''one''two''three''four''five',  
      10.                       'six''seven''eight''nine''ten''eleven',  
      11.                       'twelve''thirteen''fourteen']  
      12.   
      13.         listBox = wx.ListBox(panel, -1, (2020), (80120), sampleList,   
      14.                 wx.LB_SINGLE)  
      15.         listBox.SetSelection(3)  
      16.                   
      17. if __name__ == '__main__':  
      18.     app = wx.PySimpleApp()  
      19.     ListBoxFrame().Show()  
      20.     app.MainLoop()    
       

      wx.ListBox 的構造函數(shù)類似于單選框的,如下所示:

       

      Python代碼  收藏代碼
      1. wx.ListBox(parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, choices=None, style=0, validator=wx.DefaultValidator, name="listBox")   

       

      單選框和列表框的主要區(qū)別是wx.ListBox 沒有label 屬性。顯示在列表中的元素放置在參數(shù)choices 中,它是一個字符串的序列。列表框有三種互斥的樣式,它決定用戶如何從列表框中選擇元素,說明在表7.12中。

       

      用戶通常對于多選有一些問題,因為它們一般希望見到的是單選列表,對于多選來說可能是有挑戰(zhàn)性的(就像單選題和多選題一樣),尤其是對于那些易受困擾的用戶。如果你使用了一個多選的列表,我們建議你清楚地標明該列表。

       

      表7.12 列表框的選擇類型樣式

       

      wx.LB_EXTENDED :用戶可以通過使用shift 并敲擊鼠標來選擇一定范圍內(nèi)的連續(xù)的選項,或使用等同功能的按鍵。

      wx.LB_MULTIPLE :用戶可以一次選擇多個選項(選項可以是不連續(xù)的)。實際上,在這種情況下,列表框的行為就像是一組復選框。

       

      wx.LB_SINGLE :用戶一次只能選一個選項。實際上,在這種情況下,列表框的行為就像是一組單選按鈕。

       

      有三種控制wx.ListBox 中滾動條的顯示的樣式,如表7.13所示。

       

      表7.13 列表框的滾動條類型樣式

      wx.LB_ALWAYS_SB :列表框?qū)⑹冀K顯示一個垂直的滾動條,不管有沒有必要。

      wx.LB_HSCROLL :如果本地控支持,那么列表框在選擇項太多時,將創(chuàng)建一個水平滾動條。

      wx.LB_HSCROLL :列表框只在需要的時候顯示一個垂直的滾動條。這是默認樣式。

       

      還有一個樣式wx.LB_SORT ,它使得列表中的元素按字母順序排序。

       

      有兩個專用于wx.ListBox 的命令事件。EVT_LISTBOX 事件在當列表中的一個元素被選擇時觸發(fā)(即使它是當前所選擇的元素)。如果列表被雙擊,EVT_LISTBOX_DCLICK 事件發(fā)生。

       

      有一些專用于列表框的方法,你可以用來處理框中的項目。表7.14對許多的方法作了說明。列表框中的項目索引從0開始。

      一旦你有了一個列表框,自然就想把它與其它的窗口部件結(jié)合起來使用,如下拉菜單,或復選框。在下一節(jié),我們對此作討論。

       

      表7.14 列表框的方法

      Append(item) :把字符串項目添加到列表框的尾部。

      Clear() :清空列表框。

      Delete(n) :刪除列表框中索引為n的項目。

      Deselect(n) :在多重選擇列表框中,導致位于位置n的選項取消選中。在其它樣式中不起作用。

      FindString(string) :返回給定字符串的整數(shù)位置,如果沒有發(fā)現(xiàn)則返回-1。

      GetCount() :返回列表中字符串的數(shù)量。

      GetSelection() SetSelection(n , select) GetStringSelection() SetStringSelection(string , select) GetSelections()GetSelection() 得到當前選擇項的整數(shù)索引(僅對于單選列表)。對于多選列表,使用GetSelections() 來返回包含所選項目的整數(shù)位置的元組。對于單選列表,GetStringSelection() 返回當前選擇的字符串。相應的set 方法使用布爾值參數(shù)select 設置指定字符串或索引選項的狀態(tài)。使用這種方法改變選擇不觸發(fā)EVT_LISTBOX 事件。

      GetString(n) SetString(n , string) :得到或設置位置n處的字符串。

      InsertItems(items , pos) :插入?yún)?shù)items 中的字符串列表到該列表框中pos 參數(shù)所指定的位置前。位置0表示把項目放在列表的開頭。

      Selected(n) :返回對應于索引為n的項目的選擇狀態(tài)的布爾值。

      Set(choices) :重新使用 choices 的內(nèi)容設置列表框。

       

      如何合并復選框和列表框?

       

      你可以使用類wx.CheckListBox 來將復選框與列表框合并。圖7.14顯示了列表框和復選框在合并在一起的例子。

       

      圖7.14

      w7.14.gif

       

      wx.CheckListBox 的構造函數(shù)和大多數(shù)方法與wx.ListBox 的相同。它有一個新的事件:wx.EVT_CHECKLISTBOX ,它在當列表中的一個復選框被敲擊時觸發(fā)。它有兩個管理復選框的新的方法:Check(n , check) 設置索引為n的項目的選擇狀態(tài),IsChecked(item) 在給定的索引的項目是選中狀態(tài)時返回True 。

       

      如果我想要下拉形式的選擇該怎么做?

       

      下拉式選擇是一種僅當下拉箭頭被敲擊時才顯示選項的選擇機制。它是顯示所選元素的最簡潔的方法,當屏幕空間很有限的時候,它是最有用的。圖7.15顯示了一個關閉的下拉式選擇。圖7.16顯示了一個打開的下拉式選擇。

       

      圖7.15

      w7.15.gif

      圖7.16

       

      w7.16.gif

       

      下拉式選擇的使用與標準的列表框是很相似的。例7.14顯示了如何創(chuàng)建一個下拉式選擇。

       

      例7.14

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class ChoiceFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Choice Example',   
      6.                 size=(250200))  
      7.         panel = wx.Panel(self, -1)  
      8.         sampleList = ['zero''one''two''three''four''five',  
      9.                       'six''seven''eight']  
      10.         wx.StaticText(panel, -1"Select one:", (1520))  
      11.         wx.Choice(panel, -1, (8518), choices=sampleList)  
      12.   
      13. if __name__ == '__main__':  
      14.     app = wx.PySimpleApp()  
      15.     ChoiceFrame().Show()  
      16.     app.MainLoop()   
       

      wx.Choice 的構造函數(shù)與列表框的基本相同:

       

      Python代碼  收藏代碼
      1. wx.Choice(parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, choices=None, style=0, validator=wx.DefaultValidator, name="choice")   
       

       

      wx.Choice 沒有專門的樣式,但是它有獨特的命令事件:EVT_CHOICE 。幾乎表7.14中所有適用于單選列表框的方法都適用于wx.Choice 對象。

       

      我能夠?qū)⑽谋居蚺c列表合并在一起嗎?

       

      將文本域與列表合并在一起的窗口部件稱為組合框,其本質(zhì)上是一個下拉選擇和文本框的組合。圖7.17顯示了一個組合框。

       

      圖7.17 左邊是wx.CB_DropDOWN 樣式,右邊是wx.CB_SIMPLE 樣式

       

      w7.17.gif

       

      Windows 上,你可以使用右邊的樣式,它是一個列表框和文本框的組合。

      創(chuàng)建組合框的代碼與我們已經(jīng)見過的選擇是類似的。該類是wx.ComboBox ,它是wx.Choice 的一個子類。例7.15顯示了圖7.17的代碼:

       

      例7.15

       

      Python代碼  收藏代碼
      1. import wx  
      2.   
      3. class ComboBoxFrame(wx.Frame):  
      4.     def __init__(self):  
      5.         wx.Frame.__init__(selfNone, -1'Combo Box Example',   
      6.                 size=(350300))  
      7.         panel = wx.Panel(self, -1)  
      8.         sampleList = ['zero''one''two''three''four''five',  
      9.                       'six''seven''eight']  
      10.         wx.StaticText(panel, -1"Select one:", (1515))  
      11.         wx.ComboBox(panel, -1"default value", (1530), wx.DefaultSize,  
      12.                     sampleList, wx.CB_DropDOWN)  
      13.         wx.ComboBox(panel, -1"default value", (15030), wx.DefaultSize,  
      14.                         sampleList, wx.CB_SIMPLE)  
      15.                           
      16. if __name__ == '__main__':  
      17.     app = wx.PySimpleApp()  
      18.     ComboBoxFrame().Show()  
      19.     app.MainLoop()          
       

      wx.ComboBox 的構造函數(shù)如下所示:

       

       

      Python代碼  收藏代碼
      1. wx.ComboBox(parent, id, value="", pos=wx.DefaultPosition,  
      2.         size=wx.DefaultSize, choices, style=0,  
      3.         validator=wx.DefaultValidator, name="comboBox")  
       

      對于wx.ComboBox 來說有4種樣式。其中的兩種決定了如何繪制組合框:wx.CB_DropDOWN 創(chuàng)建一個帶有下拉列表的組合框,wx.CB_SIMPLE 創(chuàng)建一個帶有列表框的組合框。在Windows 上你可以只使用wx.CB_SIMPLE 樣式。任何組合框都可以被指定為wx.CB_READONLY 樣式,它防止用戶在文本域中鍵入。當組合框被指定為只讀時,所做的選擇必須來自于選擇列表的元素之一,即使你用程序來設置它也不行。最后wx.CB_SORT 樣式導致選擇列表中的元素按字母順序顯示。

       

      由于wx.ComboBoxwx.Choice 的子類,所有的wx.Choice 的方法都能被組合框調(diào)用,如表7.14所示。另外,還有許多方法被定義來處理文本組件,它們的行為同wx.TextCtrl (參見表7.4),所定義的方法有Copy() , Cut() , GetInsertionPoint() , GetValue() , Paste() , Replace(from ,to , text) , Remove(from , to) , SetInsertionPoint(pos) , SetInsertionPointEnd() ,和 SetValue() 。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多