wxpython入门(四)基础构建

wxpython入门(四)基础构建

参考书籍
http://wiki.woodpecker.org.cn/moin/WxPythonInAction

第六章 使用基本的建造部件
暂时略过
第七章 使用基本的控件工作
显示文本
wx.StaticText,examples:
import wx
class StaticTextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Static Text Example',size=(400, 300))
        panel = wx.Panel(self, -1)
        # 这是一个基本的静态文本
        wx.StaticText(panel,-1,"This is an example of static text",(100, 10))
        # 指定了前景色和背景色的静态文本
        rev = wx.StaticText(panel,-1,"Static Text With Reversed Colors",(100, 30))
        rev.SetForegroundColour('white')
        rev.SetBackgroundColour('black')
        # 指定居中对齐的的静态文本
        center = wx.StaticText(panel,-1,"align center",(100, 50),(160, -1), wx.ALIGN_CENTER)
        center.SetForegroundColour('white')
        center.SetBackgroundColour('black')
        # 指定右对齐的静态文本
        right = wx.StaticText(panel,-1,"align right",(100, 70),(160, -1), wx.ALIGN_RIGHT)
        right.SetForegroundColour('white')
        right.SetBackgroundColour('black')
        # 指定新字体的静态文本
        str = "You can also change the font."
        text = wx.StaticText(panel, -1, str, (20, 100))
        font = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
        text.SetFont(font)
        # 显示多行文本
        wx.StaticText(panel, -1, "Your text\ncan be split\n"
                "over multiple lines\n\neven blank ones", (20,150))
        #显示对齐的多行文本
        wx.StaticText(panel, -1, "Multi-line text\ncan also\n"
                "be right aligned\n\neven with a blank", (220,150),
                style=wx.ALIGN_RIGHT)
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = StaticTextFrame()
    frame.Show()
    app.MainLoop()

wx.StaticText的构造函数:
wx.StaticText(parent, id, label, pos=wx.DefaultPosition,size=wx.DefaultSize, style=0, name="staticText")

wx.StaticText的样式:
wx.ALIGN_CENTER:静态文本位于静态文本控件的中心。
wx.ALIGN_LEFT:文本在窗口部件中左对齐。这是默认的样式。
wx.ALIGN_RIGHT:文本在窗口部件中右对齐。
wx.ST_NO_AUTORESIZE:如果使用了这个样式,那么在使用了SetLabel()改变文本之后,静态文本控件不将自我调整尺寸。你应结合使用一个居中或右对齐的控件来保持对齐。

用户输入文本
wx.TextCtrl,examples:

import wx
class TextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'Text Entry Example',size=(300, 100))
        panel = wx.Panel(self, -1)
        basicLabel = wx.StaticText(panel,-1,"Basic Control:")
        basicText = wx.TextCtrl(panel,-1,"I've entered some text!",size=(175, -1))
        basicText.SetInsertionPoint(0)

        pwdLabel = wx.StaticText(panel, -1, "Password:")
        pwdText = wx.TextCtrl(panel,-1,"password",size=(175, -1),style=wx.TE_PASSWORD)
        sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)
        sizer.AddMany([basicLabel, basicText, pwdLabel, pwdText])
        panel.SetSizer(sizer)

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

wx.TextCtrl类的构造函数:
wx.TextCtrl(parent, id, value = "", pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator name=wx.TextCtrlNameStr)

单行wx.TextCtrl的样式:
wx.TE_CENTER:控件中的文本居中。
wx.TE_LEFT:控件中的文本左对齐。默认行为。
wx.TE_NOHIDESEL:文本始终高亮显示,只适用于Windows。
wx.TE_PASSWORD:不显示所键入的文本,代替以星号显示。
wx.TE_PROCESS_ENTER:如果使用了这个样式,那么当用户在控件内按下回车键时,一个文本输入事件被      触发。否则,按键事件内在的由该文本控件或该对话框管理。
wx.TE_PROCESS_TAB:如果指定了这个样式,那么通常的字符事件在Tab键按下时创建(一般意味一个制表符将被插入文本)。否则,tab由对话框来管理,通常是控件间的切换。
wx.TE_READONLY:文本控件为只读,用户不能修改其中的文本。
wx.TE_RIGHT:控件中的文本右对齐。

一个多行或富文本控件
可以使用wx.TE_MULTILINE样式标记创建一个多行文本控件,examples:

