1. 程式人生 > >Python例項講解 -- wxpython 基本的控制元件 (按鈕)

Python例項講解 -- wxpython 基本的控制元件 (按鈕)

使用按鈕工作

在wxPython 中有很多不同型別的按鈕。這一節,我們將討論文字按鈕、點陣圖按鈕、開關按鈕(toggle buttons )和通用(generic )按鈕。

如何生成一個按鈕?

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

圖7.4

這裡寫圖片描述

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

Python程式碼

import wx  

class ButtonFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None
, -1, 'Button Example', size=(300, 100)) panel = wx.Panel(self, -1) self.button = wx.Button(panel, -1, "Hello", pos=(50, 20)) self.Bind(wx.EVT_BUTTON, self.OnClick, self.button) self.button.SetDefault() def OnClick(self, event): self.button.SetLabel("Clicked"
) if __name__ == '__main__': app = wx.PySimpleApp() frame = ButtonFrame() frame.Show() app.MainLoop()

wx.Button 的建構函式類似於我們已經看到過的,如下所示:
wx.Button(parent , id , label , pos , size =wxDefaultSize , style =0, validator , name =”button “)

引數label 是顯示在按鈕上的文字。它可以在程式執行期間使用SetLabel() 來改變,並且使用GetLabel() 來獲取。另外兩個有用的方法是GetDefaultSize() 和SetDefault() 。GetDefaultSize() 返回系統預設按鈕的尺寸(對於框架間的一致性是有用的);SetDefault() 設定按鈕為對話方塊或框架的預設按鈕。預設按鈕的繪製不同於其它按鈕,它在對話方塊獲得焦點時,通常按下回車鍵被啟用。

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

如何生成一個位圖按鈕?

有時候,你可能想在你的按鈕上顯示一個圖片,而非一個文字標籤,如圖7.5所示
這裡寫圖片描述

在wxPython 中,使用類wx.BitmapButton 來建立一個位圖按鈕。處理一個wx.BitmapButton 的程式碼是與通用按鈕的程式碼非常類似的,例7.5顯示了產生7.5的程式碼。

例7.5 建立一個位圖按鈕

Python程式碼

import wx  

class BitmapButtonFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Bitmap Button Example',   
                size=(200, 150))  
        panel = wx.Panel(self, -1)  
        bmp = wx.Image("bitmap.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()  
        self.button = wx.BitmapButton(panel, -1, bmp, pos=(10, 20))  
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)  
        self.button.SetDefault()  
        self.button2 = wx.BitmapButton(panel, -1, bmp, pos=(100, 20),   
            style=0)  
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.button2)  

    def OnClick(self, event):  
        self.Destroy()  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    frame = BitmapButtonFrame()  
    frame.Show()  
    app.MainLoop()  

與普通按鈕的主要的區別是你需要提供一個位圖,而非一個標籤。否則,構造器和大部分程式碼是與文字按鈕的例子相同的。點陣圖按鈕在被敲擊時同樣產生EVT_BUTTON 事件。

關於點陣圖按鈕有幾個有趣的特性。首先,一個樣式標記wx.BU_AUTODRAW ,它是預設的。如果該標記是開啟的,那麼點陣圖將帶有一個3D的邊框,這使它看起來像一個文字按鈕(圖7.5中的左按鈕),並且按鈕比原點陣圖大幾個畫素。如果該標記是關閉的,則點陣圖被簡單地繪製為按鈕而沒有邊框。通過設定style =0使圖7.5中右邊的按鈕關閉預設設定,它沒有了3D的效果。

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

你不能通過使用標準的wxWidgets C++庫來合併一個位圖和文字。你可以建立一個包含文字的點陣圖。然而,正如我們將在通用按鈕問題討論中所看到的,wxPython 有額外的方法來實現這一合併行為。

如何建立開關按鈕(toggle button )?

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

在wx.ToggleButton 與父類wx.Button 之間只有丙個區別:
1、當被敲擊時,wx.ToggleButton 傳送一個EVT_TOGGLEBUTTON 事件。
2、wx.ToggleButton 有GetValue() 和SetValue() 方法,它們處理按鈕的二進位制狀態。

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

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

