2011-10-11 29 views
18

Estoy intentando hacer un lienzo desplazable. Sin embargo, una vez que intento configurar las barras de desplazamiento para trabajar con el lienzo, tkinter parece ignorar por completo las dimensiones que inicialmente configuré para mi lienzo. He intentado empaquetarlos todos en un marco, configurar el lienzo para llenar el marco y luego establecer el tamaño del marco, pero eso presenta el mismo problema a menos que 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 es el siguiente (en Python 3.1):python y tkinter: utilizando barras de desplazamiento en un 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(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() 

Respuesta

26

Sus barras de desplazamiento necesita tener el marco como padre, no de la lona:

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 pack funciona. De forma predeterminada, intentará reducir (o aumentar) un contenedor para ajustarse exactamente a sus elementos secundarios. Como las barras de desplazamiento son elementos secundarios del lienzo en el ejemplo original, el lienzo se encoge para ajustarse.

Si desea que las barras de desplazamiento aparezcan dentro del lienzo, el truco es usar un marco extra. Coloque el lienzo y las barras de desplazamiento en este marco interior, quite los bordes del lienzo y enciéndalos para el marco. Establezca el fondo del marco para que sea el mismo que el lienzo y aparecerá que las barras de desplazamiento están dentro del lienzo.

+0

¿Por qué debemos empacar el lienzo por última vez? Me di cuenta de que cuando empaqué el lienzo antes de que cualquiera de las barras de desplazamiento termine solapando la barra de desplazamiento horizontal, comencé a usar tkinter, pero pensé que ese paquete no se superpondría. Gracias – Lanfear

+1

Y el núcleo es 'scrollregion = (0,0,500,500)', ¡sin eso el todo no puede funcionar! – Turtle

Cuestiones relacionadas