2016-08-19 83 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