[Tutor] Scrolling multilistbox help

Alberto Troiano albertito_g at hotmail.com
Tue Jul 19 15:00:38 CEST 2005


Hey Michael

It worked like a charm
Thank GOD you understood what I wanted, you see speaking Spanish made me so 
hard to explain what the problem were but...I guess you just figured out

To my code was this:
self.see(int(self.curselection()[0]))

Thank you very much

Best Regards

Alberto

>From: Michael Lange <klappnase at freenet.de>
>To: tutor at python.org
>Subject: Re: [Tutor] Scrolling multilistbox help
>Date: Tue, 19 Jul 2005 11:06:43 +0200
>
>On Mon, 18 Jul 2005 13:54:45 +0000
>"Alberto Troiano" <albertito_g at hotmail.com> wrote:
>
> > Hey tutors
> >
> > I'm using the Multilistbox class and I noticed that it only handles the
> > mouse scroll and the scrollbar to go down or up.I succesfully 
>implemented
> > the sort function that came with the class
> > I also added code to handle the up and down arrow keys and it goes down 
>all
> > right but only select the item and it doesn't scroll down or up
> >
> > How can make it go up or down?
> > I'm sendind the class here:
> >
>
>Hi Alberto,
>
>I haven't tested your code, but if I understand you correctly, the problem
>is that the list is not automatically scrolled when you select a new item 
>with
>the Up and Down keys (right?).
>Maybe it's the easiest to add a line like this to your _select1() and 
>_select2() methods:
>
>    l.see(int(l.curselection()[0]))
>
>where l is the first of the listboxes; this should make sure the selected 
>item is visible
>(at least if you use selectmode=SINGLE). If keeping all lists in sync 
>works, this
>should be enough to scroll all other lists, too (like I said, untested 
>though).
>
>I hope this helps
>
>Michael
>
>
>
> > class MultiListbox(Frame):
> >     fila=0
> >     sortedBy=-1
> >     def __init__(self, master, lists):
> > 	Frame.__init__(self, master)
> > 	self.lists = []
> > 	for l,w,a in lists:
> > 	    frame = Frame(self,background="red"); frame.pack(side=LEFT, 
>expand=YES,
> > fill=BOTH)
> > 	    Button(frame,background="red",foreground="white",font="Verdana 8
> > bold",text=l, borderwidth=1, relief=RAISED,command=lambda a=a:
> > self._sortBy(a)).pack(fill=X)
> > 	    lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0,
> > 			 relief=FLAT, exportselection=FALSE)
> > 	    lb.pack(expand=YES, fill=BOTH)
> > 	    self.lists.append(lb)
> > 	    lb.bind('<B1-Motion>', lambda e, s=self: s._select(e.y))
> > 	    lb.bind('<Double-Button-3>', lambda e, s=self: 
>s._devolverfila(e.y))
> > 	    lb.bind('<Return>', lambda e, s=self: s._devolverfila(e.y))
> > 	    lb.bind('<Button-1>', lambda e, s=self: s._select(e.y))
> > 	    lb.bind('<Down>', lambda s: _select1())
> >                     lb.bind('<Up>', lambda s: _select2())
> > 	    lb.bind('<Leave>', lambda e: 'break')
> > 	    lb.bind('<B2-Motion>', lambda e, s=self: s._b2motion(e.x, e.y))
> > 	    lb.bind('<Button-2>', lambda e, s=self: s._button2(e.x, e.y))
> > 	frame = Frame(self,background="red"); frame.pack(side=LEFT, fill=Y)
> > 	Label(frame,background="red",foreground="white",font="Verdana 8 bold",
> > borderwidth=1, relief=RAISED).pack(fill=X)
> > 	sb = Scrollbar(frame,background="red", orient=VERTICAL,
> > command=self._scroll)
> > 	sb.pack(expand=YES, fill=Y)
> > 	self.lists[0]['yscrollcommand']=sb.set
> >
> >     def _sortBy(self, column):
> >         """ Sort by a given column. """
> >         if column == self.sortedBy:
> >             direction = -1 * self.direction
> >         else:
> >             direction = 1
> >         elements = self.get(0, END)
> >         self.delete(0, END)
> >         elements.sort(lambda x, y: self._sortAssist(column, direction, 
>x,
> > y))
> >         self.insert(END, *elements)
> >         self.sortedBy = column
> >         self.direction = direction
> >
> >     def _sortAssist(self, column, direction, x, y):
> >         if column!=0:
> >             c = cmp(x[column], y[column])
> >             if c:
> >                 return direction * c
> >             else:
> >                 return direction * cmp(x, y)
> >         else:
> >             c = cmp(int(x[column]), int(y[column]))
> >             if c:
> >                 return direction * c
> >             else:
> >                 return direction * cmp(x, y)
> >
> >     def _select(self, y):
> > 	row = self.lists[0].nearest(y)
> > 	self.selection_clear(0, END)
> > 	self.selection_set(row)
> > 	self.fila=row
> > 	return 'break'
> >
> >     def _devolverfila(self, y):
> > 	row = self.lists[0].nearest(y)
> > 	self.selection_clear(0, END)
> > 	self.selection_set(row)
> > 	self.fila=row
> >
> >     def _select1(self):
> >         if self.fila==self.size()-1:
> >             pass
> >         else:
> >             self.selection_clear(0, END)
> >     	    self.selection_set(self.fila+1)
> >             self.fila+=1
> >             self._scroll()
> > 	return 'break'
> >
> >     def _select2(self):
> >     	if self.fila==0:
> >             pass
> >         else:
> >             self.selection_clear(0, END)
> >             self.selection_set(self.fila-1)
> >             self.fila-=1
> > 	return 'break'
> >
> >     def _button2(self, x, y):
> > 	for l in self.lists: l.scan_mark(x, y)
> > 	return 'break'
> >
> >     def _b2motion(self, x, y):
> > 	for l in self.lists: l.scan_dragto(x, y)
> > 	return 'break'
> >
> >     def _scroll(self, *args):
> > 	for l in self.lists:
> > 	    apply(l.yview, args)
> >
> >     def curselection(self):
> > 	return self.lists[0].curselection()
> >
> >     def delete(self, first, last=None):
> > 	for l in self.lists:
> > 	    l.delete(first, last)
> >
> >     def get(self, first, last=None):
> > 	result = []
> > 	for l in self.lists:
> > 	    result.append(l.get(first,last))
> > 	if last: return apply(map, [None] + result)
> > 	return result
> >
> >     def index(self, index):
> > 	self.lists[0].index(index)
> >
> >     def insert(self, index, *elements):
> > 	for e in elements:
> > 	    i = 0
> > 	    for l in self.lists:
> > 		l.insert(index, e[i])
> > 		i = i + 1
> >
> >     def size(self):
> > 	return self.lists[0].size()
> >
> >     def see(self, index):
> > 	for l in self.lists:
> > 	    l.see(index)
> >
> >     def selection_anchor(self, index):
> > 	for l in self.lists:
> > 	    l.selection_anchor(index)
> >
> >     def selection_clear(self, first, last=None):
> > 	for l in self.lists:
> > 	    l.selection_clear(first, last)
> >
> >     def selection_includes(self, index):
> > 	return self.lists[0].selection_includes(index)
> >
> >     def selection_set(self, first, last=None):
> > 	for l in self.lists:
> > 	    l.selection_set(first, last)
> >
> >
> > THanks in advanced
> >
> > Alberto
> >
> >
> > _______________________________________________
> > Tutor maillist  -  Tutor at python.org
> > http://mail.python.org/mailman/listinfo/tutor
> >
>_______________________________________________
>Tutor maillist  -  Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor


Gaucho




More information about the Tutor mailing list