elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  ¿Como añadir un scrollbar a una ventana muy grande?(Python)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Como añadir un scrollbar a una ventana muy grande?(Python)  (Leído 12,554 veces)
XD YO

Desconectado Desconectado

Mensajes: 28



Ver Perfil
¿Como añadir un scrollbar a una ventana muy grande?(Python)
« en: 13 Febrero 2010, 02:49 am »

Antes que nada Buenas noches a todos ;)

Siguiendo trabajando, la ventana que cree utilizando Tkinter ha quedado demasiado grande para la resolución de pantalla y pensé en añadir un scrollbar a un costado para hacerla mas pequeña y menos molesta; pero, después de estar gogleando durante un buen rato, la única información que encuentro (tanto en español como en ingles) solo dice como utilizarlo cuando se trata de una ventana ocupada completamente por un textarea o una lista muy grande; pero no dice como utilizarlo si lo que estoy manejando en la ventana son un conjunto de labels, textentris, radiobutons y/o butons.

¿Alguna idea de lo que se puede hacer?  :rolleyes:

De antemano, gracias por su tiempo.  ;)


En línea

"Fácilmente aceptamos la realidad, acaso porque intuimos que nada es real"
-Borges -El inmortal
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #1 en: 13 Febrero 2010, 03:12 am »

Explicate que es eso de labels, textentries, etc, etc....

Porke puedes perfectamente colar botones, labels, lo que sea en una misma ventana en conjunto con un Textarea:

Código
  1. from Tkinter import *
  2.  
  3. root = Tk()
  4. frama=Frame(root)
  5. textarea = Text(frama, height=20, width=40, background='white')
  6. scroll = Scrollbar(frama, command=textarea.yview)
  7. textarea.configure(yscrollcommand=scroll.set)
  8. textarea.pack(side=LEFT)
  9. scroll.pack(side=RIGHT, fill=Y)
  10. frama.pack()
  11.  
  12. boton=Button(root, text="Pinchame")
  13. boton.pack()
  14.  
  15. root.mainloop()
  16.  


En línea

