zoukankan      html  css  js  c++  java
  • 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)。读者可以自己验证该控件存在的问题。

  • 相关阅读:
    CCS过渡和动画
    使用Vue.prototype在vue中注册和使用全局变量
    vuex的使用
    Vue组件懒加载
    JavaScript 箭头函数(Lambda表达式)
    JS命名规范
    css命名规范
    vertical-align和line-height的理解及实例
    </2017><2018>
    给当当同学的random data
  • 原文地址:https://www.cnblogs.com/ankier/p/2793357.html
Copyright © 2011-2022 走看看