Changing Rowspan Not Working in Tkinter Grid

68 Views Asked by At

I am trying to create a UI with two different screens that the user can change between using a button at the top of the screen.

I have placed the button in row 0 and the frames for the other screens in row 1 however the button is appearing halfway down the screen within the frame that is supposed to be in row 1.

The current UI (there should be more labels at the bottom on this screen but they have gone of the edge of the screen

Code:

class TaskInputFrame(GeneralFrame):
    def __init__(self, *args):
        super().__init__(*args)

        self.enter_task_button = ttk.Button(self, text="Enter Task", command=self.enter_task)

        self.turnpoint1_label = ttk.Label(self, text=str("Turpoint 1:"))
        self.turnpoint2_label = ttk.Label(self, text=str("Turpoint 2:"))
        self.turnpoint3_label = ttk.Label(self, text=str("Turpoint 3:"))
        self.turnpoint4_label = ttk.Label(self, text=str("Turpoint 4:"))
        self.turnpoint5_label = ttk.Label(self, text=str("Turpoint 5:"))
        self.pilot_mass_label = ttk.Label(self, text=str("Pilot Weight:"))
        self.desired_wing_loading_label = ttk.Label(self, text=str("Desired Wing Loading:"))

        self.turnpoint1_entry = ttk.Entry(self)
        self.turnpoint2_entry = ttk.Entry(self)
        self.turnpoint3_entry = ttk.Entry(self)
        self.turnpoint4_entry = ttk.Entry(self)
        self.turnpoint5_entry = ttk.Entry(self)
        self.pilot_mass_entry = ttk.Entry(self)
        self.desired_wing_loading_entry = ttk.Entry(self)

    def place_widgets(self):
        self.enter_task_button.grid(column=0, row=7, sticky = tk.W, pady=3)

        self.turnpoint1_entry.grid(column=1, row=0, sticky=tk.E, pady=3)
        self.turnpoint2_entry.grid(column=1, row=1, sticky=tk.E, pady=3)
        self.turnpoint3_entry.grid(column=1, row=2, sticky=tk.E, pady=3)
        self.turnpoint4_entry.grid(column=1, row=3, sticky=tk.E, pady=3)
        self.turnpoint5_entry.grid(column=1, row=4, sticky=tk.E, pady=3)
        self.pilot_mass_entry.grid(column=1, row=5, sticky=tk.E, pady=3)
        self.desired_wing_loading_entry.grid(column=1, row=6, sticky=tk.E, pady=3)

        self.turnpoint1_label.grid(column=0, row=0, sticky=tk.E, pady=3, padx=1)
        self.turnpoint2_label.grid(column=0, row=1, sticky=tk.E, pady=3, padx=1)
        self.turnpoint3_label.grid(column=0, row=2, sticky=tk.E, pady=3, padx=1)
        self.turnpoint4_label.grid(column=0, row=3, sticky=tk.E, pady=3, padx=1)
        self.turnpoint5_label.grid(column=0, row=4, sticky=tk.E, pady=3, padx=1)
        self.pilot_mass_label.grid(column=0, row=5, sticky=tk.E, pady=3, padx=1)
        self.desired_wing_loading_label.grid(column=0, row=6, sticky=tk.W, pady=3)

    def forget_widgets(self):
        self.enter_task_button.grid_forget()

        self.turnpoint1_entry.grid_forget()
        self.turnpoint2_entry.grid_forget()
        self.turnpoint3_entry.grid_forget()
        self.turnpoint4_entry.grid_forget()
        self.turnpoint5_entry.grid_forget()
        self.pilot_mass_entry.grid_forget()
        self.desired_wing_loading_entry.grid_forget()

        self.turnpoint1_label.grid_forget()
        self.turnpoint2_label.grid_forget()
        self.turnpoint3_label.grid_forget()
        self.turnpoint4_label.grid_forget()
        self.turnpoint5_label.grid_forget()
        self.pilot_mass_label.grid_forget()
        self.desired_wing_loading_label.grid_forget()

    def enter_task(self):
        pass

class TaskOutputFrame(GeneralFrame):
    def __init__(self, *args):
        super().__init__(*args)

        self.task_duration_label = ttk.Label(self, text=str("Task Duration:"))
        self.optimal_launch_time_label = ttk.Label(self, text=str("Optimal Launch Time:"))
        self.finish_time_label = ttk.Label(self, text=str("Finish Time:"))
        self.optimal_wing_loading_label = ttk.Label(self, text=str("Optimal Wing Loading:"))
    
    def place_widgets(self):
        self.task_duration_label.grid(column=0, row=0, sticky=tk.E, pady=3)
        self.optimal_launch_time_label.grid(column=0, row=1, sticky=tk.E, pady=3)
        self.finish_time_label.grid(column=0, row=2, sticky=tk.E, pady=3)
        self.optimal_wing_loading_label.grid(column=0, row=3, sticky=tk.E, pady=3)

    def forget_widgets(self):
        self.task_duration_label.grid_forget()
        self.optimal_launch_time_label.grid_forget()
        self.finish_time_label.grid_forget()
        self.optimal_wing_loading_label.grid_forget()

class MapFrame(GeneralFrame):
    def __init__(self, *args):
        super().__init__(*args)

        self.map = tkintermapview.TkinterMapView(width=600, height=570, corner_radius=3)

        self.map.set_position(50.853060, -3.269220)

        self.turnpoint1 = self.map.set_marker(50.853060, -3.269220, text="NHL")
        self.turnpoint2 = self.map.set_marker(50.991271, -3.491076, text="BAM")
        self.turnpoint3 = self.map.set_marker(50.897219, -2.642515, text="YEO")
        self.turnpoint4 = self.map.set_marker(50.853060, -3.269220, text="NHL")

        self.task = self.map.set_path([self.turnpoint1.position, self.turnpoint2.position, self.turnpoint3.position, self.turnpoint4.position])

    def place_widgets(self):
        self.map.grid(column=0, row=0, padx=15, pady=15, sticky=tk.E)

    def forget_widgets(self):
        self.map.grid_forget()
    
class TaskFrame(GeneralFrame):
    def __init__(self, *args):
        super().__init__(*args)

        self.rowconfigure(0, weight=2)
        self.rowconfigure(1, weight=1)

        self.TaskInputFrame = TaskInputFrame()
        self.TaskOutputFrame = TaskOutputFrame()
        self.MapFrame = MapFrame()

        self.TaskInputFrame.grid(column=0, row=0, sticky=tk.NW)
        self.TaskOutputFrame.grid(column=0, row=1, sticky=tk.NW)
        self.MapFrame.grid(column=1, row=0, rowspan=2)
    
    def place_widgets(self):
        self.TaskInputFrame.place_widgets()
        self.TaskOutputFrame.place_widgets()
        self.MapFrame.place_widgets()

    def forget_widgets(self):
        self.TaskInputFrame.forget_widgets()
        self.TaskOutputFrame.forget_widgets()
        self.MapFrame.forget_widgets()

class MainFrame(GeneralFrame):
    def __init__(self, *args):
        super().__init__(*args)

        self.switch_frames_button = ttk.Button(self, text="Switch Frame", command=self.change_screens)
        self.switch_frames_button.grid(column=0, row=0)

        self.TaskFrame = TaskFrame()
        self.GliderFrame = GliderFrame()
        self.TaskFrame.grid(column=0, row=1)
        self.TaskFrame.place_widgets()
        self.current_frame = 1

    def change_screens(self):
        if self.current_frame == 1:     
            self.TaskFrame.grid_forget()
            self.TaskFrame.forget_widgets()
            self.GliderFrame.grid(column=0, row=1)
            self.GliderFrame.place_widgets()
            self.current_frame = 2
        else:
            self.GliderFrame.grid_forget()
            self.GliderFrame.forget_widgets()
            self.TaskFrame.grid(column=0, row=1)
            self.TaskFrame.place_widgets()
            self.current_frame = 1

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("1200x600")
        self.title("Gliding Task Analysis")
        self.main_frame = MainFrame()
        self.main_frame.grid(column=0, row=0, sticky=tk.W)

App().mainloop()
0

There are 0 best solutions below