2013-07-17 108 views
0

我有一個畫布(對於ttk.Frame沒有xviewyview方法)保持幀內,我想水平瀏覽,因爲它們在同一行。找到了一些教程,當他們處理不同的小部件組合時,我跟着他們,並嘗試將它們應用於我的問題,但沒有成功。我確實看到了一個滾動條,但它不會做任何事情或做出任何迴應。水平滾動條不能在Python中工作TKinter框架

class App: 
    def __init__(self,db): 
     self.db = db 
     self.root = tkinter.Tk()        
     self.masterframe = ttk.Frame(self.root) 
     self.masterframe.grid() 

     self.mastercanvas = tkinter.Canvas(self.masterframe) 
     self.mastercanvas.grid() 

     self.scrollbar = ttk.Scrollbar(self.masterframe,orient="horizontal", 
      command = self.mastercanvas.xview) 

     self.scrollbar.grid() 
     self.mastercanvas.configure(xscrollcommand=self.scrollbar.set) 

     for i,e in enumerate(self.db.elements): 
      xf = XFrame(self,e) 
      xf.grid(row=0,column=i,sticky="n") 

編輯:

class XFrame: 
    def __init__(self,app,x): 
     self.app = app 
     self.x = x 
     self.frame = ttk.Frame(self.app.mastercanvas) 
     self.set_up() # this sets frame's padding and populates it with widgets 

現在,在以往任何時候我貼的兩行代碼這裏建議* - 在第一INIT定義的結束,或在第二初始化結束定義 - 沒有新的事情發生。我看到我的框架出現,因爲我打算他們出現 - 其中3。第四部分。還有一個不起作用的滾動條。

*

self.update_idletasks() # using self.root in first, self.app.root in second variant 
self.mastercanvas.configure(scrollregion=self.mastercanvas.bbox("all")) 
# in second variant reffered to as self.app.mastercanvas ... 

回答

0

你必須配置畫布scrollregion屬性,以便它知道你要多少的虛擬畫面的滾動。這應做到:

# create everything that will be inside the canvas 
... 

# next, cause the window to be drawn, so the frame will auto-size 
self.update_idletasks() 

# now, tell the canvas to scroll everything that is inside it 
self.mastercanvas.configure(scrollregion=self.mastercanvas.bbox("all")) 

話雖這麼說,有沒有在你的畫布上進行滾動,我不完全知道什麼你期待在畫布上。如果您想滾動XFrame的實例,則它們需要是其他框架的子項,而其他框架需要是畫布上的對象。

+0

哪個對象應該調用'update_idletasks'?同時 - 接着是'scrollregion'配置 - 我試着從一個會話中調用它(根據會話),masterframe,mastercanvas,然後嘗試從'XFrame'類(它可以訪問'App')嘗試調用它們,但沒有任何效果。 –

+0

哪個對象應該調用update_idletasks?沒關係。不管你怎麼稱呼,它都會做同樣的事情。 –

+0

我已經更新了我的答案,以提供更多信息。也許你沒有看到任何效果,因爲畫布中沒有任何內容可以滾動。 –