通用按鈕是一個完全用Python 重新實現的一個按鈕視窗部件,迴避了本地系統視窗部件的用法。它的父類是wx.lib.buttons. GenButton 。通用按鈕有通用點陣圖和切換按鈕。

這兒有幾個使用通用按鈕的原因:
1、通用按鈕比本地按鈕具有更好的跨平臺的外觀。另一方面,通用按鈕可能在具體的系統上看起來與本地按鈕有些微的不同。
2、使用通用按鈕,你對它的外觀有更多的控制權,並且能改變屬性,如3D斜面的寬度和顏色,而這對於本地控制元件可能是不允許的。
3、通用按鈕類允許特性的合併,而wxWidget 按鈕不行。比如GenBitmapTextButton 允許文字標籤和點陣圖的組合,GenBitmapToggleButton 實現一個位圖切換按鈕。
4、如果你正在建立一個按鈕類,使用通用按鈕是較容易的。由於其程式碼和引數是用Python 寫的,所以當建立一個新的子類的時候,對於檢查和覆蓋,它們的可用性更好。

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

圖7.6
這裡寫圖片描述

例7.6顯示了產生圖7.6的程式碼。第二個匯入語句:import wx.lib.buttons as buttons ,是必須的,它使得通用按鈕類可用。

例7.6 建立和使用wxPython 的通用按鈕

Python程式碼

import wx  
import wx.lib.buttons as buttons  

class GenericButtonFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Generic Button Example',   
                size=(500, 350))  
        panel = wx.Panel(self, -1)  

        sizer = wx.FlexGridSizer(1, 3, 20, 20)  
        b = wx.Button(panel, -1, "A wx.Button")  
        b.SetDefault()  
        sizer.Add(b)  

        b = wx.Button(panel, -1, "non-default wx.Button")  
        sizer.Add(b)  
        sizer.Add((10,10))  

        b = buttons.GenButton(panel, -1, 'Genric Button')#基本的通用按鈕  
        sizer.Add(b)  

        b = buttons.GenButton(panel, -1, 'disabled Generic')#無效的通用按鈕  
        b.Enable(False)  
        sizer.Add(b)  

        b = buttons.GenButton(panel, -1, 'bigger')#自定義尺寸和顏色的按鈕  
        b.SetFont(wx.Font(20, wx.SWISS, wx.NORMAL, wx.BOLD, False))  
        b.SetBezelWidth(5)  
        b.SetBackgroundColour("Navy")  
        b.SetForegroundColour("white")  
        b.SetToolTipString("This is a BIG button...")  
        sizer.Add(b)    

        bmp = wx.Image("bitmap.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()  
        b = buttons.GenBitmapButton(panel, -1, bmp)#通用點陣圖按鈕  
        sizer.Add(b)  

        b = buttons.GenBitmapToggleButton(panel, -1, bmp)#通用點陣圖開關按鈕  
        sizer.Add(b)  

        b = buttons.GenBitmapTextButton(panel, -1, bmp, "Bitmapped Text",  
                size=(175, 75))#點陣圖文字按鈕  
        b.SetUseFocusIndicator(False)  
        sizer.Add(b)  

        b = buttons.GenToggleButton(panel, -1, "Toggle Button")#通用開關按鈕  
        sizer.Add(b)  

        panel.SetSizer(sizer)  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    frame = GenericButtonFrame()  
    frame.Show()  
    app.MainLoop()

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

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

在下一節,我們將討論關於使你的使用者能夠輸入或觀看一個數字值的方案。

輸入並顯示數字

有時你想要顯示圖形化的數字資訊,或你想讓使用者不必使用鍵盤來輸入一個數字量。在這一節,我們將瀏覽wxPython 中用於數字輸入和顯示的工具:滑塊(slider )、微調控制框和顯示量度的標尺。

如何生成一個滑塊?

滑塊是一個視窗部件,它允許使用者通過在該控制元件的尺度內拖動指示器來選擇一個數值。在wxPython 中,該控制元件類是wx.Slider ,它包括了滑塊的當前值的只讀文字的顯示。圖7.7顯示了水平和垂直滑塊的例子。

圖7.7
這裡寫圖片描述

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

如何使用滑塊

例7.7是產生圖7.7的例子

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

Python程式碼

import wx   

class SliderFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Slider Example',   
                size=(300, 350))  
        panel = wx.Panel(self, -1)  
        self.count = 0  
        slider = wx.Slider(panel, 100, 25, 1, 100, pos=(10, 10),  
                size=(250, -1),  
                style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )  
        slider.SetTickFreq(5, 1)  
        slider = wx.Slider(panel, 100, 25, 1, 100, pos=(125, 70),  
                size=(-1, 250),  
                style=wx.SL_VERTICAL | wx.SL_AUTOTICKS | wx.SL_LABELS )  
        slider.SetTickFreq(20, 1)  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    frame = SliderFrame()  
    frame.Show()  
    app.MainLoop()

