web-dev-qa-db-fra.com

tkinter: utilisation des barres de défilement sur un canevas

J'essaie de faire défiler une toile. Cependant, une fois que j'essaie de configurer des barres de défilement pour travailler avec le canevas, tkinter semble ignorer complètement les dimensions que j'ai initialement définies pour mon canevas. J'ai essayé de les emballer tous dans un cadre, de définir le canevas pour remplir le cadre, puis de définir la taille du cadre, mais cela pose le même problème à moins que je ne définisse également le cadre pour remplir la fenêtre, ce qui n'est pas ce que je veux . Fondamentalement, je veux une toile de taille fixe avec des barres de défilement. Mon code actuel ressemble à ceci (dans 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()
25

Vos barres de défilement doivent avoir le cadre en tant que parent, pas le canevas:

from tkinter import *
root=Tk()
frame=Frame(root,width=300,height=300)
frame.pack(expand=True, fill=BOTH) #.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 raison pour laquelle cela fonctionne est due au fonctionnement de pack. Par défaut, il tentera de réduire (ou d'agrandir) un conteneur pour qu'il s'adapte exactement à ses enfants. Étant donné que les barres de défilement sont des enfants du canevas dans l'exemple d'origine, le canevas se réduit pour s'adapter.

Si vous souhaitez que les barres de défilement apparaissent à l'intérieur du canevas, l'astuce consiste à utiliser un cadre supplémentaire. Placez le canevas et les barres de défilement dans ce cadre intérieur, désactivez les bordures du canevas et activez-les pour le cadre. Définissez l'arrière-plan du cadre pour qu'il soit identique à la toile et il apparaîtra que les barres de défilement sont à l'intérieur de la toile.

33
Shish