Reputation: 11
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?
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.
Upvotes: 0
Views: 43
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