wxPython控件学习之FloatSpin

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)。读者可以自己验证该控件存在的问题。

原文地址:https://www.cnblogs.com/ankier/p/2793357.html