FloatSpin 可以方便的显示带小数及控制小数精度的数字控件。
构造函数:
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin"):
参数 value: 控件显示的当前值
参数 min_val: 控件的值范围的下限
参数 max_val: 控件的值范围的上限
参数 increment: 步长
参数 digits: 小数位的精度,0 代表显示整数,2代表精确到小数位2位
参数 agwStyle: one of the following bits:
=============== =========== ==================================================
Window Styles Hex Value Description
=============== =========== ==================================================
``FS_READONLY`` 0x1 只读控件,无法改变控制值
``FS_LEFT`` 0x2 显示文本左对齐
``FS_CENTRE`` 0x4 显示文本剧中对其
``FS_RIGHT`` 0x8 显示文本右对齐
=============== =========== ==================================================
例子:
App主入口:
#-*- coding: UTF-8 -*- #------------------------------------------------------------------------------- # Name: 模块shell # Purpose: 应用程序的main入口函数 # # Author: ankier # # Created: 28-11-2012 # Copyright: (c) ankier 2012 # Licence: <your licence> #------------------------------------------------------------------------------- import wx from mainFrame import MainFrame import sys ## @detail ShellApp主应用程序的核 class ShellApp(wx.App): def OnInit(self): mainFrame = MainFrame() mainFrame.Show(True) return True # @detail main程序的主入口程序 if __name__ == '__main__': app = ShellApp() #重新定向wxpython的输出输入和错误输出到系统标准输入输出 sys.stdin = sys.__stdin__ sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ app.MainLoop()
主界面:
#-*- coding: UTF-8 -*- #------------------------------------------------------------------------------- # Name: 模块mainFrame # Purpose: 应用程序的主界面 # # Author: ankier # # Created: 28-11-2012 # Copyright: (c) ankier 2012 # Licence: <your licence> #------------------------------------------------------------------------------- try: from agw import floatspin as FS except ImportError: # if it's not there locally, try the wxPython lib. import wx.lib.agw.floatspin as FS import wx import sys ## @detail MainFrame主界面窗口类 class MainFrame(wx.Frame): def __init__(self): #重新定向wxpython的输出输入和错误输出到系统标准输入输出 sys.stdin = sys.__stdin__ sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ wx.Frame.__init__(self, None, wx.ID_ANY, 'FileDialog study', pos=wx.DefaultPosition, size=(800, 600), style=wx.DEFAULT_FRAME_STYLE) self.CreateStatusBar() panel = wx.Panel(self, -1) box = wx.FlexGridSizer(10, 2, 5, 5) #整数 fsPin = FS.FloatSpin(panel , id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=0, agwStyle=FS.FS_LEFT) box.Add(wx.StaticText(panel, -1, '整数,无上下界限,步长 = 1:'), 0, wx.ALIGN_CENTRE) box.Add(fsPin, 0, wx.ALIGN_CENTRE) #小数 fsPin = FS.FloatSpin(panel , id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.5, min_val=0.10, max_val=5.00, increment=0.01, digits=2, agwStyle=FS.FS_RIGHT) box.Add(wx.StaticText(panel, -1, '小数,2位小数精度,上下限(0.10, 5.00),步长 = 0.01:'), 0, wx.ALIGN_CENTRE) box.Add(fsPin, 0, wx.ALIGN_CENTRE) #整数with 只读样式 fsPin = FS.FloatSpin(panel , id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=0, agwStyle=FS.FS_LEFT|FS.FS_READONLY ) box.Add(wx.StaticText(panel, -1, '整数with 只读样式:'), 0, wx.ALIGN_CENTRE) box.Add(fsPin, 0, wx.ALIGN_CENTRE) panel.SetSizerAndFit(box)
运行结果:
控件已知的一个问题,基于wx2.8 版本:
SyncSpinToText函数中:
if force_valid or not self.HasRange() or self.InRange(curr): textCurr = curr if force_valid and self.HasRange(): curr = self.ClampValue(curr) #if self._value != textCurr: self.SetValue(curr) if send_event: self.DoSendEvent()
需要修改成这样,如果连续两次输入的值都超过上限了,或者两次输入(5 或5.0 )也都需要更新到正确的精度值比如(5.00)。读者可以自己验证该控件存在的问题。