2011-09-16 47 views
2

我很難嘗試在tkinter中實現decdent GUI佈局。我的目標左側的佈局,但沒有得到任何進一步的比右側的佈局:如何將滾動條應用於畫布中的框架

enter image description here enter image description here

我覺得完全失去了在所有不同的佈局管理器。這是到目前爲止我的代碼:

from Tkinter import * 

class ScrolledCanvas: 
    def __init__(self, master, width=500, height=350): 
     Label(master, text="top of master frame").pack(side=TOP) 
     self.control=Frame(master) 
     self.control.pack(side=BOTTOM, fill=X, padx=2) 
     Label(self.control, text="bottom of master frame").pack() 
     self.grid = Frame(master, bd=2, bg="red") 
     self.canvas = Canvas(master, relief=SUNKEN, borderwidth=2, 
          scrollregion=('-11c', '-11c', '50c', '20c')) 
     self.vscroll = Scrollbar(master, command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vscroll.set) 

     self.grid.pack(expand=YES, fill=BOTH, padx=1, pady=1) 
     self.grid.rowconfigure(0, weight=1, minsize=0) 
     self.grid.columnconfigure(0, weight=1, minsize=0) 

     self.canvas.grid(padx=1, in_=self.grid, pady=1, row=0, 
         column=0, rowspan=1, columnspan=1, sticky='news') 
     self.vscroll.grid(padx=1, in_=self.grid, pady=1, row=0, 
          column=1, rowspan=1, columnspan=1, sticky='news') 
     self.oldFill = None 
     self.canvas = self.fillCanvas(self.canvas) 

    def fillCanvas(self, theCanvas): 
     for i in range(10): 
      frame = Frame(theCanvas) 
      Label(frame, text="text for inner frame (%s)" % i).pack(side=TOP) 
      Button(frame, text="button %s.1" % i).pack(side=LEFT) 
      Button(frame, text="button %s.2" % i).pack(side=LEFT) 
      frame.pack() 
     return theCanvas 

if __name__ == '__main__': 
    root = Tk() 
    scroll = ScrolledCanvas(root) 
    root.mainloop() 

出於某種原因,scrollregion擴展到全尺寸,使所有的滾動條動作過時的(在這裏畫布充滿了一些矩形滾動條示例此代碼庫,一切滾動真尼斯)。我可能錯過了調整大小的根本原因,因爲大多數組件似乎完全忽略了它們的固定寬度和高度。

我在尋找如何獲得這個例子的幫助與tkinter一起工作。我知道還有其他佈局技術,我知道其他模塊提供可滾動的小部件。但除非完全無法避免,否則我真的很喜歡這個例子,至少要花費我3晚的時間......

+1

我知道這有點舊,但你可能想看看這個:http://stackoverflow.com/questions/3085696/adding-a-scrollbar-to-a-grid-of-widgets-in- tkinter – samwyse

回答

4

你不能將小部件打包到網格中,並期望它們滾動。相反,您必須使用create_window方法。

+0

謝謝,這真是一個大開眼界!雖然這可以讓畫布以我想要的方式滾動,但是這會讓我產生新的問題,我必須手動將畫框放在畫布上,或者我錯了嗎?在我的應用程序中,框架的數量和大小會有所不同 - 所以我希望我可以創建每個框架並將其留給某種佈局管理器,以便將它們很好地放在彼此之上...是否有機會實現這個? (我沒有卡住畫布小部件,我只是尋找任何工作組合的小部件,以獲得所需的佈局...) –

+0

是的,你必須手動定位它們。通常我所做的是爲所有內容創建一個框架,並將該框架中的內容打包(或網格化或放置)。然後,我只需要將這一幀添加到畫布上即可。它變得非常易於管理。另一個技巧是綁定到畫布的「」事件 - 每當畫布調整大小時它都會觸發。然後您可以使用來自該事件的信息來調整該框架的大小以精確地適合畫布的寬度。 –

+0

再次感謝您,我會按照您的建議來完成。 –