Ömer
Ömer

Reputation: 5

How can I save text files for tkinter

I write a code like this:

import tkinter as tk
from tkinter import *




def note1():
    window = tk.Tk()
    window.title("Not")
    window.geometry("300x600+90+0")
    notes = Entry(window,font="Verdana 14 italic")
    notes.pack()
    notesf = tk.Label(text=notes,font = "Verdana 10 italic" )
    notesf.pack




window = tk.Tk()
window.title("Note")
window.geometry("1680x1050+90+0")




monhts = tk.Label(text="OCAK",font = "Verdana 50 italic")
monhts.pack()




day1= tk.Button(text="1 Ocak",font = "Verdana 30 italic",command=note1)
day1.place(x=75,y=250)




window.mainloop()

But my problem isn't with all code if you look at the Def line everything seems normal but I just want to save this entry like you just write x person will pay 10 dollars and you close the program after that. When you open it again it shouldn't disappear. I have just trying to solve this for a couple of hours but I still don't have an idea. Please help me.

Here we are writing entries:

Upvotes: 0

Views: 777

Answers (1)

astqx
astqx

Reputation: 2096

Welcome to Stack Overflow!

In order to achieve this, you will need to save the contents in a text file and then retrieve them when required. Here is a working example of what you are looking for:

import tkinter as tk
from tkinter import *

def save(cont, win):
    with open ('save.txt', 'w+') as file:
        file.write(cont.get())
        file.close()
    win.destroy()

def retrieve(cont):
    with open ('save.txt', 'r') as file:
        data = file.read()
        file.close()
    return data
    
def note1():
    window1 = tk.Toplevel()
    window1.title("Not")
    window1.geometry("300x600+90+0")
    content = StringVar()
    notes = Entry(window1, font="Verdana 14 italic", textvariable = content)
    notes.pack()
    try:
        content.set(retrieve(content))
    except:
        pass
    notesf = tk.Label(text=notes,font = "Verdana 10 italic" )
    notesf.pack
    window1.protocol("WM_DELETE_WINDOW", lambda cont = content, win = window1: save(cont, win))

window = tk.Tk()
window.title("Note")
window.geometry("1680x1050+90+0")

monhts = tk.Label(text="OCAK",font = "Verdana 50 italic")
monhts.pack()

day1= tk.Button(text="1 Ocak",font = "Verdana 30 italic",command=note1)
day1.place(x=75,y=250)

window.mainloop()

Notes:

  1. I have attached the Entry to a StringVar(), by doing so, I can easily use the .get() and .set() method for getting and setting the content respectively.
  2. You were having 2 instances of Tk() in the same mainloop(), which is not appreciated, make sure you have one Tk() in one mainloop() and the others as Toplevel().
  3. I have used .protocol("WM_DELETE_WINDOW", ...) method on the window since you wanted the save to happen upon closing the window.
  4. The approach that I have mentioned ensures your Entry will display the previously entered data even if you kill the parent window after saving, but if you like to not have the data after killing the parent window and only have it during the runtime, I suggest you to just make use of the StringVar and then set it's previous value, every time you click the button.

Upvotes: 1

Related Questions