wx.SpinCtrl是wx.TextCtrl和wx.SpinButton控件的组合。当用户点击wx.SpinButton的向上或者向下按钮的时候,wx.TextCtrl中的值将会随之变化。用户也可以直接在wx.TextCtrl中输入想要的值。
一、wx.SpinButton
一个wx.SpinButton有两个小的上下(或左右)箭头按钮。它通常用于文本控件旁边,用于增加或减少值。
wx.SpinButton支持的窗口样式:
- wx.SP_HORIZONTAL:指定水平旋转按钮。
- wx.SP_VERTICAL:指定垂直旋转按钮。
- wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
- wx.SP_WRAP:当数值在最小值和最大值处换行。
wx.SpinButton可生成的事件:
- EVT_SPIN:当按下箭头改变旋转按钮值时生成。
- EVT_SPIN_UP:当按左/上箭头改变旋转按钮值时生成。
- EVT_SPIN_DOWN:当按下右/下箭头改变旋转按钮值时生成。
wx.SpinButton常用方法:
- GetIncrement(self):返回spin控件的增量值。
- GetMax(self):返回最大允许值。
- GetMin(self):返回最小允许值。
- GetRange(self):返回允许范围。
- GetValue(self):返回spin按钮的当前值。
- SetIncrement(self, value):设置spin控件的增量值。
- SetMax(self, maxVal):设置最大允许值。
- SetMin(self, minVal):设置最小允许值。
- SetRange(self, min, max):设置允许范围。
- SetValue(self, value):设置spin按钮的当前值。
图1:wx.SpinButton类继承关系
二、wx.SpinCtrl
wxSpinCtrl将wxTextCtrl和wxSpinButton组合在一个控件中,并显示一个整数。
wx.SpinCtrl支持的窗口样式:
- wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
- wx.SP_WRAP:当数值在最小值和最大值处换行。
- wx.TE_PROCESS_ENTER:指示控件应生成wx.EVT_TEXT_ENTER事件。使用这种样式将防止用户在MSW下使用Enter键进行对话框导航(例如激活对话框中的默认按钮)。
- wx.ALIGN_LEFT:与wx.TextCtrl的wx.TE_LEFT相同:文本向左对齐(这是默认值)。
- wx.ALIGN_CENTRE_HORIZONTAL:与wx.TextCtrl的wx.TE_CENTRE相同:文本居中。
- wx.ALIGN_RIGHT:与 wx.TextCtrl的wx.TE_RIGHT相同:文本是右对齐的。
wx.SpinCtrl发出的事件:
- EVT_SPINCTRL:处理wx.EVT_SPINCTRL事件,该事件在spin控件的数值更新时生成。
wx.SpinCtrl常用方法:
- GetBase(self):返回当前使用的进制基数,默认为10。
- GetIncrement(self):返回spin控件的增量值。
- GetMax(self):返回最大允许值。
- GetMin(self):返回最小允许值。
- GetRange(self):返回允许范围。
- GetTextValue(self):返回控件的文本输入部分中的文本。
- GetValue(self):返回spin控件的当前值。
- SetBase(self, base):设置当前使用的进制基数。
- SetIncrement(self, value):设置spin控件的增量值。
- SetMax(self, maxVal):设置最大允许值。
- SetMin(self, minVal):设置最小允许值。
- SetRange(self, minVal, maxVal):设置允许范围。
- SetSelection(self, from_, to_):选择控件文本部分中从(包括)到(不包括)位置之间的文本。
- SetValue (self, text):设置spin控件的当前值。
- SetValue (self, value):设置spin控件的当前值。
图2:wx.SpinCtrl类继承关系
三、wx.SpinCtrl演示
#数据调节框(wx.SpinCtrl)
import wx
class SampleSpinCtrl(wx.Frame):
def __init__(self, *args, **kw):
super(SampleSpinCtrl, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: SpinCtrl演示")
#设置窗口尺寸
self.SetSize(360, 280)
panel = wx.Panel(self)
sizer = wx.GridBagSizer(5, 5)
st1 = wx.StaticText(panel, label="将华氏温度转换为摄氏温度")
sizer.Add(st1, pos = (0, 0), span = (1, 2), flag = wx.ALL, border = 15)
st2 = wx.StaticText(panel, label = "华氏度:")
sizer.Add(st2, pos = (1, 0), flag = wx.ALL | wx.ALIGN_CENTER, border = 15)
self.sc = wx.SpinCtrl(panel, value="0")
self.sc.SetRange(-459, 1000)
sizer.Add(self.sc, pos = (1, 1), flag = wx.ALIGN_CENTER)
st3 = wx.StaticText(panel, label="摄氏度:")
sizer.Add(st3, pos = (2, 0), flag = wx.ALL | wx.ALIGN_RIGHT, border = 15)
self.celsius = wx.StaticText(panel, label="")
sizer.Add(self.celsius, pos = (2, 1), flag = wx.ALL, border = 15)
computeButton = wx.Button(panel, label="计算")
computeButton.SetFocus()
sizer.Add(computeButton, pos = (3, 1), flag = wx.ALIGN_RIGHT | wx.TOP, border = 30)
closeButton = wx.Button(panel, label="关闭")
sizer.Add(closeButton, pos = (3, 2), flag = wx.ALIGN_LEFT | wx.TOP, border = 30)
computeButton.Bind(wx.EVT_BUTTON, self.OnCompute)
closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
panel.SetSizer(sizer)
self.Centre()
def OnClose(self, e):
self.Close(True)
def OnCompute(self, e):
fahr = self.sc.GetValue()
cels = round((fahr - 32) * 5 / 9.0, 2)
self.celsius.SetLabel(str(cels))
def main():
app = wx.App()
sample = SampleSpinCtrl(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上面的代码演示了华氏温度转换为摄氏温度,使用wx.SpinCtrl来设置华氏温度。
self.sc = wx.SpinCtrl(panel, value="0")
self.sc.SetRange(-459, 1000)
创建初始值为0的wx.SpinCtrl控件。SetRange()方法为控件设置一个取值范围。
def OnCompute(self, e):
fahr = self.sc.GetValue()
cels = round((fahr - 32) * 5 / 9.0, 2)
self.celsius.SetLabel(str(cels))
当单击计算按钮时,OnCompute()方法被调用。在OnCompute()中,我们从spin 控件获取当前值。计算摄氏温度,并将计算出的温度设置显示在一个静态文本控件上。
图3:wx.SpinCtrl演示
四、wx.SpinCtrlDouble
wxSpinCtrlDouble将wxTextCtrl和wxSpinButton组合在一个控件中,并显示一个实数。
wx.SpinCtrlDouble支持的窗口样式:
- wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
- wx.SP_WRAP:当数值在最小值和最大值处换行。
wx.SpinCtrlDouble发出的事件:
- EVT_SPINCTRLDOUBLE:当spin控件的数值发生变化 (即单击向上/向下旋转按钮时,按下ENTER时,或控件失去焦点且新值与上次不同时) 时生成。
wx.SpinCtrlDouble常用方法:
- GetDigits(self):获取spin控件值的精度。
- GetIncrement(self):返回spin控件的增量值。
- GetMax(self):返回最大允许值。
- GetMin(self):返回最小允许值。
- GetRange(self):返回允许范围。
- GetTextValue(self):返回控件的文本输入部分中的文本。
- GetValue(self):返回spin控件的当前值。
- SetDigits(self, digits):设置spin控件值的精度。
- SetIncrement(self, value):设置spin控件的增量值。
- SetMax(self, maxVal):设置最大允许值。
- SetMin(self, minVal):设置最小允许值。
- SetRange(self, minVal, maxVal):设置允许范围。
- SetValue (self, text):设置spin控件的当前值。
- SetValue (self, value):设置spin控件的当前值。
图4:wx.SpinCtrlDouble类继承关系
五、wx.SpinCtrlDouble演示
#数据调节框(wx.SpinCtrlDouble)
import wx
class SampleSpinCtrlDouble(wx.Frame):
def __init__(self, *args, **kw):
super(SampleSpinCtrlDouble, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: SpinCtrlDouble")
#设置窗口尺寸
self.SetSize(360, 280)
panel = wx.Panel(self)
sizer = wx.GridBagSizer(5, 5)
st1 = wx.StaticText(panel, label="将华氏温度转换为摄氏温度")
sizer.Add(st1, pos = (0, 0), span = (1, 2), flag = wx.ALL, border = 15)
st2 = wx.StaticText(panel, label = "华氏度:")
sizer.Add(st2, pos = (1, 0), flag = wx.ALL | wx.ALIGN_CENTER, border = 15)
self.sc = wx.SpinCtrlDouble(panel, value="0")
self.sc.SetRange(-459, 1000)
self.sc.SetDigits(1)
self.sc.SetIncrement(0.5)
sizer.Add(self.sc, pos = (1, 1), flag = wx.ALIGN_CENTER)
st3 = wx.StaticText(panel, label="摄氏度:")
sizer.Add(st3, pos = (2, 0), flag = wx.ALL | wx.ALIGN_RIGHT, border = 15)
self.celsius = wx.StaticText(panel, label="")
sizer.Add(self.celsius, pos = (2, 1), flag = wx.ALL, border = 15)
computeButton = wx.Button(panel, label="计算")
computeButton.SetFocus()
sizer.Add(computeButton, pos = (3, 1), flag = wx.ALIGN_RIGHT | wx.TOP, border = 30)
closeButton = wx.Button(panel, label="关闭")
sizer.Add(closeButton, pos = (3, 2), flag = wx.ALIGN_LEFT | wx.TOP, border = 30)
computeButton.Bind(wx.EVT_BUTTON, self.OnCompute)
closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
panel.SetSizer(sizer)
self.Centre()
def OnClose(self, e):
self.Close(True)
def OnCompute(self, e):
fahr = self.sc.GetValue()
cels = round((fahr - 32) * 5 / 9.0, 2)
self.celsius.SetLabel(str(cels))
def main():
app = wx.App()
sample = SampleSpinCtrlDouble(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上述代码与wx.TextCtrl的演示代码基本相同。
self.sc.SetDigits(1)
self.sc.SetIncrement(0.5)
添加上面两句设置数值精度和一个小数值的步长。
图5:wx.SpinCtrlDouble演示
六、本文知识点
- 了解wx.SpinButton。
- 了解和使用wx.SpinCtrl。
- 了解和使用wx.SpinCtrlDoule。