2017-03-09 61 views
2

我之前构建了可滚动画布,但现在我必须用按钮填充其中一个,并且我不知道为什么滚动条处于非活动状态......也许问题在于画布包含按钮?无法滚动充满按钮的画布

很奇怪的是,它是无效的,因为画布和滚动条似乎是由vscrollbar.setcv.yview正确连接...

from Tkinter import * 

def main(): 

    root = Tk() 
    root.geometry("%dx%d+0+0" % (1800,1000)) 

    auxframe=Frame(root) 
    auxframe.pack(fill=BOTH, expand=YES) 

    cv = Canvas(auxframe, scrollregion=(0,0,8000,8000)) 
    vscrollbar = Scrollbar(auxframe, orient=VERTICAL) 
    vscrollbar.pack(fill=Y, side=RIGHT) 
    vscrollbar.config(command=cv.yview) 
    cv.config(yscrollcommand=vscrollbar.set) 
    cv.pack(side=LEFT, fill=BOTH, expand=TRUE) 

    memimages=[]  
    for row_index in range(8): 
     for col_index in range(8): 
      iconimage = PhotoImage(file="test.gif") 
      b=Button(cv,image=iconimage) 
      memimages.append(iconimage)    
      b.grid(row=row_index, column=col_index, sticky=N+S+E+W) 


    mainloop() 

main() 

(编辑)根据布莱恩的回答 ,我把它加入工作这个 - 注意fcv没有打包。

fcv=Frame(root) 
cv.create_window(0, 0, anchor = "nw", window=fcv) 

,所有的按钮都FCV的孩子:b=Button(fcv,image=iconimage)

我仍然不明白为什么文档(例如infohosttutorialspot)犯规提到这个重要的事实。

回答

1

画布不会通过packplacegrid滚动添加到它的对象。您必须使用画布方法create_window

的一种常用技术是使用create_window创建单个帧,并且然后可以使用packplace,或grid上被放置在框架内部部件。举例来看Adding a scrollbar to a group of widgets in Tkinter

+0

我测试了你的建议,它的工作原理。不幸的是,使用create_window会导致一个不同的问题,涉及到它的最大尺寸,我在这里问了一下https://stackoverflow.com/questions/42830037/tkinter-maximum-canvas-size/42837629#42837629。如果你能看一看它会很美妙...... – alessandro