Как сохранить и перезагрузить маринованные данные в / из поля ввода tkinter? - PullRequest
0 голосов
/ 13 февраля 2019

Я ищу способ сохранить данные, которые были введены в поле Entry в моем графическом интерфейсе Tkinter, а затем сразу же загрузить эти данные обратно в поле Entry при открытии программы после ее закрытия.Я провел некоторое исследование и обнаружил, что модуль Pickle - лучший способ сделать это.Вот мой код:

from tkinter import*
import pickle

root = Tk()
root.geometry("200x100")

cooltext = StringVar()

entry1 = Entry(root, textvariable=cooltext)
entry1.pack()

def save():
    text = cooltext.get()
    pickle.dump(text, open("savedtext.dat", "wb"))


btn = Button(root, text="save", command=save).pack()

root.mainloop()

По сути, мой код просто сохраняет данные в файл .dat после нажатия кнопки save .Как бы я загружал те же данные, чтобы, если бы я набрал «test» и закрыл программу, а затем открыл ее, она все равно говорила бы «test»?

Это, вероятно, код для загрузки данных, но я не знаю, как включить его здесь:

text = pickle.load(open("savedtext.dat", "rb"))

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это можно сделать, используя pickle, например:

from tkinter import *
import pickle


root = Tk()
root.geometry("200x100")

cooltext = StringVar()

entry1 = Entry(root, textvariable=cooltext)
entry1.pack()


def save():
    text = cooltext.get()
    with open("savedtext.dat", "wb") as pickle_file:
        pickle.dump(text, pickle_file, pickle.HIGHEST_PROTOCOL)

def clear():
    cooltext.set('')

def load():
    with open("savedtext.dat", "rb") as pickle_file:
        text = pickle.load(pickle_file)
    cooltext.set(text)


Button(root, text="Save", command=save).pack()
Button(root, text="Clear", command=clear).pack()
Button(root, text="Load", command=load).pack()

root.mainloop()

Я добавил Очистить и Загрузить Button вместе с аналогично названными функциями дляупростить использование (и тестирование).

Примечание: Оператор наподобие btn = Button(root, text="save", command=save).pack(), который есть в вашем коде, приведет к тому, что btn будет присвоено значение None, потому чтоpack() ничего не возвращает.Это не причинило вреда, но только потому, что на btn больше никогда не ссылались, но в общем случае вам нужно будет вызвать pack() (или grid()) в отдельном выражении, как вы это делали для виджета Entry entry1.

0 голосов
/ 13 февраля 2019

Во-первых, указанный вами код имеет синтаксическую ошибку.Это

text = pickle.load(open("savedtext.dat", "rb")), а не

text = pickle.load(open("savedtext.dat"), "rb"))

Если вы хотите вставить текст в виджет Entry, вы можете использовать entry1.insert("end", text).Он вставит строку в text в конце того, что написано в вашем виджете Entry.Вы можете открыть файл, если он существует, а затем, после создания виджета Entry, проверить, есть ли что-то для вставки, а затем, если это так, вставить его.

РЕДАКТИРОВАТЬ: Как сказал @martineau, мыследует избегать открывать файл, не закрывая его после взаимодействия.Вы можете использовать что-то вроде приведенного ниже кода, чтобы прочитать содержимое файла, а затем вставить его в свой виджет.

with open("savedtext.dat", "rb") as file:
        text = pickle.load(file)
...