通常,當你使用wx.Slider 類時,所有你所需要的就是一個建構函式,它與別的呼叫不同,如下所示:
wx.Slider(parent , id , value , minValue , maxValue , pos =wxDefaultPosition , size =wx.DefaultSize , style =wx.SL_HORIZONTAL , validator =wx.DefaultValidator , name =”slider “)
value 是滑塊的初始值,而minValue 和maxValue 是兩端的值。

使用滑塊樣式工作

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

表7.9 wx.Slider 的樣式

wx.SL_AUTOTICKS :如果設定這個樣式,則滑塊將顯示刻度。刻度間的間隔通過SetTickFreq 方法來控制。
wx.SL_HORIZONTAL :水平滑塊。這是預設值。
wx.SL_LABELS :如果設定這個樣式,那麼滑塊將顯示兩頭的值和滑塊的當前只讀值。有些平臺可能不會顯示當前值。
wx.SL_LEFT :用於垂直滑塊,刻度位於滑塊的左邊。
wx.SL_RIGHT :用於垂直滑塊,刻度位於滑塊的右邊。
wx.SL_TOP :用於水平滑塊,刻度位於滑塊的上部。
wx.SL_VERTICAL :垂直滑塊。

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

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

表7.10

GetRange() SetRange(minValue , maxValue) :設定滑塊的兩端值。
GetTickFreq() SetTickFreq(n , pos) :使用引數n設定刻度的間隔。引數pos 沒有被使用,但是它仍然是必要的,將它設定為1。
GetLineSize() SetLineSize(lineSize) :設定你每按一下方向鍵,滑塊所增加或減少的值。
GetPageSize() SetPageSize(pageSize) :設定你每按一下PgUp 或PgDn 鍵,滑塊所增加或減少的值。
GetValue() SetValue(value) :設定滑塊的值。

儘管滑塊提供了一個可能範圍內的值的快速的視覺化的表示,但是它們也有兩個缺點。其一是它們佔據了許多的空間,另外就是使用滑鼠精確地設定滑塊是困難的。下面我們將討論的微調控制器解決了上面的這兩個問題。

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

微調控制器是文字控制元件和一對箭頭按鈕的組合,它用於調整數字值,並且在你要求一個最小限度的螢幕空間的時候,它是替代滑塊的最好選擇。圖7.8顯示了wxPython 的微調控制器控制元件。

圖7.8
這裡寫圖片描述

在wxPython 中,類wx.SpinCtrl 管理微調按鈕和相應的文字顯示。在接下來的部分,我們將建立一個微調控制器。

如何建立一個微調控制器

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

例7.8 使用wx.SpinCtrl

Python程式碼

import wx  

class SpinnerFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Spinner Example',   
                size=(100, 100))  
        panel = wx.Panel(self, -1)  
        sc = wx.SpinCtrl(panel, -1, "", (30, 20), (80, -1))  
        sc.SetRange(1,100)  
        sc.SetValue(5)  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    SpinnerFrame().Show()  
    app.MainLoop()     

