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...