Problem with Tkinter scrollbar callback

I

Ivan Van Laningham

Hi All--
I'm having two problems with the scrollbar callback on linux systems
(Fedora 7, Suse 10.1,2 and 3 all exhibit the issues).

Problem one: on Windows, the callback is called with the arguments as
specified in the doc: "scroll", "1" or "-1", "units". When I run the
identical code on linux, the callback is invoked with only one
argument, "1" or "-1". Here's a small program which demos the
problem:

========begin============
#!/usr/bin/env python

from Tkinter import *
import sys

def die(event):
sys.exit(0)
def sDoit(*args):
for i in args:
print "scrollbar:",i, type(i)
root=Tk()
f=Frame(root)
f.pack(expand=1,fill=BOTH)
button=Button(f,width=25)
button["text"]="Quit"
button.bind("<Button>",die)
button.pack()
xb=Scrollbar(f,orient=HORIZONTAL,command=sDoit)
xb.pack()
root.mainloop()
=============end===========

On Windows, it produces the correct output

scrollbar: scroll <type 'str'>
scrollbar: 1 <type 'str'>
scrollbar: units <type 'str'>

but on linux, it produces

scrollbar: 1 <type 'str'>

I can't believe that this is a bug that has not already been fixed, so
I must be doing something wrong. But what? I'm surely overlooking
something dead obvious. ...

Note that I don't want to use this as a scrollbar, all I need is the direction.

The second problem is more pernicious, in that I can work around the
first problem, and I don't really have a clue on the second. On
Windows, clicking one of the arrow buttons produces one callback. On
Linux, in the real application, if I click an arrow button once, the
callback continues to be called until I kill the app. That doesn't
happen in the small program I've provided above, so I'm at a bit of a
loss where to start looking. Any hints?

Metta,
Ivan
--
Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.python.org/workshops/1998-11/proceedings/papers/laningham/laningham.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours
 
R

Russell E. Owen

"Ivan Van Laningham said:
Hi All--
I'm having two problems with the scrollbar callback on linux systems
(Fedora 7, Suse 10.1,2 and 3 all exhibit the issues).

Problem one: on Windows, the callback is called with the arguments as
specified in the doc: "scroll", "1" or "-1", "units". When I run the
identical code on linux, the callback is invoked with only one
argument, "1" or "-1". Here's a small program which demos the
problem:

========begin============
#!/usr/bin/env python

from Tkinter import *
import sys

def die(event):
sys.exit(0)
def sDoit(*args):
for i in args:
print "scrollbar:",i, type(i)
root=Tk()
f=Frame(root)
f.pack(expand=1,fill=BOTH)
button=Button(f,width=25)
button["text"]="Quit"
button.bind("<Button>",die)
button.pack()
xb=Scrollbar(f,orient=HORIZONTAL,command=sDoit)
xb.pack()
root.mainloop()
=============end===========

On Windows, it produces the correct output

scrollbar: scroll <type 'str'>
scrollbar: 1 <type 'str'>
scrollbar: units <type 'str'>

but on linux, it produces

scrollbar: 1 <type 'str'>

I see the same bad thing on our RedHat Enteprise unix system which has
the default tcl/tk 8.4.6. However I found that if you send the scrollbar
the "set" command first then it behaves normally. I think it just starts
out in a funny state where it has no idea how to display itself.

-- Russell

(P.s. it works fine on my MacOS X 10.4.11 system with default tcl 8.4.7
or with add-on 8.4.14).
 
I

Ivan Van Laningham

Hi All--
That helps. Doing a get() on the scrollbar before a set(0.0,0.0)
returns a 4-tuple: (0.0, 0.0, 0.0, 0.0) ! I did the set(0.0,0.0)
and now the callback gets the correct number of arguments.

However, I'm still getting the weird behaviour when clicking the
arrowheads--and the heads are all I want. They act like they've been
set to a keybounce timeout of about a millisecond. ... The arrow
click increments the number of cells in a table row (effectively), and
it shoots up from 5 to 26 columns almost instantly (that's the
internal max I set).

