Python实例讲解 -- wxpython 基本的控件 (按钮)

python 专栏收录该内容
30 篇文章 0 订阅

使用按钮工作

 

wxPython 中有很多不同类型的按钮。这一节,我们将讨论文本按钮、位图按钮、开关按钮(toggle buttons )和通用(generic )按钮。

 

如何生成一个按钮?

 

在第一部分(part 1)中,我们已经说明了几个按钮的例子,所以这里我们只简短的涉及它的一些基本的东西。图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 的构造函数类似于我们已经看到过的,如下所示:

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所示。

 

w7.5.gif

 

wxPython 中,使用类wx.BitmapButton 来创建一个位图按钮。处理一个wx.BitmapButton 的代码是与通用按钮的代码非常类似的,例7.5显示了产生7.5的代码。

 

例7.5 创建一个位图按钮

 

 

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

与普通按钮的主要的区别是你需要提供一个位图,而非一个标签。否则,构造器和大部分代码是与文本按钮的例子相同的。位图按钮在被敲击时同样产生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 )看起来十分像文本按钮,但它的行为更像复选框,它的选择或非选择状态是可视化的。换句话说,当你按下一个开关按钮(togglebutton )时,它将一直保持被按下的状态直到你再次敲击它。

 

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

w7.6.gif

 

例7.6显示了产生图7.6的代码。第二个导入语句:import wx.lib.buttons as buttons ,是必须的,它使得通用按钮类可用。

 

例7.6 创建和使用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中,通用按钮的用法非常类似于常规按钮。通用按钮产生与常规按钮同样的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

w7.7.gif

 

滑块的基本使用是十分简单的,但是你可以增加许多事件。

 

如何使用滑块

 

例7.7是产生图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 类时,所有你所需要的就是一个构造函数,它与别的调用不同,如下所示:

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

w7.8.gif

 

wxPython 中,类wx.SpinCtrl 管理微调按钮和相应的文本显示。在接下来的部分,我们将创建一个微调控制器。

 

如何创建一个微调控制器

 

要使用wx.SpinCtrl 来改变值,可通过按箭头按钮或通过在文本控件中输入。键入的非数字的文本将被忽略,尽管控件显示的是键入的非数字的文本。一个超出范围的值将被认作是相应的最大或最小值,尽管显示的是你输入的值。例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()     
 

 

几乎微调控件所有复杂的东西都是在其构造函数中,其构造函数如下:

 

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

 

参数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

w7.9.gif

 

例7.9显示了产生图7.9的代码。与本章中许多别的例子不同的是,这里我们增加了一个事件处理器。下面的代码在空闭时调整标尺的值,使得值周而复始的变化。

 

例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 的构造函数类似于其它的数字的窗口部件:

 

Python代码   收藏代码
  1. 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

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 构造函数:

 

Python代码   收藏代码
  1. 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

w7.11.gif

 

我们在这个例子中使用wx.RadioButton 的原因是因为每个单选按钮控制着一个关联的文本控件。由于窗口部件是位于这组单选按钮之外的,所以我们不能只用一个单选按钮框。

 

如何创建单选按钮

 

例7.11显示了图7.11的代码,它管理单选按钮和文本控件之间的联系。

 

例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. #创建单选按钮  
  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. #创建文本控件  
  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()   
 

我们创建了单选按钮和文本框,然后使用字典来建立它们间的连接。一个for 循环使得两个文本框无效,另一个for 循环绑定单选按钮命令事件。当事件发生的时候,当前活动的文本框变为无效,与被敲击的按钮相匹配的文本框变为有效。

wx.RadioButton 的使用类似于是wx.CheckBox 。它们的构造函数几乎是相同的,如下所示:

 

Python代码   收藏代码
  1. 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

w7.12.gif

 

要使用wx.RadioBox 类,你所需要的全部就是构造函数。例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 的构造函数比简单的单选按钮更复杂,因为你需要去一下子为所有的按钮指定数据,如下所示:

 

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 参数是静态文本,它显示在单选框的边框上。这些按钮使用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 的按钮。

 

