Получить имя файла с помощью tkinter.filedialog.asksaveasfilename для добавления в него

#python #tkinter #filedialog

#python #tkinter #файловый каталог

Вопрос:

из приложения с графическим интерфейсом, разработанного с tkinter помощью, я хочу сохранить некоторые данные в файле в режиме добавления. Чтобы получить имя файла, я использую asksaveasfilename from filedialog module . Вот код:

 from tkinter.filedialog import asksaveasfilename

def save_file():

    file_name = asksaveasfilename()

    if file_name:
        f = open(file_name, 'a')
        contents = tab_chrono.text_area.get(1.0, 'end')
        f.write(contents)
        f.close()
  

Проблема возникает, когда я выбираю в диалоговом окне существующий файл, я получил предупреждение о том, что файл будет перезаписан. Это неверно, поскольку я добавляю в файл.
Есть ли способ избавиться от этого предупреждения? Или я должен переписать askappendfilename сам? Это отсутствует в filedialog модуле.
введите описание изображения здесь

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

1. если вы всегда выбираете файл для добавления (но вы только что создали новый), вы можете использовать askopenfilename , но вместо «Сохранить» будет отображаться кнопка «Открыть» (вы можете установить заголовок окна =»Открыть для добавления»). Или вам придется создать собственный диалог.

2. К сожалению, я хочу создать новый файл, если файл не существует.

3. Поэтому вам придется создать собственный диалог. Попробуйте print(tkinter.filedialog.__file__) увидеть путь к файлу с asksaveasfilename помощью (и других диалоговых окон файлов). Вы можете использовать этот код для создания собственной версии. Или создать с нуля 🙂

Ответ №1:

asksaveasfilename Диалоговое окно принимает confirmoverwrite аргумент для включения или отключения проверки существования файла.

 file_name = asksaveasfilename(confirmoverwrite=False)
  

Это можно найти в руководстве по Tk для tk_getSaveFile, но, похоже, не задокументировано для tkinter. Он был представлен в Tk 8.5.11, поэтому является относительно новым в терминах Tk (выпущен в ноябре 2011 года).

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

1.Также описано по следующим ссылкам, но ни одна из них не является Tkinter . tcl.tk/man/tcl/TkCmd/getOpenFile.htm tcl.tk/cgi-bin/tct/tip/382.html manpagez.com/man/n/tk_getSaveFile

Ответ №2:

Используйте опцию confirmoverwrite , чтобы предотвратить сообщение при выборе существующего файла.

 import tkFileDialog 
import time
class Example():

    dlg = tkFileDialog.asksaveasfilename(confirmoverwrite=False)
    fname = dlg
    if fname != '':
        try:
            f = open(fname, "rw ")
            text = f.read()
            print text
        except:
            f = open(fname, "w")
        new_text = time.time()
        f.write(str(new_text) 'n')
        f.close()      
  

Редактировать: Обратите внимание, что я использую f.read() , чтобы иметь возможность печатать существующий текст.
Возможно, вы захотите удалить f.read() и последующий print оператор и заменить их на a f.seek(0,2) , который помещает указатель в конец существующего файла.
Другой вариант заключается в следующем, используя append опцию в файле open, которая создаст файл, если он еще не существует:

 import tkFileDialog 
import time
class Example():

    dlg = tkFileDialog.asksaveasfilename(confirmoverwrite=False)
    fname = dlg
    if fname != '':
        f = open(fname, "a")
        new_text = time.time()
        f.write(str(new_text) 'n')
        f.close()      
  

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

1. Если файл не существует, askopenfile генерирует сообщение об ошибке. Если файл не существует, я хочу его создать. Если он существует, я хочу добавить в него

2. Вы не указали это в своем вопросе. Смотрите мой отредактированный ответ.