Сочетая технику полосы прокрутки с tkinter способом смены кадров - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу добавить полосу прокрутки на каждую страницу моей программы, только когда окно меньше, чем рамка внутри нее.

Моя программа создает окно tkinter и помещает все из одной части программы врамка в окно.Когда пользователь переходит к другой части программы, старые фреймы уничтожаются, а новый фрейм вставляется. Идея исходит из другого урока, который сейчас не может быть найден.Это работает так:

# -*- coding: utf-8 -*-
"""
Created on Thu Jan 18 10:27:25 2019

@author: Odatas
"""

import os

try:
     import Tkinter as tk
except ImportError:
     import tkinter as tk

try:
     import ttk
     py3 = False
except ImportError:
     import tkinter.ttk as ttk
     py3 = True

# page classes import   
from . import travel 
from . import contact
from . import dangers 
from . import sonstiges
from . import randomenpc


#Main Window wird gestartet.
class PTools(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        #self.geometry("%dx%d"%(self.winfo_screenwidth()+200,self.winfo_screenheight()+200))
        self._frame = None        
        self.title("Odatas Meister Tools")


        self.switch_frame(StartPage)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack(anchor='center')   




#Das Start Fenster was nach dem Starten des Tools gezeigt wird

class StartPage(ttk.Frame):

    def __init__(self, master):        

        # Theme für Programm wird gesetzt
        s = ttk.Style()
        if os.name == 'nt':
            s.theme_use('winnative')

        ttk.Frame.__init__(self, master)
        master.title("Hauptmenu")
        #Frames werden geöffnet.
        alles=ttk.Frame(self)
        alles.pack(padx=100)
        version=ttk.Frame(self)
        version.pack(anchor='e')
        #Ein paar Buttons               
        self.Name=ttk.Label(alles,text="Odatas Meistertools", font='Arial 18 bold')
        self.Name.pack(pady=30)

        self.Hilfe=ttk.Label(alles,text="Er haut die Alpha Versionen raus wie andere Leute die Fuffies in den Club")
        self.Hilfe.pack(pady=20)

        self.button1 =ttk.Button(alles, text ="Reisehelfer",command=lambda: master.switch_frame(travel.PageTravel),width=50) #command linked
        self.button1.pack()


        self.button2=ttk.Button(alles, text ="Monster und Wildtiere",command=lambda: master.switch_frame(dangers.PageDangers),width=50)
        self.button2.pack()

        #self.button5=ttk.Button(alles, text ="NPC Generator",command=lambda:master.switch_frame(randomenpc.PageRandomeNPC),width=50)
        #self.button5.pack()

        self.button5=ttk.Button(alles, text ="NPC Generator (In the works)",width=50)
        self.button5.pack()

        self.button3=ttk.Button(alles, text ="Verschiedenes",command=lambda: master.switch_frame(sonstiges.StuffPage),width=50)
        self.button3.pack()

        self.button4=ttk.Button(alles, text ="Kontakt",command=lambda: master.switch_frame(contact.PageContact),width=50)
        self.button4.pack()


        ttk.Button(alles, text="Quit", command=self.master.destroy,width=50).pack(pady=30)

        self.version=ttk.Label(version,text="Version Alpha 0.21")
        self.version.pack(anchor='se')

Затем я нашел этот урок Добавление полосы прокрутки к группе виджетов в Tkinter о том, как добавить полосу прокрутки.Это говорит о том, что мне нужно положить рамку на холст.Поэтому, вместо того, чтобы поместить рамку в окно, я мог бы просто поместить ее на холст и добавить полосу прокрутки ко всем моим окнам.Но я не знаю, как и где я мог бы это сделать.Я попытался внести изменения в класс PTools следующим образом:

class PTools(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
        frame = tk.Frame(canvas, background="#ffffff")
        vsb = tk.Scrollbar(self, orient="vertical", command=canvas.yview)
        canvas.configure(yscrollcommand=vsb.set)
        vsb.pack(side="right", fill="y")
        canvas.pack(side="left", fill="both", expand=True)
        canvas.create_window((4,4), window=frame, anchor="nw")
        frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
        #self.geometry("%dx%d"%(self.winfo_screenwidth()+200,self.winfo_screenheight()+200))
        self._frame = None        
        self.title("Odatas Meister Tools")
        self.switch_frame(StartPage)

Но это не работает.Я импортирую несколько других кадров в начале, которые не важны для проблемы, я думаю.Я также включил бы проверку, чтобы полоса прокрутки отображалась только тогда, когда окно меньше рамки, которую я пытаюсь добавить.Каждый кадр настолько большой, насколько это позволяет менеджер геометрии, чтобы заполнить его виджетом.Я не устанавливаю размер вручную.

...