单选按钮不是给用户一系列选择的唯一方法。列表框和组合框占用的空间也少,也可以被配置来让用户从同一组中作多个选择。

 

如何创建一个列表框?

 

列 表框是提供给用户选择的另一机制。选项被放置在一个矩形的窗口中,用户可以选择一个或多个。列表框比单选按钮占据较少的空间,当选项的数目相对少的时候, 列表框是一个好的选择。然而,如果用户必须将滚动条拉很远才能看到所有的选项的话,那么它的效用就有所下降了。图7.13显示了一个wxPython 列表框。

 

w7.13.gif

 

wxPython 中,列表框是类wx.ListBox 的元素。该类的方法使你能够处理列表中的选择。

 

如何创建一个列表框

 

例7.13显示了产生图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 的构造函数类似于单选框的,如下所示:

 

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

 

单选框和列表框的主要区别是wx.ListBox 没有label 属性。显示在列表中的元素放置在参数choices 中,它是一个字符串的序列。列表框有三种互斥的样式,它决定用户如何从列表框中选择元素,说明在表7.12中。

 

用户通常对于多选有一些问题,因为它们一般希望见到的是单选列表,对于多选来说可能是有挑战性的(就像单选题和多选题一样),尤其是对于那些易受困扰的用户。如果你使用了一个多选的列表,我们建议你清楚地标明该列表。

 

表7.12 列表框的选择类型样式

 

wx.LB_EXTENDED :用户可以通过使用shift 并敲击鼠标来选择一定范围内的连续的选项,或使用等同功能的按键。

wx.LB_MULTIPLE :用户可以一次选择多个选项(选项可以是不连续的)。实际上,在这种情况下,列表框的行为就像是一组复选框。

 

wx.LB_SINGLE :用户一次只能选一个选项。实际上,在这种情况下,列表框的行为就像是一组单选按钮。

 

有三种控制wx.ListBox 中滚动条的显示的样式,如表7.13所示。

 

表7.13 列表框的滚动条类型样式

wx.LB_ALWAYS_SB :列表框将始终显示一个垂直的滚动条,不管有没有必要。

wx.LB_HSCROLL :如果本地控支持,那么列表框在选择项太多时,将创建一个水平滚动条。

wx.LB_HSCROLL :列表框只在需要的时候显示一个垂直的滚动条。这是默认样式。

 

还有一个样式wx.LB_SORT ,它使得列表中的元素按字母顺序排序。

 

有两个专用于wx.ListBox 的命令事件。EVT_LISTBOX 事件在当列表中的一个元素被选择时触发(即使它是当前所选择的元素)。如果列表被双击,EVT_LISTBOX_DCLICK 事件发生。

 

有一些专用于列表框的方法,你可以用来处理框中的项目。表7.14对许多的方法作了说明。列表框中的项目索引从0开始。

一旦你有了一个列表框,自然就想把它与其它的窗口部件结合起来使用,如下拉菜单,或复选框。在下一节,我们对此作讨论。

 

表7.14 列表框的方法

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

Clear() :清空列表框。

Delete(n) :删除列表框中索引为n的项目。

Deselect(n) :在多重选择列表框中,导致位于位置n的选项取消选中。在其它样式中不起作用。

FindString(string) :返回给定字符串的整数位置,如果没有发现则返回-1。

GetCount() :返回列表中字符串的数量。

GetSelection() SetSelection(n , select) GetStringSelection() SetStringSelection(string , select)GetSelections() :GetSelection() 得到当前选择项的整数索引(仅对于单选列表)。对于多选列表,使用GetSelections() 来返回包含所选项目的整数位置的元组。对于单选列表,GetStringSelection() 返回当前选择的字符串。相应的set 方法使用布尔值参数select 设置指定字符串或索引选项的状态。使用这种方法改变选择不触发EVT_LISTBOX 事件。

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

InsertItems(items , pos) :插入参数items 中的字符串列表到该列表框中pos 参数所指定的位置前。位置0表示把项目放在列表的开头。