Metta,
Ivan

Ivan Van Laningham said:
Hi All--
I'm having two problems with the scrollbar callback on linux systems
(Fedora 7, Suse 10.1,2 and 3 all exhibit the issues).

Problem one: on Windows, the callback is called with the arguments as
specified in the doc: "scroll", "1" or "-1", "units". When I run the
identical code on linux, the callback is invoked with only one
argument, "1" or "-1". Here's a small program which demos the
problem:

========begin============
#!/usr/bin/env python

from Tkinter import *
import sys

def die(event):
sys.exit(0)
def sDoit(*args):
for i in args:
print "scrollbar:",i, type(i)
root=Tk()
f=Frame(root)
f.pack(expand=1,fill=BOTH)
button=Button(f,width=25)
button["text"]="Quit"
button.bind("<Button>",die)
button.pack()
xb=Scrollbar(f,orient=HORIZONTAL,command=sDoit)
xb.pack()
root.mainloop()
=============end===========

On Windows, it produces the correct output

scrollbar: scroll <type 'str'>
scrollbar: 1 <type 'str'>
scrollbar: units <type 'str'>

but on linux, it produces

scrollbar: 1 <type 'str'>

I see the same bad thing on our RedHat Enteprise unix system which has
the default tcl/tk 8.4.6. However I found that if you send the scrollbar
the "set" command first then it behaves normally. I think it just starts
out in a funny state where it has no idea how to display itself.

-- Russell

(P.s. it works fine on my MacOS X 10.4.11 system with default tcl 8.4.7
or with add-on 8.4.14).



--
Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.python.org/workshops/1998-11/proceedings/papers/laningham/laningham.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours
 
R

Russell E. Owen

"Ivan Van Laningham said:
Hi All--
That helps. Doing a get() on the scrollbar before a set(0.0,0.0)
returns a 4-tuple: (0.0, 0.0, 0.0, 0.0) ! I did the set(0.0,0.0)
and now the callback gets the correct number of arguments.

However, I'm still getting the weird behaviour when clicking the
arrowheads--and the heads are all I want. They act like they've been
set to a keybounce timeout of about a millisecond. ... The arrow
click increments the number of cells in a table row (effectively), and
it shoots up from 5 to 26 columns almost instantly (that's the
internal max I set).

Is the scroll bar's repeatinterval set to a reasonable value?

-- Russell
 
I

Ivan Van Laningham

Nope:

'repeatdelay': ('repeatdelay', 'repeatDelay', 'RepeatDelay', '300', '300'),

And even after I set it, it looks funny:

'repeatdelay': ('repeatdelay', 'repeatDelay', 'RepeatDelay', '300', '1000'),

And when I try it with the new repeatdelay (1000), the only thing that
has changed is that it waits 1000 milliseconds before exhibiting the
same uncontrolled growth as before.

Metta,
Ivan

Is the scroll bar's repeatinterval set to a reasonable value?

-- Russell



--
Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.python.org/workshops/1998-11/proceedings/papers/laningham/laningham.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours
 
I

Ivan Van Laningham

No Joy.

Waits the 1 second, then clicks the button once per second until the
limit's reached.

Sigh.

Metta,
Ivan

You need to change repeatinterval, not repeatdelay.

As to "looking funny": that is the standard output format for
configure(). I think can get a more reasonable value using
"cget(repeatdelay)".

-- Russell



--
Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.python.org/workshops/1998-11/proceedings/papers/laningham/laningham.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours
 
I

Ivan Van Laningham

HI All--
We've decided that this represents a bug in the tcl/tk library, and
there's no workaround. I switched to + and - buttons, which are not
as nice aesthetically but work correctly on both Windows & Linux.

Thanks to everyone for their help.

Metta,
Ivan

No Joy.

Waits the 1 second, then clicks the button once per second until the
limit's reached.

Sigh.

Metta,
Ivan






--

Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.python.org/workshops/1998-11/proceedings/papers/laningham/laningham.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours



--
Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.python.org/workshops/1998-11/proceedings/papers/laningham/laningham.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top