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