Selected(n) :返回对应于索引为n的项目的选择状态的布尔值。

Set(choices) :重新使用 choices 的内容设置列表框。

 

如何合并复选框和列表框?

 

你可以使用类wx.CheckListBox 来将复选框与列表框合并。图7.14显示了列表框和复选框在合并在一起的例子。

 

图7.14

w7.14.gif

 

wx.CheckListBox 的构造函数和大多数方法与wx.ListBox 的相同。它有一个新的事件:wx.EVT_CHECKLISTBOX ,它在当列表中的一个复选框被敲击时触发。它有两个管理复选框的新的方法:Check(n , check) 设置索引为n的项目的选择状态,IsChecked(item) 在给定的索引的项目是选中状态时返回True 。

 

如果我想要下拉形式的选择该怎么做?

 

下拉式选择是一种仅当下拉箭头被敲击时才显示选项的选择机制。它是显示所选元素的最简洁的方法,当屏幕空间很有限的时候,它是最有用的。图7.15显示了一个关闭的下拉式选择。图7.16显示了一个打开的下拉式选择。

 

图7.15

w7.15.gif

图7.16

 

w7.16.gif

 

下拉式选择的使用与标准的列表框是很相似的。例7.14显示了如何创建一个下拉式选择。

 

例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 的构造函数与列表框的基本相同:

 

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 对象。

 

我能够将文本域与列表合并在一起吗?

 

将文本域与列表合并在一起的窗口部件称为组合框,其本质上是一个下拉选择和文本框的组合。图7.17显示了一个组合框。

 

图7.17 左边是wx.CB_DropDOWN 样式,右边是wx.CB_SIMPLE 样式

 

w7.17.gif

 

Windows 上,你可以使用右边的样式,它是一个列表框和文本框的组合。

创建组合框的代码与我们已经见过的选择是类似的。该类是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 的构造函数如下所示:

 

 

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 创建一个带有下拉列表的组合框,wx.CB_SIMPLE 创建一个带有列表框的组合框。在Windows 上你可以只使用wx.CB_SIMPLE 样式。任何组合框都可以被指定为wx.CB_READONLY 样式,它防止用户在文本域中键入。当组合框被指定为只读时,所做的选择必须来自于选择列表的元素之一,即使你用程序来设置它也不行。最后wx.CB_SORT 样式导致选择列表中的元素按字母顺序显示。

 

由于wx.ComboBox 是wx.Choice 的子类,所有的wx.Choice 的方法都能被组合框调用,如表7.14所示。另外,还有许多方法被定义来处理文本组件,它们的行为同wx.TextCtrl (参见表7.4),所定义的方法有Copy() , Cut() , GetInsertionPoint() , GetValue() , Paste() , Replace(from ,to , text) , Remove(from , to) , SetInsertionPoint(pos) , SetInsertionPointEnd() ,和 SetValue() 。

 

 

 

from:http://wiki.woodpecker.org.cn/moin/WxPythonInAction/ChapterSeven

 

 

分享到:   
参考知识库
Java SE知识库 20531  关注 | 468  收录
微信开发知识库 16820  关注 | 663  收录
React Native知识库 4931  关注 | 1164  收录
CSS3知识库 8633  关注 | 1693  收录
评论
1 楼  loupaopao 2014-02-10  
楼主:
我按照您的代码,写的一模一样,但是调试出的结果老是出错,我不知道为什么

