How to remember tkinter window position in python 3? How to remember tkinter window position in python 3? tkinter tkinter

How to remember tkinter window position in python 3?


The only way to remember settings from session to session is to write them into a file. So, get the root window geometry (it's a string) and write it into a file. If you want the function to be executed automatically as a hook, bind it to the "<Configure>" event:

def save_size(event):  with open("myapp.conf", "w") as conf:    conf.write(root.geometry()) # Assuming root is the root windowroot.bind("<Configure>",save_size)

You can later read the geometry from the file and restore it.


#Here I save the x and y position of the window to a file "myapp.conf"#Here I see if the file exists.if os.path.isfile("myapp.conf"):     #Here I read the X and Y positon of the window from when I last closed it.    with open("myapp.conf", "r") as conf:         root.geometry(conf.read())else:    #Default window position.    root.geometry('610x270+0+0')def on_close():     #custom close options, here's one example:     #close = messagebox.askokcancel("Close", "Would you like to close the program?")     #if close:        #Here I write the X Y position of the window to a file "myapp.conf"        with open("myapp.conf", "w") as conf:             conf.write(root.geometry())        root.destroy()          root.protocol("WM_DELETE_WINDOW",  on_close)


It took me pretty much time to get my head around actual implementation of this. So I wanted to share my final code. Based on DyZ suggestion.

I didn't use <Configure> event as suggested because only saving before quit is enough for me.

class Window(tk.Tk):    def __init__(self, *args, **kwargs):        tk.Tk.__init__(self, *args, **kwargs)        # ...        # bla bla bla        # My GUI codes came here        # ...        # Try to load last saved window data        self.statusbar['text']="reading ini file..."        ini_file_path = "mapedit.ini"        try:            # if the file is there            # get geometry from file             ini_file = open(ini_file_path,'r')            self.geometry(ini_file.read())            self.statusbar['text']= "ini file read"            ini_file.close()        except:            # if the file is not there, create the file and use default            # then use default geometry.            self.statusbar['text']="ini file not found. New file created."            ini_file = open(ini_file_path, 'w')            ini_file.close()            self.geometry("640x400+100+200")    def client_exit(self):        self.save_geo()        self.destroy()    def save_geo(self):        # save current geometry to the ini file         try:            with open("mapedit.ini", 'w') as ini_file:                ini_file.write(self.geometry())                self.statusbar['text']="geo sv"                ini_file.close()        except:            statusbar['text']="ini file not found"'''   This is where I created GUI instance'''if __name__ == "__main__":    win = Window()    # attach deletion handler to 'client_exit' method    win.protocol("WM_DELETE_WINDOW", win.client_exit)    win.mainloop()