scrolled horizontal python tkinter scrollbar tkinter-canvas

horizontal - scrolled listbox python



tkinter: usando barras de desplazamiento en un lienzo (1)

Las barras de desplazamiento deben tener el marco como elemento principal, no el lienzo:

from tkinter import * root=Tk() frame=Frame(root,width=300,height=300) frame.grid(row=0,column=0) canvas=Canvas(frame,bg=''#FFFFFF'',width=300,height=300,scrollregion=(0,0,500,500)) hbar=Scrollbar(frame,orient=HORIZONTAL) hbar.pack(side=BOTTOM,fill=X) hbar.config(command=canvas.xview) vbar=Scrollbar(frame,orient=VERTICAL) vbar.pack(side=RIGHT,fill=Y) vbar.config(command=canvas.yview) canvas.config(width=300,height=300) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack(side=LEFT,expand=True,fill=BOTH) root.mainloop()

La razón por la que esto funciona es debido a cómo funciona el pack . Por defecto, intentará reducir (o aumentar) un contenedor para que se ajuste exactamente a sus hijos. Debido a que las barras de desplazamiento son elementos secundarios del lienzo en el ejemplo original, el lienzo se reduce para encajar.

Si desea que aparezcan las barras de desplazamiento dentro del lienzo, el truco consiste en utilizar un marco adicional. Coloque el lienzo y las barras de desplazamiento en este marco interior, gire los bordes fuera del lienzo y active el marco. Establezca el fondo del marco como el lienzo y aparecerá que las barras de desplazamiento están dentro del lienzo.

Estoy tratando de hacer un lienzo desplazable. Sin embargo, una vez que trato de configurar barras de desplazamiento para trabajar con el lienzo, tkinter parece ignorar completamente las dimensiones que inicialmente establecí para mi lienzo. He intentado empaquetarlas todas en un marco, configurar el lienzo para que llene el marco y luego configurar el tamaño del marco, pero eso presenta el mismo problema a menos que yo establezca el marco para llenar la ventana también, que no es lo que quiero . Básicamente, quiero un lienzo de tamaño fijo con barras de desplazamiento en él. Mi código actual se ve así (en Python 3.1):

from tkinter import * root=Tk() frame=Frame(root,width=300,height=300) frame.grid(row=0,column=0) canvas=Canvas(frame,bg=''#FFFFFF'',width=300,height=300,scrollregion=(0,0,500,500)) hbar=Scrollbar(canvas,orient=HORIZONTAL) hbar.pack(side=BOTTOM,fill=X) hbar.config(command=canvas.xview) vbar=Scrollbar(canvas,orient=VERTICAL) vbar.pack(side=RIGHT,fill=Y) vbar.config(command=canvas.yview) canvas.config(width=300,height=300) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack(side=LEFT,expand=True,fill=BOTH) root.mainloop()