#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. Вы не указали это в своем вопросе. Смотрите мой отредактированный ответ.