XD YO

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #2 en: 13 Febrero 2010, 04:18 am »

 Eso era lo que ya había intentado... :-(

Pero cuando lo combino con mi código con la única modificación, claro, de cambiarle el nombre a la ventana raíz, me manda un error en la linea de comandos cuando lo ejecuto:
Código:
  
File "formulario.py", line 26, in <module>
    formulario.pack()
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1725, in __getattr__
    return getattr(self.tk, attr)
AttributeError: pack

Y cuando hago algo por modificar el error,y después la ejecuto desde la terminal, esta, se queda pasmada y sin aparecer la ventana

También, es que lo que yo realmente quisiera seria poder hacer el scrollbar sin necesidad alguna de tener que definir un textarea....

en resumen:
¿Sera por que yo los acomodo usando grid en lugar de pack?
¿Existe alguna manera de no tener que invocar un textarea para aparecer la scrollbar?
:-\ :o

De nuevo gracias...
En línea

"Fácilmente aceptamos la realidad, acaso porque intuimos que nada es real"
-Borges -El inmortal
43H4FH44H45H4CH49H56H45H
Wiki

Desconectado Desconectado

Mensajes: 502



Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #3 en: 13 Febrero 2010, 05:09 am »

Este ejemplo de python 2.6 podria servirte "Demo/tkinter/matt/canvas-with-scrollbars.py"

Código
  1. from Tkinter import *
  2. class Test(Frame):
  3.    def printit(self):
  4.        print "hi button"
  5.    def createWidgets(self):
  6.        self.question = Label(self, text="Can Find The BLUE Square??????")
  7.        self.question.pack()
  8.        self.QUIT = Button(self, text='Press', background='red',
  9.                           height=3, command=self.printit)
  10.        self.QUIT.pack(side=BOTTOM, fill=BOTH)
  11.        spacer = Frame(self, height="0.25i")
  12.        spacer.pack(side=BOTTOM)
  13.        # notice that the scroll region (20" x 20") is larger than
  14.        # displayed size of the widget (5" x 5")
  15.        self.draw = Canvas(0, width="5i", height="5i",
  16.                           background="white",
  17.                           scrollregion=(0, 0, "20i", "20i"))
  18.        self.draw.scrollX = Scrollbar(0, orient=HORIZONTAL)
  19.        self.draw.scrollY = Scrollbar(0, orient=VERTICAL)
  20.        # now tie the three together. This is standard boilerplate text
  21.        self.draw['xscrollcommand'] = self.draw.scrollX.set
  22.        self.draw['yscrollcommand'] = self.draw.scrollY.set
  23.        self.draw.scrollX['command'] = self.draw.xview
  24.        self.draw.scrollY['command'] = self.draw.yview
  25.        # draw something. Note that the first square
  26.        # is visible, but you need to scroll to see the second one.
  27.        self.draw.create_rectangle(0, 0, "3.5i", "3.5i", fill="black")
  28.        self.draw.create_rectangle("10i", "10i", "13.5i", "13.5i", fill="blue")
  29.        # pack 'em up
  30.        self.draw.scrollX.pack(side=BOTTOM, fill=X)
  31.        self.draw.scrollY.pack(side=RIGHT, fill=Y)
  32.        self.draw.pack(side=LEFT)
  33.    def scrollCanvasX(self, *args):
  34.            print "scrolling", args
  35.            print self.draw.scrollX.get()
  36.    def __init__(self, master=None):
  37.            Frame.__init__(self, master)
  38.            Pack.config(self)
  39.            self.createWidgets()
  40. test = Test()
  41. test.mainloop()
  42.  
En línea


-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #4 en: 13 Febrero 2010, 05:16 am »

AttributeError: pack

Estas usando un grid como widget padre y estas incluyendole ese Textarea con un pack????

Citar
Y cuando hago algo por modificar el error,y después la ejecuto desde la terminal, esta, se queda pasmada y sin aparecer la ventana

Lol si ese error me pasa bastante con Perl/Tk  :xD sobretodo cuando empaqueto un widget padre con pack() y a los widgets hijos los empaqueto con grid() o parte de los widgets hijos mezclados con pack() y grid()  :xD

No sale la ventana cuando lo ejecuto  :xD  (creo que es una funcionalidad del bindings Tk en estos lenguajes... o a lo mejor es una funcionalidad real del API Tk como tal) sea cual sea el caso, que me late bastante que este es tu problema (padre empaquetado con pack() hijo empaquetado con grid() ) O me equivoco???

No estaria mal sino logras resolver, que postees ese trozito de codigo donde defines widget padre y widget hijo con pack() y grid() mezclados  :D
En línea

XD YO

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #5 en: 13 Febrero 2010, 22:36 pm »

Si, es un problema que me trae loco  :rolleyes: :rolleyes:
43H4FH44H45H4CH49H56H45H, el problema es que no estoy trabajando con canvas aun
Y es que quiero tener la posibilidad de poder insertar un scrollbar a lado de todos mis widgets, ya que,  es que es una ventana enorme: :-[

si un pequeño monstruo de 400 lineas... ;)
Citar
Lol si ese error me pasa bastante con Perl/Tk  :xD sobretodo cuando empaqueto un widget padre con pack() y a los widgets hijos los empaqueto con grid() o parte de los widgets hijos mezclados con pack() y grid()  :xD

^TiFa^ , si te refieres a que la ventana padre tiene pack para acomodar sus widgets y la hija grid, eso nunca me dio problemas; pero cuando añado ese código a la ventana hija... es cuando comienza a ponerse quisquillosa y no sale :xD

En línea

"Fácilmente aceptamos la realidad, acaso porque intuimos que nada es real"
-Borges -El inmortal
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #6 en: 13 Febrero 2010, 22:47 pm »

Me refiero por ejemplo... declaras un widget Frame con pack()   y dentro de ese mismo Frame declaras digamos 4 botones con grid() perfecto todo funciona. Pero si dentro de ese mismito Frame, agregas ademas de los botones digamos un Entry con pack().... cuando ejecutes la aplicacion No se mostrara la ventana aunque esta en ejecucion  :xD

Ya se te ha expuesto como insertar Scrollbars solo que debes llevar un orden, si declaras 1 widget hijo con grid() deberas declarar todos los widgets hijos dentro de esa misma ventana o frame con grid() no puedes remezclar pack() y grid()
En línea

XD YO

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #7 en: 14 Febrero 2010, 02:47 am »

Citar
Me refiero por ejemplo... declaras un widget Frame con pack()   y dentro de ese mismo Frame declaras digamos 4 botones con grid() perfecto todo funciona. Pero si dentro de ese mismito Frame, agregas ademas de los botones digamos un Entry con pack().... cuando ejecutes la aplicacion No se mostrara la ventana aunque esta en ejecucion  :xD

Si, lo intente y en vendad no se puede hacer eso  :xD

Y sobre el scrollbar

Si, ya logre  añadir el scrollbar a la ventana :D
Lo único malo es que no logro hacer que funcione  :-(

Pero supongo que a de ser por algún error que cometí al incluirlo, a si que decidí seguir intentando.
En línea

"Fácilmente aceptamos la realidad, acaso porque intuimos que nada es real"
-Borges -El inmortal
XD YO

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: ¿Como añadir un scrollbar a una ventana muy grande?(Python)
« Respuesta #8 en: 9 Marzo 2010, 15:05 pm »

Bueno, ya me habia dado por vencido, cuando buscando como incluir dentro de un Canva elementos, me encontre con este precioso ejemplo en http://effbot.org/zone/editing-canvas-text-items.htm

Código
  1. from Tkinter import *
  2.  
  3. class AutoScrollbar(Scrollbar):
  4.    # a scrollbar that hides itself if it's not needed.  only
  5.    # works if you use the grid geometry manager.
  6.    def set(self, lo, hi):
  7.        if float(lo) <= 0.0 and float(hi) >= 1.0:
  8.            # grid_remove is currently missing from Tkinter!
  9.            self.tk.call("grid", "remove", self)
  10.        else:
  11.            self.grid()
  12.        Scrollbar.set(self, lo, hi)
  13.    def pack(self, **kw):
  14.        raise TclError, "cannot use pack with this widget"
  15.    def place(self, **kw):
  16.        raise TclError, "cannot use place with this widget"
  17.  
  18. #
  19. # create scrolled canvas
  20.  
  21. al = Tk()
  22. al.columnconfigure(0,weight=1)
  23. al.rowconfigure(0,weight=1)
  24.  
  25. header = Frame(al)
  26. header.pack(side= TOP, expand = YES)
  27.  
  28. htxt = Label(header,text='TOP TOP TOP... this is the TOP')
  29. htxt.pack()
  30.  
  31. footer = Frame(al)
  32. footer.pack(side = BOTTOM, expand = YES)
  33.  
  34. ftxt = Label(footer,text='BOTTOM BOTTOM BOTTOM... this is the BOTTOM!')
  35. ftxt.pack()
  36. ########
  37. root = LabelFrame(al, bd=2, text='Data',relief='groove',padx=5, pady=5)
  38. root.pack(side = TOP, expand = YES)
  39.  
  40. vscrollbar = AutoScrollbar(root)
  41. vscrollbar.grid(row=0, column=1, sticky=N+S)
  42. hscrollbar = AutoScrollbar(root, orient=HORIZONTAL)
  43. hscrollbar.grid(row=1, column=0, sticky=E+W)
  44.  
  45. canvas = Canvas(root,
  46.                yscrollcommand=vscrollbar.set,
  47.                xscrollcommand=hscrollbar.set)
  48. canvas.grid(row=0, column=0, sticky=N+S+E+W)
  49.  
  50. vscrollbar.config(command=canvas.yview)
  51. hscrollbar.config(command=canvas.xview)
  52.  
  53. # make the canvas expandable
  54. root.grid_rowconfigure(0, weight=1)
  55. root.grid_columnconfigure(0, weight=1)
  56.  
  57. # create canvas contents
  58.  
  59. frame = Frame(canvas)
  60. frame.rowconfigure(1, weight=1)
  61. frame.columnconfigure(1, weight=1)
  62.  
  63. rows = 20
  64. for i in range(1,rows):
  65.    for j in range(1,20):
  66.        button = Button(frame, padx=7, pady=7, text="[%d,%d]" % (i,j))
  67.        button.grid(row=i, column=j, sticky='news')
  68.  
  69. canvas.create_window(0, 0, anchor=NW, window=frame)
  70.  
  71. frame.update_idletasks()
  72.  
  73. canvas.config(scrollregion=canvas.bbox("all"))
  74.  
  75. root.mainloop()
  76.  

Todos los elementos estan perfectamente dentro de un labelframe, lo que lo hace bastante comodo, y lo que significa, que solo tengo que colocar los elementos con definicion en el interiro del labelframe, lo cual me parece muy bien  ;-)
« Última modificación: 12 Marzo 2010, 03:40 am por XD YO » En línea

"Fácilmente aceptamos la realidad, acaso porque intuimos que nada es real"
-Borges -El inmortal
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines