2011-10-11 219 views
18

我正在嘗試使畫布可滾動。但是,一旦我嘗試設置滾動條來處理畫布,tkinter似乎完全忽略了我最初爲畫布設置的尺寸。我已經嘗試將它們全部放在一個框架中,設置畫布以填充框架,然後設置框架大小,但是這會出現相同的問題,除非我將框架設置爲填充窗口,這不是我想要的。基本上,我想要一個帶有滾動條的固定大小的畫布。我當前的代碼看起來像這樣(在Python 3.1):python和tkinter:在畫布上使用滾動條

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() 

回答

26

你的滾動條需要有框架作爲家長,而不是帆布:

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() 

爲什麼這個工作的原因是由於如何pack工程。默認情況下,它會嘗試收縮(或增長)一個容器,使其完全適合其子項。由於滾動條是原始示例中畫布的子項,因此畫布會縮小以適合其大小。

如果您希望滾動條出現在畫布內部,技巧是使用額外的框架。將畫布和滾動條放入此內框中,將邊框從畫布上移開,然後打開框架。將框架的背景設置爲與畫布相同,並顯示滾動條位於畫布內。

+0

爲什麼我們最後必須將畫布打包?我注意到,當我在任何滾動條之前打開畫布時,它最終會重疊水平滾動條 - 我剛開始使用tkinter,但我認爲這個包不會重疊。 謝謝 – Lanfear

+1

而核心是'scrollregion =(0,0,500,500)',沒有它,整個都無法工作! – Turtle