Диалог файла Tkinter, объединяющий диалоги сохранения и загрузки

У меня есть виджет ввода, где пользователь может ввести местоположение файла, а под ним кнопка "Сохранить" и "Загрузить". В зависимости от того, какая кнопка нажата, файл, указанный в виджете ввода, открывается либо для записи, либо для чтения.

Это все работает отлично и денди.

Теперь я хочу добавить кнопку "Обзор", которую пользователь может щелкнуть, чтобы открыть диалоговое окно для выбора файла. Когда файл выбран, имя файла копируется в запись. С этого момента кнопки сохранения и загрузки должны работать нормально.

Тем не менее, я не могу понять, как заставить файловый диалог работать как для чтения файла, так и для записи. Я не могу использовать tkFileDialog.asksaveasfilename потому что это будет жаловаться пользователю, если файл уже существует (что, если пользователь намерен "загрузить", он должен) и tkFileDialog.askloadasfilename Функция не позволяет пользователю выбрать файл, который еще не существует (который, если пользователь намеревается "сохранить", тоже подойдет).

Можно ли создать диалог, который не отображает ни одну из этих функций?

1 ответ

Это то, что вы ищете:

from tkinter import *
from tkinter.filedialog import *
root = Tk()
root.title("Save and Load")
root.geometry("600x500-400+50")

def importFiles():
    try:
        filenames = askopenfilenames()
        global file
        for file in filenames:
            fileList.insert(END, file)
    except:
        pass

def removeFiles():
    try:
        fileList.delete(fileList.curselection())
    except:
        pass

def openFile():
    try:
        text.delete(END)
        fob = open(file, 'r')
        text.insert(0.0, fob.read())
    except:
        pass

def saveFile():
    try:
        fob = open(file, 'w')
        fob.write(text.get(0.0, 'end-1c'))
        fob.close()
    except:
        pass

listFrame = Frame(root)
listFrame.pack()

sby = Scrollbar(listFrame, orient='vertical')
sby.pack(side=RIGHT, fill=Y)

fileList = Listbox(listFrame, width=100, height=5, yscrollcommand=sby.set)
fileList.pack()

sby.config(command=fileList.yview)

buttonFrame = Frame(root)
buttonFrame.pack()

importButton = Button(buttonFrame, text="Import", command=importFiles)
importButton.pack(side=LEFT)

removeButton = Button(buttonFrame, text="Remove", command=removeFiles)
removeButton.pack(side=LEFT)

openButton = Button(buttonFrame, text="Open", command=openFile)
openButton.pack(side=LEFT)

saveButton = Button(buttonFrame, text="Save", command=saveFile)
saveButton.pack(side=LEFT)

text = Text(root)
text.pack()

root.mainloop()

"Мне нужен один диалог, который возвращает имя файла, которое можно использовать как для сохранения, так и для загрузки".
Вы можете импортировать имена файлов, используя диалоговое окно; удалить выбранное имя файла из списка (дополнительная функция); откройте файл, который вы выбрали; и, наконец, напишите и сохраните их.
PS: в моем коде могут быть некоторые ошибки, но я думаю, что алгоритм делает то, что задает вопрос.

Другие вопросы по тегам