Casey Wong
Casey Wong

Reputation: 11

Why is index = 0 used in the Tkinter grid_rowconfigure and grid_columnconfigure methods in this text editor program below?

Below is the code for a text editor program. I understand that the grid_rowconfigure() and grid_columnconfigure() methods have to do with dyanmically resizing of Tkinter grids so that the grid responds to resizing of the window, however I don't understand why the index of 0 is chosen for both methods. Also when placing the text_area widget on the grid, no row or column index was
specified yet it is positioned on the grid correctly.

Can someone help me understand why it is written this way?

TEXT EDITOR PROGRAM:

import os
from tkinter import *
from tkinter import filedialog, colorchooser, font
from tkinter.messagebox import *
from tkinter.filedialog import *

def change_color():
    color = colorchooser.askcolor(title="pick a color...or else")
    text_area.config(fg=color[1])


def change_font(*args):
    text_area.config(font=(font_name.get(), size_box.get()))


def new_file():
    window.title("Untitled")
    text_area.delete(1.0, END)




def open_file():
    file = askopenfilename(defaultextension=".txt", file=[("All Files", "*.*"), ("Text      Documents,""*.txt")])



    try:
        window.title(os.path.basename(file))
        text_area.delete(1.0, END)

        file = open(file, "r")
        text_area.insert(1.0, file.read())

    except Exception:
        print("couldn't read file")

    finally:
        file.close()


def save_file():
    file = filedialog.asksaveasfilename(initialfile="untitled.txt",
                                        defaultextension=".txt",
                                        filetypes=[("All Files", "*.*"),
                                                   ("Text Documents", "*.txt")])

    if file is None:
        return

    else:
        try:
            window.title(os.path.basename(file))
            file = open(file, "w")
            file.write(text_area.get(1.0, END))


        except Exception:
            print("couldn't save file")

        finally:
            file.close()



def cut():
    text_area.event_generate("<<Cut>>")

def copy():
    text_area.event_generate("<<Copy>>")

def paste():
    text_area.event_generate("<<Paste>>")


def about():
    showinfo("About this program", "This is a program written by you")


def quit():
    window.destroy()

window = Tk()

window.title("Text Editor Program")
file = None


window_width = 500
window_height = 500


screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()


x = int((screen_width/2) - (window_width/2))
y = int((screen_height/2) - (window_height/2))


window.geometry("{}x{}+{}+{}".format(window_width, window_height, x, y))



font_name = StringVar(window)
font_name.set("Arial")




font_size = StringVar(window)
font_size.set("25")



text_area = Text(window, font=(font_name.get(), font_size.get()))


scroll_bar = Scrollbar(text_area)
window.grid_rowconfigure(0, weight=1)
window.grid_columnconfigure(0, weight=1)
text_area.grid(sticky=N + E + S + W)
scroll_bar.pack(side=RIGHT, fill=Y)
text_area.config(yscrollcommand=scroll_bar.set)


frame = Frame(window)
frame.grid()

color_button = Button(frame, text="color", command=change_color)        
color_button.grid(row=0, column=0)                                      

                                                             
font_box = OptionMenu(frame, font_name, *font.families(), command=change_font)
font_box.grid(row=0,column=1)
                                   

size_box = Spinbox(frame, from_=1, to=100, textvariable=font_size,command=change_font)
size_box.grid(row=0,column=2)



menu_bar = Menu(window)
window.config(menu=menu_bar)

file_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="File", menu=file_menu)


file_menu.add_command(label="New", command=new_file)
file_menu.add_command(label="Open", command=open_file)
file_menu.add_command(label="Save", command=save_file)
file_menu.add_separator()
file_menu.add_command(label="Exit", command=quit)


edit_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Edit", menu=edit_menu)
edit_menu.add_command(label="Cut", command=cut)
edit_menu.add_command(label="Copy", command=copy)
edit_menu.add_command(label="Paste", command=paste)

help_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Help", menu=help_menu)
help_menu.add_command(label="About", command=about)


window.mainloop()

I've tried removing the window.grid_rowconfigure() and
window.grid_columnconfigure() methods.
I've also changed arguments for the frame.grid() (see image attached) as I don't understand
why frame.grid() does not require any index specification. When making these changes, it yielded the following image attached.

here are various GUI image outputs.  The associated syntax for each image is what affects the various appearance but I don't fully understand how these changes in syntax make these changes in appearance.

Upvotes: 0

Views: 43

Answers (1)

Bryan Oakley
Bryan Oakley

Reputation: 386325

If no row or column number is specified, tkinter will automatically calculate the row and column. In this case, the text widget is the first thing added to the window so by default it goes to row 0, column 0.

The call to row_configure and column_configure for that row and column is to guarantee that any allocated space in the window is given to the text widget so that it takes as much space as possible in the UI.

Upvotes: 0

Related Questions