无法滚动装满按钮的画布

时间:2017-03-09 13:29:03

标签: tkinter scrollbar

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

奇怪的是它处于非活动状态,因为画布和滚动条似乎通过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 个答案:

答案 0 :(得分:1)

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

一种常见的技巧是使用create_window创建单个框架,然后您可以在放置在其中的小部件上使用packplacegrid帧。有关示例,请参阅Adding a scrollbar to a group of widgets in Tkinter