幾乎微調控制元件所有複雜的東西都是在其建構函式中,其建構函式如下:

Python程式碼

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")   

引數value 是虛設的。使用initial 引數來設定該控制元件的值,並使用min 和max 來設定該控制元件的範圍。
對於wx.SpinCtrl 有兩個樣式標記。預設樣式是wx.SP_ARROW_KEYS ,它允許使用者通過鍵盤上的上下箭頭鍵來改變控制元件的值。樣式wx.SP_WRAP 使得控制元件中的值可以迴圈改變,也就是說你通過箭頭按鈕改變控制元件中的值到最大或最小值時,如果再繼續,值將變為最小或最大,從一個極端到另一個極端。

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

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

當你需要對微調控制器的行為有更多的控制時,如允許浮點數或一個字串的列表,你可以把一個wx.SpinButton 和一個wx.TextCtrl 放到一起,並在它們之間建立一個聯絡。然後捕獲來自wx.SpinButton 的事件,並更新wx.TextCtrl 中的值。

如何生成一個進度條?

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

圖7.9
這裡寫圖片描述

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

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

Python程式碼

import wx  

class GaugeFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Gauge Example',   
                size=(350, 150))  
        panel = wx.Panel(self, -1)  
        self.count = 0  
        self.gauge = wx.Gauge(panel, -1, 50, (20, 50), (250, 25))  
        self.gauge.SetBezelFace(3)  
        self.gauge.SetShadowWidth(3)  
        self.Bind(wx.EVT_IDLE, self.OnIdle)  

    def OnIdle(self, event):  
        self.count = self.count + 1  
        if self.count  == 50:  
            self.count = 0  
        self.gauge.SetValue(self.count)  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    GaugeFrame().Show()  
    app.MainLoop()    

wx.Gauge 的建構函式類似於其它的數字的視窗部件:

Python程式碼

wx.Gauge(parent, id, range, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.GA_HORIZONTAL, validator=wx.DefaultValidator, name="gauge")  

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

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

給使用者以選擇

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

如何建立一個複選框?

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

圖7.10
這裡寫圖片描述

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

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

Python程式碼

import wx  

class CheckBoxFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Checkbox Example',   
                size=(150, 200))  
        panel = wx.Panel(self, -1)  
        wx.CheckBox(panel, -1, "Alpha", (35, 40), (150, 20))  
        wx.CheckBox(panel, -1, "Beta", (35, 60), (150, 20))  
        wx.CheckBox(panel, -1, "Gamma", (35, 80), (150, 20))  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    CheckBoxFrame().Show()  
    app.MainLoop() 

wx.CheckBox 有一個典型的wxPython 建構函式:

Python程式碼

wx.CheckBox(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="checkBox")   

label 引數是複選框的標籤文字。複選框沒有樣式標記,但是它們產生屬於自己的獨一無二的命令事件:EVT_CHECKBOX 。wx.CheckBox 的開關狀態可以使用GetValue() 和SetValue(state) 方法來訪問,並且其值是一個布林值。IsChecked() 方法等同於GetValue() 方法,只是為了讓程式碼看起來更易明白。

如何建立一組單選按鈕(radio button )?

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

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

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

圖7.11
這裡寫圖片描述

我們在這個例子中使用wx.RadioButton 的原因是因為每個單選按鈕控制著一個關聯的文字控制元件。由於視窗部件是位於這組單選按鈕之外的,所以我們不能只用一個單選按鈕框。

如何建立單選按鈕

例7.11顯示了圖7.11的程式碼,它管理單選按鈕和文字控制元件之間的聯絡。

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

Python程式碼

import wx  

class RadioButtonFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Radio Example',   
                size=(200, 200))  
        panel = wx.Panel(self, -1)  

#建立單選按鈕  
        radio1 = wx.RadioButton(panel, -1, "Elmo", pos=(20, 50), style=wx.RB_GROUP)  
        radio2 = wx.RadioButton(panel, -1, "Ernie", pos=(20, 80))  
        radio3 = wx.RadioButton(panel, -1, "Bert", pos=(20, 110))  

