2013-10-20 9 views
7

Wdrażam graficzny edytor tekstu w Pythonie.
Mam wyświetlany obszar tekstu, ale kiedy próbuję użyć metody asksaveasfile w Tkinter, to pokazuje, że plik został zapisany, ale kiedy próbuję otworzyć ten sam plik w moim edytorze, daje mi pusty plik.Zapisz okno dialogowe pliku w Tkinter

Tylko, plik zostanie utworzony i zapisany. Jego zawartość nie jest.

Chciałbym wiedzieć, dlaczego. czy robię coś źle? Oto mój kod:

from Tkinter import * 
import tkMessageBox 
import Tkinter 
import tkFileDialog 

def donothing(): 
    print "a" 

def file_save(): 
    name=asksaveasfile(mode='w',defaultextension=".txt") 
    text2save=str(text.get(0.0,END)) 
    name.write(text2save) 
    name.close 

root = Tk() 
root.geometry("500x500") 
menubar=Menu(root) 
text=Text(root) 
text.pack() 
filemenu=Menu(menubar,tearoff=0) 
filemenu.add_command(label="New", command=donothing) 
filemenu.add_command(label="Open", command=donothing) 
filemenu.add_command(label="Save", command=file_save) 
filemenu.add_command(label="Save as...", command=donothing) 
filemenu.add_command(label="Close", command=donothing) 
filemenu.add_separator() 
filemenu.add_command(label="Exit", command=root.quit) 
menubar.add_cascade(label="File", menu=filemenu) 

editmenu=Menu(menubar,tearoff=0) 
editmenu.add_command(label="Undo", command=donothing) 
editmenu.add_command(label="Copy", command=donothing) 
editmenu.add_command(label="Paste", command=donothing) 
menubar.add_cascade(label="Edit", menu=editmenu) 

helpmenu=Menu(menubar,tearoff=0) 
helpmenu.add_command(label="Help",command=donothing) 
menubar.add_cascade(label="Help",menu=helpmenu) 

root.config(menu=menubar) 
root.mainloop() 

Odpowiedz

17

Nazwa funkcji to asksaveasfilename. I powinien być zakwalifikowany jako tkFileDialog.asksaveasfilename. I nie przyjmuje argumentu mode.

Może chcesz użyć tkFileDialog.asksaveasfile.

def file_save(): 
    f = tkFileDialog.asksaveasfile(mode='w', defaultextension=".txt") 
    if f is None: # asksaveasfile return `None` if dialog closed with "cancel". 
     return 
    text2save = str(text.get(1.0, END)) # starts from `1.0`, not `0.0` 
    f.write(text2save) 
    f.close() # `()` was missing. 
+0

Działa. Myślę, że to z powodu nawiasów, że to nie działa. –

+0

Właśnie utworzyłeś edycję, mówiącą, że indeksowanie zaczyna się od 1.0, ale mój tekst jest idealnie zapisany, nawet jeśli wstawię indeks początkowy jako 0.0. –

+4

@RohitShinde, Można podać indeks jako '(0.0, END), aby uzyskać cały tekst, ale' (1.0, END) 'jest poprawny do określenia. Jeśli chcesz drugi wiersz, powinieneś podać '2.x', a nie' 1.x'. – falsetru