0

I'm making this Tennis GUI program on python using TKinter. The current error I get with the code below is that the 'self.title_frame' doesn't even appear on the GUI at row0. It completely just disappears. What is causing this issue?

Also, there is no actual error message. It's just the issue with the top frame (self.title_frame) not displaying on row 0. In fact, not only does it not appear but the label that is located in row 0 (self.title_label) will display in row 0 but without the frame underneath it.

from tkinter import *


    #*||Variables||*

#Stylistic Variables:

active_BG = 'DarkGreen' #active background color
active_FG = 'white' #active foreground color
main_font = 'SimSun 30 bold' #main font, size and style
sub_font = 'SimSun 20 bold' #sub font, size and style
sub_font2 = 'SimSun 11 bold' #sub font 2, size and style
sub_font3 = 'SimSun 10'

bg_1 = 'MediumSeaGreen' #background color 1
bg_2 = 'palegreen' #background color 2
bg_3 = 'SeaGreen' #background color 3
fg_1 = 'DarkGreen' #foreground color 1
fg_2 = 'LightCyan' #foreground color 2
hand_cursor = 'hand2' #button hover cursor
raised_relief = 'raised' #relief style 1 (raised)
groove_relief = 'groove' #relief style 2 (groove)

#Game Variables

#STUFF...

    #*||Functions||*

class tenalyzer_V1:

    def __init__(self, root):
        self.root = root

        self.title_frame = Frame(self.root)
        self.title_frame.grid(row=0)
        self.title_frame.config(bg=bg_1, width=520, height=100)

        self.title_label = Label(self.title_frame)
        self.title_label.grid(row=0)
        self.title_label.config(text='Tenalyzer v1.0', bg=bg_1, fg=fg_2, font=main_font, width='17', bd=10, relief=groove_relief)

        self.start_frame = Frame(self.root, bg=bg_3, width=520, height=100).grid(row=1)
        self.start_label = Button(self.start_frame)
        self.start_label.grid(row=1)
        self.start_label.config(text='START', bg=bg_2, activebackground=active_BG , fg=fg_1, activeforeground=active_FG, font=sub_font, width=14, bd=5, relief=raised_relief, cursor=hand_cursor, command=self.start_page)

        self.instructions_frame = Frame(self.root, bg=bg_1, width=520, height=100).grid(row=2)
        self.instructions_btn = Button(self.instructions_frame)
        self.instructions_btn.grid(row=2)
        self.instructions_btn.config(text='INSTRUCTIONS', bg=bg_2, activebackground=active_BG , fg=fg_1, activeforeground=active_FG, font=sub_font, width=14, bd=5, relief=raised_relief, cursor=hand_cursor, command=self.instructions_page)

        self.credit_frame = Frame(self.root, bg=bg_3, width=520, height=100).grid(row=3)
        self.credit_btn = Button(self.credit_frame)
        self.credit_btn.grid(row=3)
        self.credit_btn.config(text='CREDITS', bg=bg_2, activebackground=active_BG , fg=fg_1, activeforeground=active_FG, font=sub_font, width=14, bd=5, relief=raised_relief, cursor=hand_cursor, command=self.credits_page)

        self.return_frame = Frame(self.root, bg=bg_1, width=520, height=40).grid(row=4)
        self.return_btn = Button(self.return_frame)
        self.return_btn.grid(row=4)
        self.return_btn.config(text='Exit', bg=bg_2, activebackground=active_BG , fg=fg_1, activeforeground=active_FG, font=sub_font2, width=16, bd=5, relief=raised_relief, cursor=hand_cursor, command=self.exit_command)

    def exit_command(self):
        root.destroy()

    def title_page(self):
        self.title_label.grid(row=0)
        self.start_label.grid(row=1)
        self.instructions_btn.grid(row=2)
        self.credit_btn.grid(row=3)

        self.title_label.config(text='Tenalyzer v1.0')
        self.return_btn.config(text='Exit', command=self.exit_command)

    def start_page(self):
        print('started')

    def instructions_page(self):
        print('instructions page')

    def credits_page(self):
        print('credits page')
        self.title_label.config(text='Credits:')
        self.return_btn.config(text='Go Back', command=self.title_page)

    #*||Main Program||*

root = Tk()
root.title('Tenalyzer v1.0')
root.resizable(width=FALSE, height=FALSE)
root.geometry('{}x{}'.format(520, 440))
keyword = tenalyzer_V1(root)
root.mainloop()
strava
  • 765
  • 6
  • 14
orangeNspice
  • 1
  • 1
  • 3
  • Possible duplicate of [Python: Attribute Error - 'NoneType' object has no attribute 'something'](https://stackoverflow.com/questions/8949252/python-attribute-error-nonetype-object-has-no-attribute-something) – Patrick Artner Aug 05 '18 at 08:16

1 Answers1

1

The frame is displaying, because the label is inside the frame, so if you can see that, the frame has been packed. I think the problem you're having is that the frame isn't conforming to the width and height you've specified for it. To solve this, turn grid propagation off. ie.

self.root.grid_propagate(False)

This means that when a widget is added to the frame, the frame won't resize to match the widget.

See Bryan Oakley's answer on this question for more info: How to set the min and max height or width of a Frame?

strava
  • 765
  • 6
  • 14