import wx
class TextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'Text Entry Example',size=(300, 250))
        panel = wx.Panel(self,-1)
        multiLabel = wx.StaticText(panel,-1,"Multi-line")
        multiText = wx.TextCtrl(panel,-1,
               "Here is a looooooooooooooong line of text set in the control.\n\n"
               "See that it wrapped, and that this line is after a blank",
               size=(200, 100), style=wx.TE_MULTILINE) #创建一个文本控件
        multiText.SetInsertionPoint(0) #设置插入点

        richLabel = wx.StaticText(panel, -1, "Rich Text")
        richText = wx.TextCtrl(panel, -1,
                "If supported by the native control, this is reversed, and this is a different font.",
                size=(200, 100), style=wx.TE_MULTILINE|wx.TE_RICH2) #创建丰富文本控件
        richText.SetInsertionPoint(0)
        richText.SetStyle(44, 52, wx.TextAttr("white", "black")) #设置文本样式
        points = richText.GetFont().GetPointSize()
        f = wx.Font(points + 3, wx.ROMAN, wx.ITALIC, wx.BOLD, True) #创建一个字体
        richText.SetStyle(68,82,wx.TextAttr("blue",wx.NullColour,f)) #用新字体设置样式
        sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)
        sizer.AddMany([multiLabel, multiText, richLabel, richText])
        panel.SetSizer(sizer)
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = TextFrame()
    frame.Show()
    app.MainLoop()

除了wx.TE_MULTILINE,还有另外的样式标记,它们只在一个多行或丰富文本控件的上下文中有意义:
wx.HSCROLL:如果文本控件是多行的,并且如果该样式被声明了,那么长的行将不会自动换行,并显示水平滚动条。该选项在GTK+中被忽略。
wx.TE_AUTO_URL:如果丰富文本选项被设置并且平台支持的话,那么当用户的鼠标位于文本中的一个URL上或在该URL上敲击时,这个样式将导致一个事件被生成。
wx.TE_DONTWRAP:wx.HSCROLL的别名。
wx.TE_LINEWRAP:对于太长的行,以字符为界换行。某些操作系统可能会忽略该样式。
wx.TE_MULTILINE:文本控件将显示多行。
wx.TE_RICH:用于Windows下,丰富文本控件用作基本的窗口部件。这允许样式文本的使用。
wx.TE_RICH2:用于Windows下,把最新版本的丰富文本控件用作基本的窗口部件。
wx.TE_WORDWRAP:对于太长的行,以单词为界换行。许多操作系统会忽略该样式。

上面这些样式可以组合使用,所以上面例子中的多行丰富文本控件使用wx.TE_MULTILINE | wx.TE_RICH2来声明。

wx.TextCtrl窗口部件中的文本样式是类wx.TextAttr的实例。wx.TextAttr实例的属性有文本颜色、背景色、和字体,它们都能够在构造函数中被指定:
wx.TextAttr(colText, colBack=wx.NullColor, font=wx.NullFont)

创建一个字体
wx.Font(pointSize, family, style, weight, underline=False, faceName="", encoding=wx.FONTENCODING_DEFAULT)
字体样式:
wx.DECORATIVE:一个正式的,老的英文样式字体。
wx.DEFAULT:系统默认字体。
wx.MODERN:一个单间隔(固定字符间距)字体。
wx.ROMAN:serif字体,通常类似于Times New Roman。
wx.SCRIPT:手写体或草写体
wx.SWISS:sans-serif字体,通常类似于Helvetica或Arial

响应文本事件:
frame.Bind(wx.EVT_TEXT, frame.OnText, text)

事件类型:
EVT_TEXT:当控件中的文本改变时产生该事件。文本因用户的输入或在程序中使用SetValue()而被改变,都要产生该事件。
EVT_TEXT_ENTER:当用户在一个wx.TE_PROCESS_ENTER样式的文本控件中按下了回车键时,产生该事件。
EVT_TEXT_URL:如果在Windows系统上,wx.TE_RICH或wx.TE_RICH2样式被设置了,并且wx.TE_AUTO_URL样式也被设置了,那么当在文本控件内的URL上发生了一个鼠标事件时,该事件被触发。
EVT_TEXT_MAXLEN:如果使用SetMaxLength()指定了该控件的最大长度,那么当用户试图输入更长的字符串时,该事件被触发。你可能会用这个,例如,这时给用户显示一个警告消息。

使用按钮工作
简单按钮,examples:

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.num = 0
        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):
        if self.num == 0:
            self.num = 1
            self.button.SetLabel("Clicked")
        else:
            self.num = 0
            self.button.SetLabel("Hello")
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")

位图按钮(暂时略过)

通用按钮,examples:

import wx
import wx.lib.buttons as buttons

class GenericButtonFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'ButtonExample',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 = 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) 

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

滑块功能
wx.Slider,examples:

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

wx.Slider的样式:
wx.SL_AUTOTICKS:如果设置这个样式,则滑块将显示刻度。刻度间的间隔通过SetTickFreq方法来控制。
wx.SL_HORIZONTAL:水平滑块。这是默认值。
wx.SL_LABELS:如果设置这个样式,那么滑块将显示两头的值和滑块的当前只读值。有些平台可能不会显示当前值。
wx.SL_LEFT:用于垂直滑块,刻度位于滑块的左边。
wx.SL_RIGHT:用于垂直滑块,刻度位于滑块的右边。
wx.SL_TOP:用于水平滑块,刻度位于滑块的上部。
wx.SL_VERTICAL:垂直滑块。

