Sto provando a creare una finestra di dialogo di salvataggio in tkinter. Ho bisogno di salvare il nome del file da usare in seguito. Tuttavia, non voglio che il filedialog accetti di selezionare un nome di file già esistente.salva come finestra di dialogo - come non consentire la sovrascrittura
Finora ho solo questo:
from tkinter import filedialog
my_file = filedialog.asksaveasfilename(defaultextension = ".myfile",
filetypes = [("MY SUPER FILE", ".myfile"),
("All files", ".*")])
Una possibilità potrebbe essere quella di ottenere il nome del file, controllare se esiste (utilizzando os.path.isfile
) e chiedo di nuovo l'utente per il nuovo nome se esiste già un file con lo stesso nome Tuttavia, il filedialog di tkinter chiede all'utente "il file esiste già. Vuoi sovrascrivere?". Quindi sembra confondersi se in seguito dico all'utente che non accetto la scelta del nome file. C'è un modo per forzare il filedialog di tkinter a non chiedere all'utente la sovrascrittura?
Modifica: Sulla base dei suggerimenti nelle risposte, ho provato a creare la mia finestra di dialogo di salvataggio.
ho praticamente solo aggiunto un avvertimento per il Tkinter finestra di salvataggio:
class MySaveFileDialog(filedialog.FileDialog):
""" File save dialog that does not allow overwriting of existing file"""
def ok_command(self):
file = self.get_selection()
if os.path.exists(file):
if os.path.isdir(file):
self.master.bell()
return
messagebox.showarning("The current file name already exists. Please give another name to save your file.")
else:
head, tail = os.path.split(file)
if not os.path.isdir(head):
self.master.bell()
return
self.quit(file)
Così, sembra piuttosto semplice. Poi ho pensato: ho bisogno di creare la mia funzione asksaveasfilename
. sono andato a controllare la fonte:
def asksaveasfilename(**options):
"Ask for a filename to save as"
return SaveAs(**options).show()
Humm .. Ho bisogno di vedere ciò che è SaveAs
facendo.
class SaveAs(_Dialog):
"Ask for a filename to save as"
command = "tk_getSaveFile"
Aaanndd ... sono perso. Non capisco come si integrino questi pezzi. 'SaveAs' ha solo il comando tk_getSaveFile
. Come si usa SaveFileDialog qui? E come posso creare la mia funzione myasksaveasfilename
?
Do you _really_ serve questo? Le finestre di dialogo con comportamento non standard confondono l'utente. Inoltre, se l'utente vuole sovrascrivere un file esistente, è bene avvisarlo, ma è davvero fastidioso fermarlo. Quindi, se il nome selezionato corrisponde a un file esistente, è possibile aprire una finestra di messaggio 'askokcancel' per dare loro un'ultima possibilità prima di spararsi nel piede.:) –
@PM 2Ring: capisco la tua preoccupazione. E mi piacerebbe non farlo in questo modo, ma ne ho davvero bisogno :) – zelite
Due cose che contano in tale problema: 1) l'utente ha un altro mezzo per farlo? 2) sarà usato volontariamente più spesso che come errore? Qui 1) la risposta è sì (è possibile eliminare il file all'esterno dell'app) e 2) la risposta dipende da cosa fa l'app. –