2016-08-19 81 views
0

我一直試圖通過嘗試將Bryan Oakley編寫的兩個代碼合併在一個框架上創建滾動條。 (代碼不是我的)。滾動條 - tkinter圖形用戶界面 - Python 3

第一個代碼是使用類創建多個框架,另一個使用canvas創建可滾動框架。

import tkinter as tk 


class SampleApp(tk.Tk): 

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

    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 (StartPage, Example): 
     page_name = F.__name__ 
     frame = F(parent=container, controller=self) 
     self.frames[page_name] = frame 

     # put all of the pages in the same location; 
     # the one on the top of the stacking order 
     # will be the one that is visible. 
     frame.grid(row=0, column=0, sticky="nsew") 

    self.show_frame("StartPage") 

def show_frame(self, page_name): 
    '''Show a frame for the given page name''' 
    frame = self.frames[page_name] 
    frame.tkraise() 

爲不使用父也不控制器作爲參數,但使用代替根原代碼。通過切換到父級和控制器,在函數「inmatning」中創建的標籤一直移動到寫入,並且滾動條不顯示。

class Example(tk.Frame): 

def __init__(self, parent, controller): 

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

    self.vsb.pack(side="right", fill="y") 
    self.canvas.pack(side="left", fill="both", expand=True) 
    self.canvas.create_window((4,4), window=self.frame, anchor="nw", 
           tags="self.frame") 

    self.frame.bind("<Configure>", self.onFrameConfigure) 
    self.inmatning() 

def inmatning(self): 

    allbio = läs_fil() 
    x = 0 
    while x < len(allbio): 

     label = tk.Label(self, text="\n"+allbio[x].namn) 
     label.pack() 
     lista =["Barn", "Vuxna", "Penionärer"] 
     l = 0 
     while l < len(lista): 
      label1= tk.Label(self, text="Antal " + lista[l]) 
      label1.pack() 
      enter1 = tk.Entry(self) 
      enter1.pack() 

      l=l+1 

     x=x+1 


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

這這裏是正常的框架,沒有任何問題的工作(不使用過程中的畫布) 類菜單(tk.Frame):

def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 
    self.controller = controller 
    label = tk.Label(self, text="Här kan du väljer mellan de följande 6 alternativen") 
    label.pack(side="top", fill="x", pady=10) 
    button1 = tk.Button(self, text="Example", 
         command=lambda: controller.show_frame("Example")) 
    button1.pack() 

    button2 = tk.Button(self, text="Beläggning", 
         command=lambda: controller.show_frame("Beläggning")) 

    button2.pack() 

回答

1

看看這個代碼:

def inmatning(self): 
    ... 
    while x < len(allbio): 
     label = tk.Label(self, text="\n"+allbio[x].namn) 

它在做什麼?它正在創建一些標籤,每個標籤都有一個父項self。什麼是self?這是一個有畫布的框架,畫布內部是一個框架。在畫布滾動時,內部框架內的小部件將滾動。

可滾動框架的整點是把小部件放在內部框架中,而不是在外部框架中。它是應該包含所有小部件的內部框架(畫布內部的框架)。

試着改變你的標籤創建這樣的:

label = tk.Label(self.frame, text="\n"+allbio[x].namn) 

我不知道,如果這是唯一的問題,但它肯定是問題的一部分。我不能簡單地剪切和粘貼你的代碼來測試它,因爲你的代碼分佈在幾個塊中,並沒有包含你所有的代碼。

+0

Omg,修復了一切!非常感謝!我真的很感激 !我希望我可以投票給你,但我的聲譽是低... – Baller

+1

@Baller:見http://stackoverflow.com/help/someone-answers –

+0

只是還有一個問題,如果你不介意!標籤出現在窗口的左側,如何將標籤居中放置在框架的中間? – Baller