Tkinter сохранять файлы и повторно открывать файлы

#python #tkinter

#python #tkinter

Вопрос:

У меня есть графический интерфейс Python, созданный с помощью Tkinter, который имеет несколько виджетов (поля прокрутки, поля ввода, флажки и т.д.). Для этого проекта, поскольку не вся информация будет завершена за один раз, мне нужен способ сохранить то, что находится в виджетах, а затем иметь возможность снова заполнить его там, где пользователь остановился, открыв сохраненный файл. Поскольку я все еще относительно новичок в Python, я просто пытаюсь понять, что вы все сделали, чтобы добиться этого самым простым способом. Я слышал о сохранении информации в XML, используя модуль shelve, просто сохраняя как txt… Поскольку я не могу использовать SQL для этого, просто ищу способ сделать это. Спасибо

Ответ №1:

В зависимости от того, сколько данных вы хотите сохранить, я бы, в дополнение к xml, рекомендовал бы заглянуть в json или configparser, которые оба поставляются с pyhton и довольно просты.

Я не совсем уверен, входит ли это в сферу вашего вопроса или вы уже решили это, но вы упомянули сохранение и загрузку данных обратно в виджеты. Что касается этого, классы переменных tkinter и метод трассировки довольно полезны. Последний также может использоваться для проверки входных данных (минимальная длина пароля и т.д.)

Комментарии:

1. Спасибо r0w. Я рассмотрю эти варианты. Кто-то также упомянул cPickle, так что, я думаю, это тоже есть. Просто хочу сохранить данные и повторно открыть и заполнить поля ввода / текстовые виджеты и т.д. при повторном открытии приложения. Большое вам спасибо за предложения.

Ответ №2:

Просто продолжайте в том же духе. Я пытался использовать shelve, но в итоге использовал Pickle. Это было довольно просто и дало желаемые результаты. Я могу сохранить ввод от пользователя в полях ввода / переключателях, полях прокрутки и т.д., А затем повторно открыть двоичный файл и «восстановить» ввод в эти виджеты.

     import pickle as pk
    """Open File"""
    def file_open():
        designer_open_file = filedialog.askopenfilename(
            initialdir="C:/",
            defaultextension=".gd",
            filetypes=(("GD", "*.gd"), ("All files", "*"))
    )
    if designer_open_file is None:
        return

    saved_gd_data = pk.load(open(designer_open_file, "rb"))
    open_designer = saved_gd_data["gd_designer"]
    designer_nameE.delete(0, END)
    designer_nameE.insert(0, open_designer)
    
    more data collected below...

    """Save Data"""
    def file_save():
        designer_save_file = filedialog.asksaveasfile(
            initialdir="C:/", mode="w",
            defaultextension=".db",
            filetypes=(("GD", "*.gd"), ("All files", "*"))
    )
    if designer_save_file is None:
        return

    gd_save_name = designer_save_file.name
    basename = os.path.basename(gd_save_name)
    path = os.path.dirname(gd_save_name)

    gd_data = {"gsd_designer": designer_nameE.get(), "gd_design": design_nameE.get(), 
    etc, etc.

    pk.dump(gd_data, open(path   "/"   basename, "wb"))