代码:
import wx
class bucky(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Frame aka window',size=(300,200))
        panel=wx.Panel(self)

        pic=wx.Image("im.bmp",wx.BITMAP_TYPT_BMP).ConvertToBitmap()
        self.button=wx.BitmapButton(panel,-1,pic,pos=(10,10))
        self.Bind(wx.EVT_BUTTON,self.doMe,self.button)
        self.button.SetDefault()
    
    
    def doMe(self,event):
       self.Destroy()

if __name__=='__main__':
    app=wx.App(False)
    frame=bucky(parent=None,id=-1)
    frame.Show()
    app.MainLoop()
出错内容:
Traceback (most recent call last):
  File "D:/python/lizi", line 18, in <module>
    frame=bucky(parent=None,id=-1)
  File "D:/python/lizi", line 7, in __init__
    pic=wx.Image("im.bmp",wx.BITMAP_TYPT_BMP).ConvertToBitmap()
AttributeError: 'module' object has no attribute 'BITMAP_TYPT_BMP'
  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

wxPython学习手册。学习必备! Part1 wxPython入门 19 1. 欢迎来到wxPython 19 1.1 开始wxPython 20 1.2 创建最小的空的wxPython程序 20 1.2.1 导入wxPython 21 1.2.2 使用应用程序和框架工作 22 子类化wxPython application类 23 定义一个应用程序的初始化方法 23 创建一个应用程序实例并进入它的主事件循环 23 1.3 扩展这个最小的空的wxPython程序 24 1.4 创建最终的hello.py程序 26 2、给你的wxPython程序一个稳固的基础 28 2.1 关于所要求的对象我们需要知道些什么? 28 2.2 如何创建和使用一个应用程序对象? 29 2.2.1 创建一个wx.App的子类 29 何时省略wx.App的子类 30 2.2.2 理解应用程序对象的生命周期 31 2.3 如何定向wxPython程序的输出? 31 2.3.1 重定向输出 32 2.3.2 修改默认的重定向行为 34 2.4 如何关闭wxPython应用程序? 34 2.4.1 管理正常的关闭 35 2.4.2 管理紧急关闭 35 2.5 如何创建和使用顶级窗口对象? 36 2.5.1 使用wx.Frame 36 2 / 565 2.5.2 使用wxPython的ID 37 明确地选择ID号 38 使用全局性的NewID()函数 38 2.5.3 使用wx.Size和wx.Point 38 2.5.4 使用wx.Frame的样式 39 2.6 如何为一个框架增加对象和子窗口? 41 2.6.1 给框架增加窗口部件 42 2.6.2 给框架增加菜单栏、工具栏和状态栏。 44 2.7 如何使用一般的对话框? 45 消息对话框 46 文本输入对话框 47 从一个列表中选择 47 2.8 一些最常见的错误现象及解决方法? 48 2.9 总结 49 3、在事件驱动环境中工作 51 3.1 要理解事件,我们需要知道哪些术语? 51 3.2 什么是事件驱动编程? 52 3.2.1 编写事件处理器 54 3.2.2 设计事件驱动程序 55 3.2.3 事件触发 55 3.3 如何将事件绑定到处理器? 56 3.3.1 使用wx.EvtHandler的方法工作 57 3.4 wxPython是如何处理事件的? 61 3.4.1 理解事件处理过程 62 第一步,创建事件 64 第二步,确定事件对象是否被允许处理事件。 64 第三步 定位绑定器对象 65 3 / 565 第四步 决定是否继续处理 66 第五步 决定是否展开 67 3.4.2 使用Skip()方法 68 3.5 在应用程序对象中还包含哪些其它的属性? 70 3.6 如何创建自己的事件? 71 3.6.1 为一个定制的窗口部件定义一个定制的事件。 71 创建自定义事件的步骤: 71 3.7 总结 75 4、用PyCrust使得wxPython更易处理 76 4.1 如何与wxPython程序交互? 76 PyCrust配置了标准的Python shell 77 4.2 PyCrust的有用特性是什么? 79 4.2.1 自动完成 80 4.2.2 调用提示和参数默认 80 4.2.3 语法高亮 81 4.2.4 Python 帮助 81 4.2.5 命令重调用 82 4.2.6 剪切和粘贴 83 4.2.7 标准shell环境 84 4.2.8 动态更新 85 4.3 PyCrust notebook的标签是干什么的? 87 4.3.1 Namespace标签 87 4.3.2 Display标签 89 4.3.3 Calltip(调用提示)标签 89 4.3.4 Session标签 90 4.3.5 Dispatcher 标签 90 4.4 如何将PyCrust应用于wxPython应用程序。 92 4 / 565 4.5 在Py包中还有其它什么? 96 4.5.1 使用GUI程序工作 97 4.5.2 使用支持模块工作 97 buffer模块 98 crust 模块 100 dispatcher模块 100 editor模块 102 filling模块 102 interpreter模块 103 introspect模块 103 shell模块 103 4.6 如何在wxPython中使用Py包中的模块? 104 4.7 本章小结 108 5、创建你的蓝图 109 5.1 重构如何帮我改进我的代码? 109 5.1.1 一个重构的例子 110 5.1.2 开始重构 113 5.1.3 进一步重构 114 5.2 如何保持模型(Model)与视图(View)分离? 118 5.2.1 MVC(Model-View-Controller)系统是什么? 118 5.2.2 一个wxPython模型:PyGridTableBase 120 PyGridTableBase的方法 122 使用PyGridTableBase 123 使用PyGridTableBase:特定于应用程序(不通用)的子类 123 使用PyGridTableBase:一个通用的例子 125 使用PyGridTableBase:一个独立的模型类 127 5.2.3 自定义模型 129 5 / 565 5.3 如何对一个GUI程序进行单元测试? 133 5.3.1 unittest模块 134 5.3.2 一个unittest范例 135 5.3.3 测试用户事件 137 5.4 本章小结 138 6、使用基本的建造部件 140 6.1 在屏幕上绘画 141 6.1.1 如何在屏幕上绘画 141 使用设备上下文 141 设备上下文的函数 147 6.2 添加窗口装饰 149 6.2.1 如何添加和更新一个状态栏 149 6.2.2 如何添加菜单? 152 6.3 得到标准信息 156 6.3.1 如何使用标准文件对话框? 156 6.3.2 如何使用标准的颜色选择器? 160 6.4 给应用程序一个好看的外观 161 6.4.1 如何布局窗口部件? 161 创建一个sizer 161 使用sizer 162 6.4.2 如何建造一个关于(about)框? 168 6.4.3 如何建造一个启动画面? 170 6.5 本章小结 172 Part 2 基本wxPython 174 7、使用基本控件工作 175 7.1 显示文本 175 6 / 565 7.1.1 如何显示静态文本? 175 如何显示静态文本 176 使用样式工作 178 其它显示文本的技术 178 7.1.2 如何让用户输入文本? 179 如何创建文本输入控件 179 使用单行文本控件样式 180 7.1.3 不输入的情况下如何改变文本? 181 7.1.4 如何创建一个多行或样式文本控件? 182 使用多行或丰富文本样式 184 7.1.5 如何创建一个字体? 186 7.1.6 如果我们系统不支持丰富文本,那么我还能使用样式文本吗? 187 7.1.7 如果我的文本控件不匹配我的字符串该怎么办? 187 7.1.8 如何响应文本事件? 188 7.2 使用按钮工作 189 7.2.1 如何生成一个按钮? 189 7.2.2 如何生成一个位图按钮? 191 7.2.3 如何创建开关按钮(toggle button)? 192 7.2.4 什么是通用按钮,我为什么要使用它? 193 7.3 输入并显示数字 196 7.3.1 如何生成一个滑块? 196 如何使用滑块 197 使用滑块样式工作 198 7.3.2 如何得到那些灵巧的上下箭头按钮? 199 如何创建一个微调控制器 199 7.3.3 如何生成一个进度条? 201 7.4 给用户以选择 202 7.4.1 如何创建一个复选框? 202 7 / 565 7.4.2 如何创建一组单选按钮(radio button)? 204 如何创建单选按钮 205 使用单选框 206 7.4.3 如何创建一个列表框? 209 如何创建一个列表框 209 7.4.4 如何合并复选框和列表框? 212 7.4.5 如果我想要下拉形式的选择该怎么做? 213 7.4.6 我能够将文本域与列表合并在一起吗? 214 7.5 本章小结 216 8、把窗口部件放入框架中 218 8.1 框架的寿命 218 8.1.1 如何创建一个框架? 218 创建一个简单的框架 218 创建框架的子类 219 8.1.2 有些什么不同的框架样式? 221 8.1.3 如何创建一个有额外样式信息的框架? 223 添加额外样式信息 223 添加额外样式信息的通用方法 224 8.1.4 当关闭一个框架时都发生了什么? 225 何时用户触发关闭过程 226 什么时候系统触发关闭过程 227 8.2 使用框架 227 8.2.1 wx.Frame有那些方法和属性? 227 8.2.2 如何查找框架的子窗口部件? 230 8.2.3 如何创建一个带有滚动条的框架? 231 如何创建滚动条 232 指定滚动区域的尺寸 233 8 / 565 滚动条事件 234 8.3 可选的框架类型 235 8.3.1 如何创建一个MDI框架? 235 图8.7 236 8.3.2 什么是小型框架,我们为何要用它? 238 8.3.3 如何创建一个非矩形的框架? 239 8.3.4 如何拖动一个没有标题栏的框架? 242 8.4 使用分割窗 244 8.4.1 创建一个分割窗 245 8.4.2 一个分割窗的例子 246 8.4.3 改变分割的外观 249 8.4.4 以程序的方式处理分割 250 8.4.5 响应分割事件 251 8.5 本章小结 252 9、对话框 253 9.1 使用模式对话框工作 253 9.1.1 如何创建一个模式对话框? 253 9.1.2 如何创建一个警告框? 255 使用wx.MessageDialog类 256 使用wx.MessageBox()函数 257 9.1.3 如何从用户得到短的文本? 258 9.1.4 如何用对话框显示选项列表? 261 9.1.5 如何显示进度条? 262 9.2 使用标准对话框 264 9.2.1 如何使用文件选择对话框? 264 选择一个文件 266 选择一个目录 267 9 / 565 9.2.2 如何使用字体选择对话框? 269 9.2.3 如何使用颜色对话框? 271 9.2.4 如何使用户能够浏览图像? 273 9.3 创建向导 274 9.4 显示启动提示 278 9.5 使用验证器(validator)来管理对话框中的数据 279 9.5.1 如何使用验证器来确保正确的数据? 279 9.5.2 如何使用验证器传递数据? 283 9.5.3 如何在数据被键入时验证数据? 287 9.6 本章小结 290 10、创建和使用wxPython菜单 292 10.1 创建菜单 292 10.1.1 如何创建一个菜单栏并把它附加到一个框架? 293 10.1.2 如何创建一个菜单并把它附加到菜单栏? 293 10.1.3 如何给下拉菜单填加项目? 296 10.1.4 如何响应一个菜单事件? 300 10.2 使用菜单项工作 301 10.2.1 如何在一个菜单中找到一个特定的菜单项? 301 10.2.2 如何使一个菜单项有效或无效? 304 10.2.3 如何将一个菜单项与一个快捷键关联起来? 306 使用助记符快捷方式 308 使用加速器快捷方式 309 10.2.4 如何创建一个复选或单选开关菜单项? 310 10.3 进一步构建菜单 313 10.3.1 如何创建一个子菜单? 313 10.3.2 如何创建弹出式菜单? 315 10.3.3 如何创建自己个性的菜单? 318 10 / 565 10.4 菜单设计的适用性准则 320 10.4.1 使菜单有均衡的长度 321 10.4.2 创建合理的项目组 321 菜单的顺序要遵循标准 321 对通常使用的项目提供方便的访问 321 使用有含义的菜单名称 321 使用标准的快捷键 322 反映出开关状态 322 10.5 本章小结 323 11 使用sizer放置窗口部件 325 11.1 sizer是什么? 325 下面是使用一个sizer的三个基本步骤: 326 11.2 基本的sizer:grid sizer 327 11.2.1 什么是grid sizer? 327 11.2.2 如何对sizer添加或移除孩子? 330 使用Add()方法 330 使用insert()方法 331 使用Prepend()方法 331 11.2.3 sizer是如何管理它的孩子的尺寸和对齐的? 332 11.2.4 能够为sizer或它的孩子指定一个最小的尺寸吗? 335 11.2.5 sizer如何管理每个孩子的边框? 337 11.3 使用其它类型的sizer 339 11.3.1 什么是flex grid sizer? 339 11.3.2 什么是grid bag sizer? 343 在grid bag sizer上使用Add()方法 345 11.3.3 什么是box sizer? 347 11.3.4 什么是static box sizer? 351 11 / 565 11.4 一个现实中使用sizer的例子 354 11.5 本章小结 358 12 处理基本的图像 360 12.1 使用图像工作 360 12.1.1 如何载入图像? 361 指定一个图像文件格式 363 创建image(图像)对象 364 创建bitmap(位图)对象 364 12.1.2 我们能够对图像作些什么? 365 设置图像的遮罩以指定一个透明的图像 367 设置alpha值来指定一个透明的图像 367 12.1.3 如何改变光标? 368 创建自定义的光标 370 12.2 处理设备上下文 370 12.2.1 什么是设备上下文,以及如何创建它? 371 基于屏幕的设备上下文 371 非屏幕设备上下文 372 缓冲设备上下文 374 12.2.2 如何绘制到设备上下文? 374 12.2.3 如何绘制图像到设备上下文? 381 拷贝部分图像 382 绘制一个位图 382 12.2.4 如何绘制文本到设备上下文? 385 12.3 图形处理 386 12.3.1 如何使用画笔处理前景色? 386 12.3.2 如何管理背景画刷? 389 自定义样式 390 12 / 565 12.3.3 如何管理逻辑和物理设备坐标? 390 12.3.4 预定义的颜色名有哪些? 392 12.4 本章小结 392 第三部分 高级wxPython 394 13 建造列表控件并管理项目 395 13.1 建造一个列表控件 395 13.1.1 什么是图标模式? 396 13.1.2 什么是小图标模式? 397 13.1.3 什么是列表模式? 399 13.1.4什么是报告模式 401 13.1.5 如何创建一个列表控件? 403 13.2 处理列表中的项目 404 13.2.1 什么是一个图像列表以及如何将图像添加给它? 404 创建一个图像列表 404 添加及移去图像 405 使用图像列表 406 13.2.2 如何对一个列表添加或删除项目? 407 增加一个新行 407 增加列 407 设置多列列表中的值 408 项目属性 408 13.3 响应用户 410 13.3.1 如何响应用户在列表中的选择? 410 13.3.2 如何响应用户在一个列的首部中的选择? 411 13.4 编辑并排序列表控件 417 13.4.1 如何编辑标签? 417 13.4.2 如何对列表排序? 418 13 / 565 在创建的时候告诉列表去排序 419 基于数据而非所显示的文本来排序 419 使用mixin类进行列排序 419 13.4.3 进一步了解列表控件 423 13.5 创建一个虚列表控件 426 13.6 本章小结 430 14 网格(grid)控件 432 14.1 创建你的网格 432 14.1.1 如何创建一个简单的网格? 433 14.1.2 如何使用网格表来创建一个网格? 435 14.2 使用网格工作 439 14.2.1 如何添加、删除行,列和单元格? 439 14.2.2 如何处理一个网格的行和列的首部? 440 14.2.3 如何管理网格元素的尺寸? 443 改变单元格的尺寸 445 设置默认尺寸 445 设置标签的尺寸 446 14.2.4 如何管理哪些单元格处于选择或可见状态? 447 14.2.5 如何改变一个网格的单元格的颜色和字体? 449 14.3 自定义描绘器和编辑器 452 14.3.1 如何使用一个自定义的单元格描绘器? 452 预定义的描绘器(renderer) 453 创建一个自定义的描绘器 454 14.3.2 如何编辑一个单元格? 456 14.3.3 如何使用一个自定义的单元格编辑器? 457 预定义的编辑器 457 创建自定义的编辑器 458 14 / 565 14.4 捕获用户事件 462 14.4.1 如何捕获用户的鼠标动作? 462 14.4.2 如何捕获用户的键盘动作? 465 14.5 本章小结 466 15 树形控件(tree control) 468 15.1 创建树形控件并添加项目 468 15.1.1 如何添加一个root(根)元素? 481 15.1.2 如何将更多的项目添加到树中? 482 15.1.3 如何管理项目? 482 15.2 树控件的显示样式 483 15.3 对树形控件的元素排序 485 15.4 控制与每项相关的图像 486 15.5 使用编程的方式访问树。 488 15.6 管理树中的选择 490 15.7 控制项目的可见性 490 虚树 491 控制可见性 494 15.8 使树控件可编辑 495 15.9 响应树控件的其它的用户事件 496 15.10 使用树列表控件 497 15.11 本章小结 501 16 在你的应用程序中加入HTML 503 16.1 显示HTML 503 16.1.1 如何在一个wxPython窗口中显示HTML? 503 16.1.2 如何显示来自一个文件或URL的HTML? 506 16.2 管理HTML窗口 508 15 / 565 16.2.1 如何响应用户在一个链接上的敲击? 508 16.2.2 如何使用编程的方式改变一个HTML窗口? 509 16.2.3 如何在窗口的标题栏中显示页面的标题? 510 16.2.4 如何打印一个HTML页面? 512 使用wx.html.HtmlEasyPrinting的实例 512 设置字体 513 输出预览 513 打印 513 16.3 拓展HTML窗口 513 16.3.1 HTML解析器(parser)是如何工作的? 514 16.3.2 如何增加对新标记的支持? 515 16.3.3 如何支持其他的文件格式? 519 16.3.4 如何得到一个性能更加完整的HTML控件? 520 16.4 本章小结 521 第17章 wxPython的打印构架 522 17.1 如何用wxPython打印? 522 17.1.1 理解打印输出的生命周期 523 17.1.2 实战打印构架 524 17.1.3 使用wx.Printout的方法工作 531 17.2 如何显示打印对话框? 532 17.2.1 创建一个打印对话框 532 使用方法 533 使用属性 533 17.3 如何显示页面设置对话框? 535 17.3.1 创建页面设置对话框 535 17.3.2 使用页面设置属性工作 536 17.4 如何打印? 538 16 / 565 第一步 按顺序得到你的所有数据 538 第二步 创建一个wx.Printer实例 538 第三步 使用wx.Printer的Print ()方法打印 538 17.5 如何实现一个打印预览? 539 第一步 创建预览实例 539 第二步 创建预览框架 539 第三步 初始化框架 540 17.6 本章小结 540 18 使用wxPython的其它功能 541 18.1 放置对象到剪贴板上 541 18.1.1 得到剪贴板中的数据 541 18.1.2 处理剪贴板中的数据 542 18.1.3 获得剪贴板中的文本数据 543 18.1.4 实战剪贴板 543 18.1.5 传递其它格式的数据 546 步骤1 创建一个数据对象 547 步骤2 创建释放源实例 547 步骤3 执行拖动 548 步骤4 处理释放 548 18.2.1 实战拖动 548 18.3 拖放到的目标 551 18.3.1 使用你的释放到的目标 551 18.3.2 实战释放 553 18.4 传送自定义对象 555 18.4.1 传送自定义的数据对象 555 18.4.2 得到自定义对象 556 18.4.3 以多种格式传送对象 556 17 / 565 18.5 使用wx.Timer来设置定时事件 557 18.5.1 产生EVT_TIMER事件 557 创建定时器 557 绑定定时器 558 启动和停止定时器 558 确定当前定时器的状态 559 18.5.2 学习定时器的其它用法 560 18.6 创建一个多线程的wxPython应用程序 560 18.6.1 使用全局函数wx.CallAfter() 561 18.6.2 使用队列对象管理线程的通信 564 18.6.3 开发你自已的解决方案 564 18.7 本章小结 565 18 / 565
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值