滚动条 - tkinter GUI - Python 3

Scrollbar - tkinter GUI - Python 3

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

第一个是使用 classes 创建多个框架的代码,另一个使用 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作为参数,而是使用roots。通过切换到父级和控制器,在函数 "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"))

这是正常的框架,没有任何问题(当然不使用 canvas) class 菜单(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()

看看这段代码:

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

它在做什么?它正在创建一些标签,每个标签都有 self 的父级。 self 是什么?它是一个有 canvas 的框架,canvas 里面是一个框架。滚动 canvas 时,该内部框架内的小部件将滚动。

可滚动框架的全部意义在于将小部件 放在内部框架 中,而不是放在外部框架中。它是包含所有小部件的内部框架(canvas 内的框架)。

尝试将您的标签创建更改为:

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

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