0

Я пытался создать полосу прокрутки на фрейме, пытаясь объединить два кода, написанных Брайаном Окли. (Код не мой).Scrollbar - tkinter GUI - Python 3

Первый - это код, который создает несколько кадров с использованием классов, а другой использует холст для создания прокручиваемого фрейма.

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

Омг, который исправил все! Спасибо большое! Я действительно ценю это ! Хотел бы я проголосовать за вас, но моя репутация низкая ... – Baller

+1

@Baller: см. Http://stackoverflow.com/help/someone-answers –

+0

Еще один вопрос, если вы не возражаете! ярлыки появляются в левой части окна, как центрировать метки до середины рамки? – Baller