滚动条 - tkinter GUI - Python 3

时间:2016-08-19 16:34:34

标签: python-3.x user-interface tkinter scrollbar tkinter-canvas

我一直试图通过尝试组合Bryan Oakley编写的两个代码来在框架上创建滚动条。 (代码不是我的)。

第一个是使用类创建多个帧的代码,另一个使用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()

原始代码不使用parent或controller作为参数,而是使用root。通过切换到父级和控制器,在“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"))

这是正常的框架,没有任何问题(当然不使用画布)     class Menu(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 个答案:

答案 0 :(得分: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)

我不知道这是否是唯一的问题,但这肯定是问题的一部分。我不能简单地剪切和粘贴你的代码来测试它,因为你的代码分布在几个块中,并且不包括你的所有代码。