Botones, canvas y scrollbar: Resuelto

Juan Pavon Ruiz jpavonruiz en yahoo.es
Jue Ago 9 11:55:44 CEST 2007


>Juan Pavón Ruiz escribió:
>
> Hola a tod en s,
> miren a ver si me pueden echar una mano con el siguiente código:
> ----------------------------------------------
> #!/usr/local/bin/python
> # -*- coding: cp1252 -*-
>
> from Tkinter import *
>
> class App(Frame):
>     def __init__(self):
>         Frame.__init__(self)
>         self.grid()
>         self.Funcion()
>
>     def Funcion(self):
>         items = Canvas(self,bg='blue',height=50,width=50)
>         items.grid(row=0,column=0)
>
>         scroll = Scrollbar(self)
>         scroll.config(command=items.yview, relief=SUNKEN)
>         scroll.grid(row=0,column=0)
>
>         for i in range(1,11):
>             b = Button(self,text=str(i)) # Si pongo "items" en lugar de "self" el tamaño de items cambiará.
>             b.grid()
>
> app = App()
> app.mainloop()
> ---------------------------------------------
> Mi pregunta es:
> ¿Cómo colocar todos los botones dentro de "items", sin modificar el
> tamaño del Canvas? Y ayudándose de un scrollbar vertical.
>
>
>Ekaitz Lizundia escribió:
>
>Te contesto de memoria, asi que puedo equivocarme.
>La solucion seria construir un frame dentro del Canvas, y 
>meter los botones dentro de ese frame.
>Creo recordar que se hacia asi...
>
>
>Juan Pavón Ruiz escribió:
>Ya lo intenté, pero el resultado es el mismo.
>

Efectivamente, Ekaitz Lizundia, debería construir 
los botones dentro del frame,y éste dentro del canvas.
(Yo lo intenté, pero de otro modo...).

Ha sido una respuesta de Chema Cortes [Treeview] 
que me ha hecho dudar. He comenzado de cero, 
teniendo en cuenta el comentario de Ekaitz Lizundia y 
ayudándome de la red.

Mi problema está resuelto. Aquí dejo la fuente:
---------------------------------------------------
from Tkinter import *

class ScrolledFrame(Frame):
    def __init__(self, master, **kw):
        apply(Frame.__init__, (self, master), kw)

        # Creando los widgets
        scrollbar = Scrollbar(self, orient=VERTICAL)
        self.canvas = Canvas(self, yscrollcommand=scrollbar.set, bg="red",height=50,width=50)
        scrollbar.config(command=self.canvas.yview)
        scrollbar.pack(fill=Y, side=RIGHT)
        self.canvas.pack(expand=1, fill=BOTH, side=LEFT )

        # Reajustar la vista
        # (Hacer siempre esto si no se utilizan scrollbars)
        self.canvas.xview("moveto", 0)
        self.canvas.yview("moveto", 0)

        # Creando el frame interno
        self.inner = Frame(self.canvas, bg="blue")

        # Cambiar el tamaño de la pista
        self.inner.bind('<Configure>', self.__configure)

        # Poner el frame dentro del canvas 
        self.canvas.create_window(0, 0, window=self.inner, anchor=NW)

    def __configure(self, event):
        # Actualiza los scrollbars para ajustar el tamaño del frame.
        size = self.inner.winfo_reqwidth(), self.inner.winfo_reqheight()
        self.canvas.config(scrollregion="0 0 %s %s" % size)

# --------------------------------------------------------------------
# test

root = Tk()

f = ScrolledFrame(root)
f.pack()

for i in range(1,11):
    b = Button(f.inner,text=str(i))
    b.pack()

root.mainloop()
---------------------------------------------------
Gracias de nuevo a Ekaitz Lizundia, y a Chema Cortes. 

       
---------------------------------

Sé un Mejor Amante del Cine
¿Quieres saber cómo? ¡Deja que otras personas te ayuden!.




Más información sobre la lista de distribución Python-es