SpinCtrl与步进增量值

2024-05-14 16:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个具有步长增量的自定义SpinCtrl。这看起来很简单,所以我很惊讶原生SpinCtrl似乎没有这个功能,而Google在这方面也被证明是非常无用的。在

然而,当我试图定制一个时,我遇到了问题。这里有一些快速而肮脏的代码

class SpinStepCtrl( wx.SpinCtrl ):
    def __init__( self, *args, **kwargs ):
        super( SpinStepCtrl, self ).__init__( *args, **kwargs )

        self.step = 99

        self.Bind( wx.EVT_SPINCTRL, self.OnSpin )
        #self.Bind( wx.EVT_SPIN_UP, self.OnUp )
        #self.Bind( wx.EVT_SPIN_DOWN, self.OnDown )

    def OnSpin( self, event ):
        print 'X'
        self.SetValue( self.GetValue() + self.step )

指纹就在那里,所以我可以看看发生了什么。至少我把所有的事情都说出来了。在

当使用EVT_SPINCTRL时,会调用回调,但最终会进入无限循环,因为SetValue显然会导致调用一个新的此类事件。这两种方法都没有多大帮助,因为我找不到一种方法来判断这是一个自旋上升还是自旋下降事件,所以我无法适当地更改值。在

我怎么才能让它工作?在


Tags: selfinitbinddefstepargskwargsevt
3条回答

这对我有用:

import wx

class SpinStepCtrl(wx.SpinCtrl):
    def __init__(self, *args, **kwargs):
        wx.SpinCtrl.__init__(self, *args, **kwargs)
        self.step = 99
        self.Bind(wx.EVT_SPIN_UP, self.OnUp)
        self.Bind(wx.EVT_SPIN_DOWN, self.OnDown)

    def OnUp(self, event):
        self.SetValue(self.GetValue() + self.step)

    def OnDown(self, event):
        self.SetValue(self.GetValue() - self.step)

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.panel = wx.Panel(self)
        self.spin = SpinStepCtrl(self.panel, min=0, max=1000)
        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

在wx.lib.agw公司有floatspin小部件,它有更多的选项。我也将它与SetDigits(0)一起用于整数输入。在

import wx
import wx.lib.agw.floatspin as FS

class MyFrame(wx.Frame):

    def __init__(self, parent):

        wx.Frame.__init__(self, parent, -1, "FloatSpin Demo")

        panel = wx.Panel(self)

        floatspin = FS.FloatSpin(panel, -1, pos=(50, 50), min_val=0, max_val=1000,
                                 increment=99, value=0, agwStyle=FS.FS_LEFT)
        floatspin.SetDigits(0)


# our normal wxApp-derived class, as usual

app = wx.App(0)

frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()

app.MainLoop()

好吧,不是最好的,但在Ubuntu上工作:

#!/usr/bin/python
import wx

class SpinStepCtrl(wx.SpinCtrl):
    def __init__(self, *args, **kwargs):
        wx.SpinCtrl.__init__(self, *args, **kwargs)
        self.step = 99
        self.last_value = 0
        self.Bind(wx.EVT_SPINCTRL, self.OnSpin)

    def OnSpin(self, event):
        delta = self.GetValue() - self.last_value
        if delta == 0:
            return
        elif delta > 0:
            self.last_value = self.GetValue() + self.step
        else:
            self.last_value = self.GetValue() - self.step
        self.SetValue(self.last_value)

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.panel = wx.Panel(self)
        self.spin = SpinStepCtrl(self.panel, min=0, max=1000)
        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

不过,我还是会考虑”自身设置值“正在生成”wx.EVT_旋转控制“一只虫子。在

相关问题 更多 >

    热门问题