0

I'm trying to make a multi window program in python with tkinter with a screen that scrolls up and down (specifically the one called Calculo Actividades). I managed to get it working but I found that when the application was maximized, the frame wouldn't fill the space that was available. Here is the code I'm using:

*By the way, I'm new at python so don't hesitate to tell me if there is anything else that is wrong with my program!

# -*- coding: cp850 -*
__author__ = 'Neil Parker Sánchez'

import tkinter as tk

TITLE_FONT1 = ("Helvetica", 25, "bold")
TITLE_FONT2 = ("Helvetica", 18, "bold")
SUBTITLE_FONT1 = ("Helvetica", 14)
SUBTITLE_FONT2 = ("Helvetica", 10, "bold italic")
SUBTITLE_FONT3 = ("Helvetica", 12, "bold")
SUBTITLE_FONT4 = ("Helvetica", 10, "bold")


class MainApp(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 (MenuPrincipal, CalculoFinal, CalculoActividades):
            frame = F(container, self)
            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(MenuPrincipal)

    def show_frame(self, c):
        frame = self.frames[c]
        frame.tkraise()


class MenuPrincipal(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="CÁLCULO DE PRECIOS", font=TITLE_FONT1)
        label.pack(side="top", fill="x", pady=10)

        CFinal = tk.Button(self, width=20, text="Cálculo Final",
                            command=lambda: controller.show_frame(CalculoFinal))
        CActividades = tk.Button(self, width=20, text="Cálculo Actividades",
                            command=lambda: controller.show_frame(CalculoActividades))
        CFinal.pack()
        CActividades.pack(pady=10)


class CalculoFinal(tk.Frame):

    def __init__(self, parent, controller):
        self.controller = controller
        tk.Frame.__init__(self, parent)
        self.label = tk.Label(self, text="CÁLCULO FINAL", font=TITLE_FONT2)
        self.label.pack(side="top", fill="x", pady=10)


        #Frame
        self.MainFrame = tk.Frame(self, bd=5, relief="groove")
        self.MainFrame.pack()

        #Variables
        self.QuienReserva = tk.StringVar()
        self.TipoGrupo = tk.StringVar()
        self.TipoAlojamiento = tk.StringVar()
        self.TipoTransfer = tk.StringVar()
        self.HorarioTransfer = tk.StringVar()
        self.AeropuertoLlegada = tk.StringVar()

        #Widgets Declared
        self.DatosPrincipalesGrupo = tk.Label(self.MainFrame, text="DATOS PRINCIPALES GRUPO", font=SUBTITLE_FONT1, relief="groove")
        self.QuienReservaQ = tk.Label(self.MainFrame, text="¿Quien Reserva?")
        self.QuienReservaA = tk.OptionMenu(self.MainFrame, self.QuienReserva, "Agente", "Cliente directo")
        self.Personas = tk.Label(self.MainFrame, text="Personas", font=SUBTITLE_FONT2)
        self.NumeroAlumnosQ = tk.Label(self.MainFrame, text="Nº Alumnos")
        self.NumeroAlumnosA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.NumeroLeadersQ = tk.Label(self.MainFrame, text="Nº Leaders")
        self.NumeroLeadersA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.EdadAlumnosQ = tk.Label(self.MainFrame, text="Edad Alumnos")
        self.EdadAlumnosA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.Curso = tk.Label(self.MainFrame, text="Curso", font=SUBTITLE_FONT2)
        self.TipoGrupoQ = tk.Label(self.MainFrame, text="Tipo de Grupo")
        self.TipoGrupoA = tk.OptionMenu(self.MainFrame, self.TipoGrupo, "Cerrado", "Internacional")
        self.HorasSemanaQ = tk.Label(self.MainFrame, text="Nº Horas Curso / Semana")
        self.HorasSemanaA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.SemanasCursoQ = tk.Label(self.MainFrame, text="Nº Semanas de Curso")
        self.SemanasCursoA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.GruposPrevistosQ = tk.Label(self.MainFrame, text="Nº de Grupos Previsto")
        self.GruposPrevistosA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.Alojamiento = tk.Label(self.MainFrame, text="Alojamiento", font=SUBTITLE_FONT2)
        self.TipoAlojamientoQ = tk.Label(self.MainFrame, text="Tipo de Alojamiento")
        self.TipoAlojamientoA = tk.OptionMenu(self.MainFrame, self.TipoAlojamiento, "Familia B&B", "Familia HB", "Familia FB", "Lestonnac Doble B&B", "Lestonnac Doble HB", "Lestonnac Doble FB", "Lestonnac Individual B&B", "Lestonnac Individual HB", "Lestonnac Individual FB", "BCN Resident (sin comidas)", "BCN Resident B&B", "BCN Resident HB", "BCN Resident FB", "La Roca Doble B&B", "La Roca Doble HB", "La Roca Doble FB", "La Roca Individual B&B", "La Roca Individual HB", "La Roca Individual FB", "Alojamiento Alternativo")
        self.NumeroNochesQ = tk.Label(self.MainFrame, text="Nº Noches")
        self.NumeroNochesA = tk.Spinbox(self.MainFrame, from_=0, to=100)
        self.Transfer = tk.Label(self.MainFrame, text="Transfer", font=SUBTITLE_FONT2)
        self.TipoTransferQ = tk.Label(self.MainFrame, text="Tipo de Transfer (ida / vuelta)")
        self.TipoTransferA = tk.OptionMenu(self.MainFrame, self.TipoTransfer, "Solo Ida (o solo vuelta)", "Ida & Vuelta")
        self.HorarioTransferQ = tk.Label(self.MainFrame, text="Horario del Transfer")
        self.HorarioTransferA = tk.OptionMenu(self.MainFrame, self.HorarioTransfer, "Diurno (06:01 - 21:59)", "Nocturno (22:00 - 06:00)")
        self.AeropuertoLlegadaQ = tk.Label(self.MainFrame, text="Aeropuerto de Llegada")
        self.AeropuertoLlegadaA = tk.OptionMenu(self.MainFrame, self.AeropuertoLlegada, "Barcelona-El Prat", "Girona-Costa Brava")
        self.NumeroGuiasQ = tk.Label(self.MainFrame, text="Nº Guías IH Transfer")
        self.NumeroGuiasA = tk.Spinbox(self.MainFrame, from_=0, to=100)

        #Widgets Placed
        self.DatosPrincipalesGrupo.grid(column=1, row=1, columnspan=2)
        self.QuienReservaQ.grid(column=1, row=2, sticky="W")
        self.QuienReservaA.grid(column=2, row=2, sticky="E")
        self.Personas.grid(column=1, row=3, columnspan=2)
        self.NumeroAlumnosQ.grid(column=1, row=4, sticky="W")
        self.NumeroAlumnosA.grid(column=2, row=4, sticky="E")
        self.NumeroLeadersQ.grid(column=1, row=5, sticky="W")
        self.NumeroLeadersA.grid(column=2, row=5, sticky="E")
        self.EdadAlumnosQ.grid(column=1, row=6, sticky="W")
        self.EdadAlumnosA.grid(column=2, row=6, sticky="E")
        self.Curso.grid(column=1, row=7, columnspan=2)
        self.TipoGrupoQ.grid(column=1, row=8, sticky="W")
        self.TipoGrupoA.grid(column=2, row=8, sticky="E")
        self.HorasSemanaQ.grid(column=1, row=9, sticky="W")
        self.HorasSemanaA.grid(column=2, row=9, sticky="E")
        self.SemanasCursoQ.grid(column=1, row=10, sticky="W")
        self.SemanasCursoA.grid(column=2, row=10, sticky="E")
        self.GruposPrevistosQ.grid(column=1, row=11, sticky="W")
        self.GruposPrevistosA.grid(column=2, row=11, sticky="E")
        self.Alojamiento.grid(column=1, row=12, columnspan=2)
        self.TipoAlojamientoQ.grid(column=1, row=13, sticky="W")
        self.TipoAlojamientoA.grid(column=2, row=13, sticky="E")
        self.NumeroNochesQ.grid(column=1, row=14, sticky="W")
        self.NumeroNochesA.grid(column=2, row=14, sticky="E")
        self.Transfer.grid(column=1, row=15, columnspan=2)
        self.TipoTransferQ.grid(column=1, row=16, sticky="W")
        self.TipoTransferA.grid(column=2, row=16, sticky="E")
        self.HorarioTransferQ.grid(column=1, row=17, sticky="W")
        self.HorarioTransferA.grid(column=2, row=17, sticky="E")
        self.AeropuertoLlegadaQ.grid(column=1, row=18, sticky="W")
        self.AeropuertoLlegadaA.grid(column=2, row=18, sticky="E")
        self.NumeroGuiasQ.grid(column=1, row=19, sticky="W")
        self.NumeroGuiasA.grid(column=2, row=19, sticky="E")


        self.MPrincipal = tk.Button(self, width=20, text="Volver al menú principal",
                               command=lambda: controller.show_frame(MenuPrincipal))
        self.MPrincipal.pack(pady=10)


class CalculoActividades(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        self.subframe = tk.Frame(self)
        self.subframe.pack()

        self.canvas = tk.Canvas(self.subframe, borderwidth=0)

        self.subframe1 = tk.Frame(self.subframe)
        self.subframe1.grid(column=1, row=1, pady=20)
        self.subframe2 = tk.Frame(self.subframe)
        self.subframe2.grid(column=1, row=2, sticky="nw", padx=130)

        self.CalculoActividades = tk.Label(self.subframe1, text="CÁLCULO ACTIVIDADES", font=TITLE_FONT2)
        self.CalculoActividades.grid(column=1, row=1)

        #Frame
        self.MainFrame = tk.Frame(self.canvas)

        #Scrollbar
        self.vsb = tk.Scrollbar(self.subframe, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.grid(rowspan=4, column=2, row=1, sticky="ns")
        self.canvas.grid(row=3, column=1, sticky="nw")
        self.canvas.create_window((4,4), window=self.MainFrame, anchor="nw",
                                  tags="self.frame")
        self.MainFrame.bind("<Configure>", self.onFrameConfigure)

        #Variables

        #Widgets Declared
        self.AñadirActividad = tk.Label(self.subframe2, text="¿Añadir\nactividad?", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.NumeroVeces = tk.Label(self.subframe2, text="Nº veces que\nse hace la\nactividad en\ntotal de\nestancia", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.CuandoSeHace = tk.Label(self.subframe2, text="¿Cuándo se hace\nla actividad?", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.DuracionActividad = tk.Label(self.subframe2, text="Duración de la\nactividad\n(h)", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.Traslado = tk.Label(self.subframe2, text="Traslado a la\nactividad", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.Variables = tk.Label(self.subframe2, text="Variables", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.CosteFinal = tk.Label(self.subframe2, text="Coste final\ngrupo", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.PrecioFinal = tk.Label(self.subframe2, text="Precio final\ngrupo", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.PrecioAlumno = tk.Label(self.subframe2, text="Precio final\npor alumno", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.MargenEuro = tk.Label(self.subframe2, text="Margen (?)", font=SUBTITLE_FONT4, padx=2, pady=2)
        self.MargenPor = tk.Label(self.subframe2, text="Margen (%)", font=SUBTITLE_FONT4, padx=2, pady=2)

        self.Gratis = tk.Label(self.MainFrame, text="GRATIS\n\n", font=SUBTITLE_FONT3)
        self.MuseoOlimpico = tk.Label(self.MainFrame, text="MUSEO\nOLÍMPICO\n(>10 PAX)", font=SUBTITLE_FONT3)
        self.MuseoCera = tk.Label(self.MainFrame, text="MUSEO DE\nLA CERA\n", font=SUBTITLE_FONT3)
        self.TapasExperience = tk.Label(self.MainFrame, text="TAPAS\nEXPERIENCE\n", font=SUBTITLE_FONT3)
        self.CenaTipica = tk.Label(self.MainFrame, text="CENA\nTÍPICA\n", font=SUBTITLE_FONT3)
        self.CasaBatllo = tk.Label(self.MainFrame, text="CASA\nBATLLÓ\n", font=SUBTITLE_FONT3)
        self.Castellers = tk.Label(self.MainFrame, text="CASTELLERS\n\n", font=SUBTITLE_FONT3)
        self.Bowling = tk.Label(self.MainFrame, text="BOWLING\n\n", font=SUBTITLE_FONT3)
        self.MuseoChocolate = tk.Label(self.MainFrame, text="MUSEU DE LA\nXOCOLATA\n", font=SUBTITLE_FONT3)
        self.ParcGuell = tk.Label(self.MainFrame, text="PARC\nGÜELL\n", font=SUBTITLE_FONT3)
        self.SagradaFamilia = tk.Label(self.MainFrame, text="SAGRADA\nFAMILIA\n", font=SUBTITLE_FONT3)
        self.CasaMila = tk.Label(self.MainFrame, text="CASA\nMILÀ\n", font=SUBTITLE_FONT3)
        self.CampNou = tk.Label(self.MainFrame, text="CAMP\nNOU\n", font=SUBTITLE_FONT3)
        self.BCNTour = tk.Label(self.MainFrame, text="BARCELONA\nTOUR (6H)\n", font=SUBTITLE_FONT3)
        self.PortAventura = tk.Label(self.MainFrame, text="PORT\nAVENTURA\n", font=SUBTITLE_FONT3)
        self.Tarragona = tk.Label(self.MainFrame, text="TARRAGONA\n\n", font=SUBTITLE_FONT3)
        self.GironaFigueres = tk.Label(self.MainFrame, text="GIRONA &\nFIGUERES +\nDALÍ", font=SUBTITLE_FONT3)
        self.SitgesMontserrat = tk.Label(self.MainFrame, text="SITGES &\nMONTSERRAT\n", font=SUBTITLE_FONT3)
        self.Tibidabo = tk.Label(self.MainFrame, text="TIBIDABO\n(1/2 O 1 DÍA)\n", font=SUBTITLE_FONT3)
        self.Sitges = tk.Label(self.MainFrame, text="SITGES\n(1/2 DÍA)\n", font=SUBTITLE_FONT3)
        self.Collserola = tk.Label(self.MainFrame, text="COLLSEROLA\n(1/2 DÍA)\n", font=SUBTITLE_FONT3)

        #Widgets Placed
        self.AñadirActividad.grid(column=2, row=1)
        self.NumeroVeces.grid(column=3, row=1)
        self.CuandoSeHace.grid(column=4, row=1)
        self.DuracionActividad.grid(column=5, row=1)
        self.Traslado.grid(column=6, row=1)
        self.Variables.grid(column=7, row=1)
        self.CosteFinal.grid(column=8, row=1)
        self.PrecioFinal.grid(column=9, row=1)
        self.PrecioAlumno.grid(column=10, row=1)
        self.MargenEuro.grid(column=11, row=1)
        self.MargenPor.grid(column=12, row=1)

        self.Gratis.grid(column=1, row=3)
        self.MuseoOlimpico.grid(column=1, row=5)
        self.MuseoCera.grid(column=1, row=7)
        self.TapasExperience.grid(column=1, row=9)
        self.CenaTipica.grid(column=1, row=11)
        self.CasaBatllo.grid(column=1, row=13)
        self.Castellers.grid(column=1, row=15)
        self.Bowling.grid(column=1, row=17)
        self.MuseoChocolate.grid(column=1, row=19)
        self.ParcGuell.grid(column=1, row=21)
        self.SagradaFamilia.grid(column=1, row=23)
        self.CasaMila.grid(column=1, row=25)
        self.CampNou.grid(column=1, row=27)
        self.BCNTour.grid(column=1, row=29)
        self.PortAventura.grid(column=1, row=31)
        self.Tarragona.grid(column=1, row=33)
        self.GironaFigueres.grid(column=1, row=35)
        self.SitgesMontserrat.grid(column=1, row=37)
        self.Tibidabo.grid(column=1, row=39)
        self.Sitges.grid(column=1, row=41)
        self.Collserola.grid(column=1, row=43)


        self.MPrincipal = tk.Button(self.subframe1, width=20, text="Volver al menú principal",
                               command=lambda: controller.show_frame(MenuPrincipal))
        self.MPrincipal.grid(column=5, row=1, padx=10)

    def onFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    app = MainApp()
    app.mainloop()

Thanks in advance!

edit: This question was marked as a duplicate but I couldn't figure out how to solve the problem using the solution that I was linked to. I would really appreciate if you could please help me out with this...

  • Perhaps if you can edit your question to have less code. Surely you don't need all that code to duplicate the problem. See http://stackoverflow.com/help/mcve – Bryan Oakley Aug 28 '15 at 00:55
  • When you say "the frame wouldn't fill the space", which frame is "the frame"? I see several frames, which one has the problem? – Bryan Oakley Aug 28 '15 at 00:58

0 Answers0