Python实例讲解 -- wxpython 基本的控件 (按钮)(frankarmstrong)
使用按钮工作
在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 )看起来十分像文本按钮,但它的行为更像复选框,它的选择或非选择状态是可视化的。换句话说,当你按下一个开关按钮(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
例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() 。
在下一节,我们将讨论关于使你的用户能够输入或观看一个数字值的方案。
[url=][/url]
|