#建立文字控制元件  
        text1 = wx.TextCtrl(panel, -1, "", pos=(80, 50))  
        text2 = wx.TextCtrl(panel, -1, "", pos=(80, 80))  
        text3 = wx.TextCtrl(panel, -1, "", pos=(80, 110))  
        self.texts = {"Elmo": text1, "Ernie": text2, "Bert": text3}#連線按鈕和文字  
        for eachText in [text2, text3]:  
            eachText.Enable(False)  
        for eachRadio in [radio1, radio2, radio3]:#繫結事件  
            self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)  
        self.selectedText = text1  

    def OnRadio(self, event):#事件處理器  
        if self.selectedText:  
            self.selectedText.Enable(False)  
        radioSelected = event.GetEventObject()  
        text = self.texts[radioSelected.GetLabel()]  
        text.Enable(True)  
        self.selectedText = text  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    RadioButtonFrame().Show()  
    app.MainLoop()   

我們建立了單選按鈕和文字框,然後使用字典來建立它們間的連線。一個for 迴圈使得兩個文字框無效,另一個for 迴圈繫結單選按鈕命令事件。當事件發生的時候,當前活動的文字框變為無效,與被敲擊的按鈕相匹配的文字框變為有效。
wx.RadioButton 的使用類似於是wx.CheckBox 。它們的建構函式幾乎是相同的,如下所示:

Python程式碼

wx.RadioButton(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="radioButton")   

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

wx.RB_GROUP 樣式宣告該按鈕位於一組單選按鈕開頭。一組單選按鈕的定義是很重要的,因為它控制開關行為。當組中的一個按鈕被選中時,先前被選中的按鈕被切換到未選中狀態。在一個單選按鈕使用wx.RB_GROUP 被建立後,所有後來的被新增到相同父視窗部件中的單選按鈕都被新增到同一組,直到另一單選按鈕使用wx.RB_GROUP 被建立,並開始下一個組。在例7.11中,第一個單選按鈕是使用wx.RB_GROUP 宣告的,而後來的沒有。結果導致所有的按鈕都被認為在同一組中,這樣一來,敲擊它們中的一個時,先前被選中按鈕將關閉。

使用單選框

通常,如果你想去顯示一組按鈕,分別宣告它們不是最好的方法。取而代之,wxPython 使用wx.RadioBox 類讓你能夠建立一個單一的物件,該物件包含了完整的組。如圖7.12所示,它看起來非常類似一組單選按鈕。

圖7.12
這裡寫圖片描述

要使用wx.RadioBox 類,你所需要的全部就是建構函式。例7.12顯示了圖7.12的程式碼。

例7.12 建造單選框

Python程式碼

import wx  

class RadioBoxFrame(wx.Frame):  
    def __init__(self):  
        wx.Frame.__init__(self, None, -1, 'Radio Box Example',   
                size=(350, 200))  
        panel = wx.Panel(self, -1)  
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',  
                      'six', 'seven', 'eight']  
        wx.RadioBox(panel, -1, "A Radio Box", (10, 10), wx.DefaultSize,  
                        sampleList, 2, wx.RA_SPECIFY_COLS)  

        wx.RadioBox(panel, -1, "", (150, 10), wx.DefaultSize,  
                        sampleList, 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER)  

if __name__ == '__main__':  
    app = wx.PySimpleApp()  
    RadioBoxFrame().Show()  
    app.MainLoop()   

wx.RadioBox 的建構函式比簡單的單選按鈕更復雜,因為你需要去一下子為所有的按鈕指定資料,如下所示:

Python程式碼

wx.RadioBox(parent, id, label, pos=wx.DefaultPosition,  
        size=wxDefaultSize, choices=None, majorDimension=0,  
        style=wx.RA_SPECIFY_COLS, validator=wx.DefaultValidator,  
        name="radioBox")  

