EVT_SPINCTRL two events per click

I am trying to use a SpinCtrl in a program, and I want the spin
buttons to have a callback that runs a relatively long process. When
I hit the button, it generates two hits (two runs of the callback).
I'm running wxpython 2.8 on ubuntu linux. Any ideas why this would be
happening? Can I get around it without having to use threads?

Below is a modified version of the wxPython Demo that exhibits the
problem...

Thanks for your input!
-David

import wx

···

#----------------------------------------------------------------------

class TestPanel(wx.Panel):
    def __init__(self, parent, log):
        wx.Panel.__init__(self, parent, -1)
        self.log = log
        self.count = 0

        wx.StaticText(self, -1, "This example uses the wx.SpinCtrl
control.", (45, 15))
        sc = wx.SpinCtrl(self, -1, "", (30, 50))
        self.Bind(wx.EVT_SPINCTRL, self.spinCallback, sc)
        sc.SetRange(1,100)
        sc.SetValue(5)
    def spinCallback(self,event):
        self.log.WriteText("event"+str(event.GetInt())+"\n")
        import time
        time.sleep(3) # THIS MAKES THE CALLBACK GET CALLED TWICE!!!

#----------------------------------------------------------------------

def runTest(frame, nb, log):
    win = TestPanel(nb, log)
    return win

#----------------------------------------------------------------------

overview = """\
wx.SpinCtrl combines wx.TextCtrl and wx.SpinButton in one control.

Portable programs should try to use this control as wx.SpinButton is
not
implemented for all platforms (Win32 and GTK only currently).

NB: the range supported by this control depends on the platform
but is at least -0x8000 to 0x7fff. Under GTK and Win32 with
sufficiently new version
of comctrl32.dll (at least 4.71 is required, 5.80 is recommended) the
full 32 bit
range is supported.

"""

if __name__ == '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

[alm>]

I changed Panel to Frame and took out the demo environment and I don't see
the problem. I do see that with the 3 second 'stall' the clicks will queue
up.

Maybe what you want is to disable the spinctrl while your event handler is
running thus preventing additional clicks until the long process is
finished. There will be a visual effect from that. Another way is to unbind
and re-bind in the handler.

my code:
from __future__ import print_function
import sys
import wx

class TestPanel(wx.Frame):
    def __init__(self, parent=None ):
        wx.Frame.__init__(self, parent, -1, size=(400,300))

        wx.StaticText(self, -1, "This example uses the wx.SpinCtrl
control.", (45, 15))
        sc = wx.SpinCtrl(self, -1, "", (30, 50))
        self.Bind(wx.EVT_SPINCTRL, self.spinCallback, sc)
        sc.SetRange(1,100)
        sc.SetValue(5)

    def spinCallback(self,event):
        print( 'event={0}'.format( str(event.GetInt()) ) ) ;
sys.stdout.flush()
        import time
        time.sleep(3) # THIS MAKES THE CALLBACK GET CALLED TWICE!!!

class AregApp( wx.App ):

    def OnInit(self):
        self.frame = TestPanel( None )
        self.frame.SetPosition(wx.Point(10,10))
        self.frame.Show(True)
        self.SetTopWindow( self.frame )
        return True

if __name__ == '__main__':
    app = AregApp(False)
    app.MainLoop()

···

-----Original Message-----
From: wxpython-users@googlegroups.com [mailto:wxpython-
users@googlegroups.com] On Behalf Of David Mashburn
Sent: Friday, August 13, 2010 2:59 PM
To: wxPython-users
Subject: [wxPython-users] EVT_SPINCTRL two events per click

I am trying to use a SpinCtrl in a program, and I want the spin
buttons to have a callback that runs a relatively long process. When
I hit the button, it generates two hits (two runs of the callback).
I'm running wxpython 2.8 on ubuntu linux. Any ideas why this would be
happening? Can I get around it without having to use threads?

Below is a modified version of the wxPython Demo that exhibits the
problem...

Thanks for your input!
-David

import wx

#----------------------------------------------------------------------

class TestPanel(wx.Panel):
    def __init__(self, parent, log):
        wx.Panel.__init__(self, parent, -1)
        self.log = log
        self.count = 0

        wx.StaticText(self, -1, "This example uses the wx.SpinCtrl
control.", (45, 15))
        sc = wx.SpinCtrl(self, -1, "", (30, 50))
        self.Bind(wx.EVT_SPINCTRL, self.spinCallback, sc)
        sc.SetRange(1,100)
        sc.SetValue(5)
    def spinCallback(self,event):
        self.log.WriteText("event"+str(event.GetInt())+"\n")
        import time
        time.sleep(3) # THIS MAKES THE CALLBACK GET CALLED TWICE!!!

#----------------------------------------------------------------------

def runTest(frame, nb, log):
    win = TestPanel(nb, log)
    return win

#----------------------------------------------------------------------

overview = """\
wx.SpinCtrl combines wx.TextCtrl and wx.SpinButton in one control.

Portable programs should try to use this control as wx.SpinButton is
not
implemented for all platforms (Win32 and GTK only currently).

NB: the range supported by this control depends on the platform
but is at least -0x8000 to 0x7fff. Under GTK and Win32 with
sufficiently new version
of comctrl32.dll (at least 4.71 is required, 5.80 is recommended) the
full 32 bit
range is supported.

"""

if __name__ == '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

--
To unsubscribe, send email to wxPython-
users+unsubscribe@googlegroups.com
or visit http://groups.google.com/group/wxPython-users?hl=en