[Tkinter-discuss] Please help -- Tkinter Scale widget with DoubleVar is acting weird

Michael Lange klappnase at freenet.de
Thu Aug 19 22:41:35 CEST 2004


On Thu, 19 Aug 2004 11:32:56 -0400
"Jared Cohen" <Jared.Cohen at noaa.gov> wrote:

> Hi all. I'm currently using a Tkinter Scale widget which uses a 
> DoubleVar as its control variable. I then use the "trace_variable('w', 
> callback)" method to invoke a callback whenever the DoubleVar changes.
> 
> The problem is this: the callback is triggered when the slider moves (as 
> it should), but it's also triggered when I just HOVER the mouse over the 
> slider without clicking! Somehow or other, it must think that the 
> control variable is being changed, even though it isn't. I *think* that 
> this problem is related to the loss of precision that DoubleVars can 
> have, but I'm not really sure. Has anyone else experienced this problem? 
> How can I fix this?
> 
> As an aid, here's a quick stub program that illustrates the problem. Try 
> (for example) moving the slider to 0.3, release the mouse button, then 
> move the mouse pointer back and forth over the slider WITHOUT clicking. 
> Each time the pointer passes over the slider, it will print the value.
> 
> 
> import sys, Tkinter, types
> 
> root = Tkinter.Tk()
> var = Tkinter.DoubleVar()
> 
> def callback(*args):
>     print var.get()
> 
> var.trace_variable("w", callback)
> 
> slider = Tkinter.Scale(root,
>                        from_ = 0.0,
>                        to = 1.0,
>                        resolution = 0.1,
>                        variable = var,
>                        orient   = 'horizontal')
> slider.grid(sticky='ew')
> 
> root.mainloop()
> 
Hi Jared,

that's interesting, I never noticed this behavior, probably because I used callbacks where excess calls
didn't matter. To avoid excess calls to your callback() you might consider to store the value of var in
a second variable like this:

var = Tkinter.DoubleVar()
oldvalue = var.get()

def callback(*args):
    global oldvalue
    if var.get() != oldvalue:
        oldvalue = var.get()
        print var.get()

I hope this helped

Michael


More information about the Tkinter-discuss mailing list