label 引數是靜態文字,它顯示在單選框的邊框上。這些按鈕使用choices 引數指定,它是一個Python 的字串標籤的序列。

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

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

表7.11 wx.RadioBox 的方法
EnableItem(n , flag) :flag 引數是一個布林值,它用於使索引為n的按鈕有效或無效。要使整個框立即有效,使用Enable() 。
FindString(string) :根據給定的標籤返回相關按鈕的整數索引值,如果標籤沒有發現則返回-1。
GetCount() :返回框中按鈕的數量。
GetItemLabel(n) SetItemLabel(n , string) :返回或設定索引為n的按鈕的字串標籤。
GetSelection() GetStringSelection() SetSelection(n) SetStringSelection( string) :GetSelection() 和 SetSelection() 方法處理當前所選擇的單選按鈕的整數索引。GetStringSelection() 返回當前所選擇的按鈕的字串標籤,SetStringSelection() 改變所選擇的按鈕的字串標籤為給定值。沒有set *()產生EVT_RADIOBOX 事件。
ShowItem(item , show) :show 引數是一個布林值,用於顯示或隱藏索引為item 的按鈕。

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

相關推薦

Python例項講解 -- wxpython 基本控制元件 按鈕

使用按鈕工作 在wxPython 中有很多不同型別的按鈕。這一節,我們將討論文字按鈕、點陣圖按鈕、開關按鈕(toggle buttons )和通用(generic )按鈕。 如何生成一個按鈕? 在第一部分(part 1)中,我們已經說明了幾個按鈕的例子

Python例項講解 -- wxpython 基本控制元件 文字

wxPython 工具包提供了多種不同的視窗部件,包括了本章所提到的基本控制元件。我們涉及靜態文字、可編輯的文字、按鈕、微調、滑塊、複選框、單選按鈕、選擇器、列表框、組合框和標尺。對於每種視窗部件,我們將提供一個關於如何使用它的簡短例子,並附上相關的wxPython API 的說明。 顯示文字 這一

wxPython 基本控制元件

