2012-06-03 37 views
5

Soy nuevo en este lugar y tkinter. Estoy atascado en hacer un cuadro de lista o lienzo desplazable. He probado ambos widgets. Dentro de este cuadro de lista o lienzo, tengo varios widgets de entrada y etiqueta. El punto de origen es R0, C0. Usé fila/configuración de columna para estirar el cuadro de lista o el lienzo.cuadro de lista desplazable dentro de una cuadrícula usando tkinter

En la ventana principal, tenía 4 botones en la fila cuatro en la columna cuatro (0,4-> 4,4). Coloqué la barra de desplazamiento en la columna 5. Intenté usar el método de cuadrícula. El problema que estoy teniendo es hacer que la barra de desplazamiento funcione.

Nota: Convertir el mainframe en una clase es solo una de las formas en que lo he intentado. Empacar la barra de desplazamiento a la derecha ha funcionado, con el listbox/canvas empacado a la izquierda. Sin embargo, el widget listbox/canvas al que se ordena la barra de desplazamiento no desplaza el listbox/canvas. Además, al agregar muchos cuadros de entrada no se desplaza el cuadro de lista/lienzo. Ayuda por favor.

from tkinter import * 
from tkinter.ttk import * 

Style().configure("B.TFrame", relief="flat", 
background="blue") 
Style().configure("R.TFrame", relief="flat", 
background="red") 
Style().configure("R.TLabel", background="red") 

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master, style="B.TFrame") 
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self): 
     top=self.winfo_toplevel() 
     self.menuBar = Menu(top) 
     top["menu"] = self.menuBar 
     self.subMenu = Menu(self.menuBar, tearoff=0) 
     self.subMenu2 = Menu(self.menuBar, tearoff=0) 
     self.menuBar.add_cascade(label="File", menu=self.subMenu) 
     self.menuBar.add_cascade(label="About", menu=self.subMenu2) 
     self.subMenu.add_command(label="Open") 
     self.subMenu.add_command(label="Save") 
     self.subMenu.add_command(label="Exit") 
     self.subMenu2.add_command(label="About") 
     self.subMenu2.add_command(label="Help") 



     self.data = Listbox (self, bg='red') 
     scrollbar = Scrollbar(self.data, orient=VERTICAL) 

     self.add = Button(self, text="") 
     self.remove = Button(self, text="") 
     self.run = Button(self, text="") 
     self.stop = Button(self, text="") 

     self.data.grid (row=0, column=0, rowspan=4, columnspan=4, sticky=N+E+S+W) 
     self.data.columnconfigure(1, weight=1) 
     self.data.columnconfigure(3, weight=1) 

     self.add.grid(row=4,column=0,sticky=EW)  
     self.remove.grid(row=4,column=1,sticky=EW) 
     self.run.grid(row=4,column=2,sticky=EW) 
     self.stop.grid(row=4,column=3,sticky=EW) 
     scrollbar.grid(column=5, sticky=N+S) 
+0

Por favor, evite el uso de importación con comodín, especialmente si usted envía su código en SO .. – fodma1

Respuesta

7

sin ningún contenido en el cuadro de lista, no hay nada para desplazarse ...

Esto parece funcionar, aunque (acorta un poco el ejemplo). Vea también el ejemplo en el scrollbar documentation.

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master)  
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self):     
     self.data = Listbox(self, bg='red') 
     self.scrollbar = Scrollbar(self.data, orient=VERTICAL) 
     self.data.config(yscrollcommand=self.scrollbar.set) 
     self.scrollbar.config(command=self.data.yview) 

     for i in range(1000): 
      self.data.insert(END, str(i)) 

    self.run = Button(self, text="run") 
    self.stop = Button(self, text="stop") 

    self.data.grid(row=0, column=0, rowspan=4, 
        columnspan=2, sticky=N+E+S+W) 
    self.data.columnconfigure(0, weight=1) 

    self.run.grid(row=4,column=0,sticky=EW) 
    self.stop.grid(row=4,column=1,sticky=EW) 

    self.scrollbar.grid(column=2, sticky=N+S) 

a = Application() 
a.mainframe() 
a.mainloop() 
+0

Lo sentimos, Soy nuevo aquí (acaba de aprender cómo ver una respuesta .. un año más tarde.). Agradezco la respuesta. Miro mi pregunta y estoy avergonzado ahora. El problema que tenía era agregar cuadros de entrada. Seguí adelante, pero cuando agregué más de 12 cuadros de entrada y obtuve una vista previa del resultado, en la pantalla los elementos de la lista parecían desplazables. Gracias. – Lect

2

Debe definir el atributo command a la barra de desplazamiento, y debe proporcionar el atributo yscrollcommand al cuadro de lista. Estos dos atributos trabajan juntos para hacer que algo se pueda desplazar.

La opción yscrollcommand le dice al cuadro de lista "cuando se desplazan en la dirección Y, llamar a este comando. Este suele ser el método set de una barra de desplazamiento, de modo que cuando el usuario se desplaza a través de las teclas de flecha, la barra de desplazamiento se actualizan.

El atributo command de scorllbar dice "cuando el usuario lo mueve, llame a este comando". Este es generalmente el método yview o xview de un widget, que hace que el widget cambie sus parámetros de vista en la dirección Y o X.

En su caso, después de crear los widgets haría esto:

self.data.config(yscrollcommand=self.scrollbar.set) 
scrollbar.config(command=self.data.yview) 
Cuestiones relacionadas