微调控制器
wx.SpinCtrl,examples:

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

构造函数:
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来设置该控件的范围。
你可以使用SetRange(minVal, maxVal) 和 SetValue(value)方法来设置范围和值。SetValue()函数要求一个字符串或一个整数。要得到值,使用方法:GetValue()(它返回一个整数), GetMin(), 和 GetMax()。

生成进度条
wx.Gauge,examples:

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的构造函数:
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样式。

复选框
wx.CheckBox,examples:

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构造函数:
wx.CheckBox(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="checkBox")

复选框没有样式标记,但是它们产生属于自己的独一无二的命令事件:EVT_CHECKBOX。wx.CheckBox的开关状态可以使用GetValue()和SetValue(state)方法来访问,并且其值是一个布尔值。IsChecked()方法等同于GetValue()方法,只是为了让代码看起来更易明白。

单选按钮
wx.RadioButton,examples:

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

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

wx.RB_GROUP样式声明该按钮位于一组单选按钮开头。一组单选按钮的定义是很重要的,因为它控制开关行为。当组中的一个按钮被选中时,先前被选中的按钮被切换到未选中状态。在一个单选按钮使用wx.RB_GROUP被创建后,所有后来的被添加到相同父窗口部件中的单选按钮都被添加到同一组,直到另一单选按钮使用wx.RB_GROUP被创建,并开始下一个组。

wx.RadioBox类让你能够创建一个单一的对象,该对象包含了完整的组,examples:

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, "Another Box", (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的构造函数比简单的单选按钮更复杂:
wx.RadioBox(parent, id, label, pos=wx.DefaultPosition,
        size=wxDefaultSize, choices=None, majorDimension=0,
        style=wx.RA_SPECIFY_COLS, validator=wx.DefaultValidator,
        name="radioBox")

列表框
wx.ListBox,examples:

import wx

class ListBoxFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'List Box Example',size=(250, 200))
        panel = wx.Panel(self, -1)
        sampleList = ['zero','one','two','three','four','five','six','seven','eight',
                      'nine','ten','eleven','twelve','thirteen','fourteen']
        listBox = wx.ListBox(panel,-1,(20,20),(80,120),sampleList,wx.LB_SINGLE)
        listBox.SetSelection(3)
               
if __name__ == '__main__':
    app = wx.PySimpleApp()
    ListBoxFrame().Show()
    app.MainLoop() 

wx.ListBox的构造函数:
wx.ListBox(parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, choices=None, style=0, validator=wx.DefaultValidator, name="listBox")

列表框的选择类型样式:
wx.LB_EXTENDED:用户可以通过使用shift并敲击鼠标来选择一定范围内的连续的选项,或使用等同功能的按键。
wx.LB_MULTIPLE:用户可以一次选择多个选项(选项可以是不连续的)。实际上,在这种情况下,列表框的行为就像是一组复选框。
wx.LB_SINGLE:用户一次只能选一个选项。实际上,在这种情况下,列表框的行为就像是一组单选按钮。
列表框的滚动条类型样式:
wx.LB_ALWAYS_SB:列表框将始终显示一个垂直的滚动条,不管有没有必要。
wx.LB_HSCROLL:如果本地控支持,那么列表框在选择项太多时,将创建一个水平滚动条。
wx.LB_HSCROLL:列表框只在需要的时候显示一个垂直的滚动条。这是默认样式。
还有一个样式wx.LB_SORT,它使得列表中的元素按字母顺序排序。

下拉选择框
wx.Choice,examples:
import wx

class ChoiceFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'Choice Example',size=(250, 200))
        panel = wx.Panel(self,-1)
        sampleList = ['zero','one','two','three','four','five','six','seven','eight']
        wx.StaticText(panel, -1, "Select one:", (15, 20))
        wx.Choice(panel, -1, (85, 18), choices=sampleList)

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

wx.Choice的构造函数:
wx.Choice(parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, choices=None, style=0, validator=wx.DefaultValidator, name="choice")

文本域与列表合并
wx.ComboBox,examples:

import wx

class ComboBoxFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Combo Box Example',
                size=(350, 300))
        panel = wx.Panel(self, -1)
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']
        wx.StaticText(panel, -1, "Select one:", (15, 15))
        wx.ComboBox(panel, -1, "default value", (15, 30), wx.DefaultSize,
                    sampleList, wx.CB_DROPDOWN)
        wx.ComboBox(panel, -1, "default value", (150, 30), wx.DefaultSize,
                        sampleList, wx.CB_SIMPLE)
                       
if __name__ == '__main__':
    app = wx.PySimpleApp()
    ComboBoxFrame().Show()
    app.MainLoop()    

wx.ComboBox的构造函数:
wx.ComboBox(parent, id, value="", pos=wx.DefaultPosition,size=wx.DefaultSize, choices, style=0,
        validator=wx.DefaultValidator, name="comboBox")

你可能感兴趣的:(windows,F#,wxPython)