要在你的訊息框中顯示大量的文字,你可以使用wxPython特定的類wx.lib.dialogs.ScrolledMessageDialog,它包含如下的建構函式:wx.lib.dialogs.ScrolledMessageDialog(parent, msg, caption,         pos=wx.

Android-基本控制元件Spanner 下拉列表

1.回顧    上篇 學會了 GridView 的使用,基本的SimapleAdapter 實現 2.這篇     (1)使用 SimapleAdapter 實現 圖文下拉列表     (2) 使用A

如何使用JavaScript UI控制元件WijmoJS構建Electron應用程式

概述 What is Electron? Electron是一個使用JavaScript、HTML和CSS構建跨平臺桌面應用程式的框架。 您可以將Electron與純JavaScript或您選擇的JavaScript框架一起使用: React Angular Vue 構建

Android自定義View--翻書控制元件

0.前言 最近重看了一遍封神演義,感覺QQ閱讀那個翻書的效果挺好的,準備做一個。上週五下午用了兩個小時只寫了一部分功能,以後有時間再完善 1.分析 先看效果圖 這個空間,說簡單也簡單,說難也難,簡單就在於這個效果主要就是依賴canvas的clippath才見到部分canvas,難就難在裁

WPF自定義控制元件控制元件分類

原文: WPF自定義控制元件(一)の控制元件分類 一、什麼是控制元件(Controls)         控制元件是指對資料和方法的封裝。控制元件可以有自己的屬性和方法,其中屬性是控制元件資料的簡單訪問者,方法則是控制元件的一些簡單而可見的功能、控制元件建

WPF 曲線圖表控制元件自制

原文: WPF 曲線圖表控制元件(自制)(一) 由於公司需要所以自寫了一個簡單的曲線圖表控制元件,在此分享。 先上一張效果圖 1.介面xaml X軸和Y軸用 2個line物件寫死在xaml上 外部用一個Grid包裹起來,然後X軸的寬度,和Y

WPF自定義控制元件の自定義控制元件

原文: WPF自定義控制元件(四)の自定義控制元件 在實際工作中,WPF提供的控制元件並不能完全滿足不同的設計需求。這時,需要我們設計自定義控制元件。 這裡LZ總結一些自己的思路,特性如下: Coupling UITemplate Behaviour Function Package

WPF自定義控制元件の使用者控制元件完結

原文: WPF自定義控制元件(五)の使用者控制元件(完結) 使用者控制元件,WPF中是繼承自UserControl的控制元件,我們可以在裡面融合我們的業務邏輯。 示例:(一個厭惡選擇的使用者控制元件) 後端: using iMicClassBase; using iMicClassBase.B

用WPF做報表控制元件

表主體和表尾 表主體並沒有什麼難點,就是一個DataGrid,往裡面填充資料即可。表尾顯示的是一些統計資料,如平均值、最大值、最小值、累計值等。在這一部分的開發裡面,最複雜的是水平滾動條的問題。 一開始,我考慮用一個ScrollViewer把整個報表控制元件包起來。但當我填充大量資料的時候,

用WPF做報表控制元件

表頭 在上一節裡面,我們已經知道,表頭其實是一個Grid。那麼有兩個最需要解決的問題: (1)表頭列寬變化時,主體和表尾的列寬怎麼跟著變化。 (2)如何初始化這個複雜的表頭。 第一個問題其實並不難,在Grid每一列右側,都加入一個GridSplitter,然後新增DragDelta和

用WPF做報表控制元件

總體結構 首先我們看一下報表控制元件最終的效果: 我們可以把報表看成是三部分,分別是表頭,表主體和表尾。如果我們不使用WPF自帶的DataGrid,自己一根線一根線去畫的話,這個表格估計也是大工程了。所以一開始,我們就考慮使用DataGrid。但DataGrid怎麼做出如圖所示的表頭和

用WPF做報表控制元件

DataGrid是WPF自帶的報表控制元件,但其功能簡單,很多時候無法滿足我們的需求。第三方庫(如DevExpress)報表功能強大,但一方面資源消耗比較多,另一方面效能也較差,在一些比較差的電腦上執行很吃力。我之前就嘗試過在工控機上使用DevExpress,每次啟動都需要等幾秒甚至十幾秒半分鐘,體

用WPF做報表控制元件

報表列印 前面的幾項功能,我做的控制元件都比DevExpress的報表控制元件效能要好,唯獨這個列印要差一些。但這也能用,畢竟列印的功能使用不多,四十頁紙之內速度還是可以的。 報表控制元件使用FlowDocument來列印。我們需要把資料重新填充到FlowDocument裡面。如下面的程式碼

用WPF做報表控制元件

匯出Excel表格 匯出Excel表格可以使用Office的外掛,但我們現場用的電腦不一定是裝過Office的,所以也就不能用Office的外掛。一開始,我採用了csv格式的檔案,直接把字尾改成了xls。這樣Excel當然是會開啟的。但csv格式太過簡單,開啟的時候往往不怎麼好看。後來終於找到了

android高階控制元件ListView 列表控制元件

在strings中建立一個strings.xml,並定義字串陣列,用於當資料來源 張三 李四 王五 張三丰 abc abb

熟悉一些Xamarin前端控制元件

C#使用Xamarin開發可移植移動應用目錄 原始碼地址:https://github.com/l2999019/DemoApp 可以Star一下,隨意 - - 說點什麼.. .NET core2.0 釋出了,刺激,大致看了一下,很不錯,打算後期學習.(不出意外,應該也會寫個小系列)

控制元件CMSComm讀串列埠程式碼高效率,不同於網上常見的,決沒有抄襲

讀串列埠的程式碼在網上是鋪天蓋地,但他們幾乎完全是一樣的,第一個人寫出來的才是英雄,其它的不是。這段程式碼類似於下面: VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[204

WinForm入門--高階控制元件

集合相關 MenuStrip 選單欄 StatusStrip 底部工具欄 包括:StatusLabel,ProgressBar,DropDownButton,SplitButton ToolBar 頂部工具欄 屬性