2015-02-17 197 views
3

我搜索了很多,但没有找到正确填充此内容框架的可滚动画布的方法。总是有额外的空间。tkinter:用框架内容填充可滚动画布

在下面的SO代码中找到的代码适用于一个简单示例,我希望我的DummyFrame组件能够将画布左侧的所有额外空间都拿走。

import Tkinter as tk 

class DummyFrame(tk.Frame): 
    def __init__(self, root): 
     tk.Frame.__init__(self, root, borderwidth=10, background="#ff0000") 
     tk.Label(self, text="DummyLabel").grid(row=0, column=0, sticky="wnes") 
     self.columnconfigure(0, weight=1) 
     self.rowconfigure(0, weight=1) 

class Example(tk.Frame): 
    def __init__(self, root): 
     tk.Frame.__init__(self, root) 

     self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") 
     self.frame = tk.Frame(self.canvas, borderwidth=10, background="#000000") 
     self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vsb.set) 

     self.vsb.grid(row=0, column=1, sticky="wnes") 
     self.canvas.grid(row=0, column=0, sticky="wnes") 
     self.canvas.create_window((0,0), window=self.frame, anchor="nw", 
            tags="self.frame") 

     self.frame.columnconfigure(0, weight=1) 
     self.frame.rowconfigure(0, weight=1) 
     self.frame.bind("<Configure>", self.OnFrameConfigure) 

     self.columnconfigure(0, weight=1) 
     self.rowconfigure(0, weight=1) 

     self.populate() 

    def populate(self): 
     for i_row in range(50): 
      #Component I want to take extra space when resizing window 
      DummyFrame(self.frame).grid(row = i_row+1, column = 0, sticky="we") 

    def OnFrameConfigure(self, event): 
     '''Reset the scroll region to encompass the inner frame''' 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

if __name__ == '__main__': 
    fenetre = tk.Tk() 
    fenetre.geometry('{}x{}'.format(800, 600)) 
    Example(fenetre) 
    fenetre.columnconfigure(0, weight=1) 
    fenetre.rowconfigure(0, weight=1) 
    fenetre.mainloop() 
+0

请添加当前的输出和期望的输出,以使你想要更清晰 – Ram 2015-02-18 00:02:27

回答

0

这个例子非常奇怪的注定。因此,您在Frame中的画布中放置了一个Frame中的DummyFrame。很难看到这里发生了什么,以及哪个小部件尺寸控制了用户看到的最终尺寸。不过,如果你想使DummyFrame的宽度作为根窗口(即800像素)只是改变了画布窗口宽度:

self.canvas.create_window((0,0), window=self.frame, anchor="nw", 
          width=800, 
          tags="self.frame") 
+0

谢谢,总而言之,我想要一个滚动框架中的帧列表,整个事情都可以调整大小。您的答案不允许调整窗口大小。但也许有一个滚动框架中的帧列表不是一件好事... – yellowNight 2015-02-18 09:56:11

-1

Finaly我找到了装用帆布itemconfigure我的需求:

import Tkinter as tk 

class DummyFrame(tk.Frame): 
    def __init__(self, root): 
     tk.Frame.__init__(self, root, borderwidth=10, background="#ff0000") 
     tk.Label(self, text="DummyLabel").grid(row=0, column=0, sticky="wnes") 
     self.columnconfigure(0, weight=1) 
     self.rowconfigure(0, weight=1) 
     pass 

class Example(tk.Frame): 
    def __init__(self, root): 
     tk.Frame.__init__(self, root) 

     self.canvas = tk.Canvas(root, borderwidth=0, background="#0000ff") 
     self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vsb.set) 
     self.canvas.bind("<Configure>", self.OnCanvasConfigure) 
     self.vsb.grid(row=0, column=1, sticky="wnes") 
     self.canvas.grid(row=0, column=0, sticky="wnes") 

     self.frame = tk.Frame(self.canvas, borderwidth=10, background="#000000") 
     self.frame.columnconfigure(0, weight=1) 
     self.frame.rowconfigure(0, weight=1) 

     self.window = self.canvas.create_window((0,0), window=self.frame, anchor="nw", 
          tags="self.frame") 

     self.columnconfigure(0, weight=1) 
     self.rowconfigure(0, weight=1) 

     self.populate() 

    def populate(self): 
     for i_row in range(50): 
      #Component I want to take extra space when resizing window 
      DummyFrame(self.frame).grid(row = i_row+1, column = 0, sticky="we") 

    def OnCanvasConfigure(self, event): 
     self.canvas.itemconfigure(self.window, width=event.width) 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

if __name__ == '__main__': 
    fenetre = tk.Tk() 
    fenetre.geometry('{}x{}'.format(800, 600)) 
    Example(fenetre) 
    fenetre.columnconfigure(0, weight=1) 
    fenetre.rowconfigure(0, weight=1) 
    fenetre.mainloop()