2016-02-03 39 views
2

帆布佔據整個屏幕,從綠色可以看出。 canvasFrame有兩行,其中第二個是滾動文本小部件。第二排也被加重,但是由於綠色區域應該是黃色,所以沒有填滿篩選。如何獲得第二行以填充空白區域並使滾動的文本小部件垂直展開。tkinter - 加重帆布不填充空的空間

P.S. innerFrame在這個例子中看起來不是必需的,但它在那裏,因爲我爲了簡單起見刪除了框架中的其他小部件。

Canvas

代碼:

import tkinter as tk 
from tkinter import ttk 
import tkinter.scrolledtext as tks 

class Program(tk.Tk):   
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     tk.Tk.iconbitmap(self, default = "") 
     tk.Tk.wm_title(self, "") 

     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 
     for F in (Page, Other): 

      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 

     self.show_frame(Page) 

    def show_frame(self,cont): 
     frame = self.frames[cont] 
     frame.tkraise() 


class Page(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

     innerFrame = tk.Frame(self, bg="red") 
     innerFrame.place(relx=.5, rely=.5, anchor="c", relwidth=1.0, relheight=1.0) 

     innerFrame.grid_rowconfigure(1, weight=1) 
     innerFrame.grid_columnconfigure(0, weight=1) 

     frameOne = tk.Frame(innerFrame, bg="green") 
     frameOne.grid(row=1, sticky="NSWE") 

     self.canvas = tk.Canvas(frameOne, bg="green") 

     canvasFrame = tk.Frame(self.canvas, bg="yellow") 
     canvasFrame.pack() 

     canvasFrame.grid_rowconfigure(1, weight=1) 

     scrollbar = tk.Scrollbar(frameOne, orient="horizontal", command=self.canvas.xview) 
     self.canvas.configure(xscrollcommand=scrollbar.set) 
     scrollbar.pack(side="bottom", fill="x") 

     self.canvas.pack(fill="both", expand=True) 
     self.canvas.create_window((0, 0), window=canvasFrame, anchor="nw") 

     for x in range(5): 
      pagename = tk.Label(canvasFrame, text = "Unit Name") 
      pagename.grid(row=0, column=x, sticky="NSEW") 
      text = tks.ScrolledText(canvasFrame, width=50) 
      text.grid(row=1, column=x ,sticky="NSEW") 

     canvasFrame.bind("<Configure>", self.onFrameConfigure) 

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


class Other(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

app = Program() 
app.state('zoomed') 
app.mainloop() 
+0

你爲什麼使用畫布?如果您擁有的只是可滾動的小部件,則不需要畫布。或者其他兩個框架。你讓問題比需要的複雜得多。 –

+0

我需要水平滾動條的畫布,我也有畫布外部的小部件。水平滾動條必須能夠滾動到離開屏幕的Scrolledtext小部件。 – simpleguy

回答

1

canvasFrame沒有理由擴大,以填補畫布上。你已經放置了小部件,並且框架會縮小以適合小部件。

最常見的解決方法是添加綁定到畫布的<Configure>事件,獲取畫布的高度,並使用畫布itemconfigure方法將框架的高度調整爲與高度相同帆布。

class Page(...): 
    def __init__(...): 
     ... 
     self.frame_id = self.canvas.create_window(...) 
     ... 
     self.canvas.bind("<Configure>", self.onCanvasConfigure) 

    def onCanvasConfigure(self, event): 
     # you might need to subtract a little to account for borders, 
     # padding, etc. 
     self.canvas.itemconfigure(self.frame_id, height=event.height)