Сохранить файл без FileDialog в Python: Tkinter - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать программу в стиле «Блокнот» на Python, и застрял в той части, где нажатие кнопки «Сохранить» после открытия файла позволяет сохранить файл, не представляя файл SaveAs FileDialog пользователю.Используя приведенный ниже код, я получаю сообщение об ошибке «ValueError: операция ввода-вывода для закрытого файла», вызванное функцией FileSave () в строке «filename.write (data)».

Кодкак показано ниже:

from tkinter import *
from tkinter import ttk
from tkinter import filedialog

global filename
filename = ''

form = Tk()
form.geometry('1000x600')
form.title('Text Editor')
frame = ttk.Frame(form, padding = "3 3 12 12")
frame.grid(column = 0, row = 0, sticky = (N, W, E, S))
frame.columnconfigure(0, weight = 1)
frame.rowconfigure(0, weight = 1)
textentry = Text(frame, width = 95, height = 35)
textentry.grid(column = 0, row = 0, columnspan = 4, sticky = (N, W, E, S))
textentry.focus()

def FileNew():
    global filename
    textentry.delete('1.0','end')
    filename = ''

def FileOpen():
    global filename
    filename = filedialog.askopenfile(mode = 'r')
    if filename != None:
        t = filename.read()
        textentry.delete('0.0','end')
        textentry.insert('0.0', t)
        textentry.focus()
        filename.close()

def FileSave():
    global filename
    if filename == '':
    filename = filedialog.asksaveasfile(mode = 'w')
    if filename != None:
        data = textentry.get('1.0','end')
        filename.write(data)
        filename.close

def FileSaveAs():
    global filename
    filename = filedialog.asksaveasfile(mode = 'w')
    FileSave()

btnNew = ttk.Button(frame, text = 'New', command = FileNew)
btnNew.grid(column = 0, row = 1, sticky = 'S')
btnOpen = ttk.Button(frame, text = 'Open', command = FileOpen)
btnOpen.grid(column = 1, row = 1, sticky = 'S')
btnSave = ttk.Button(frame, text = 'Save', command = FileSave)
btnSave.grid(column = 2, row = 1, sticky = 'S')
btnSaveAs = ttk.Button(frame, text = 'Save As', command = FileSaveAs)
btnSaveAs.grid(column = 3, row = 1, sticky = 'S')

form.mainloop()

1 Ответ

0 голосов
/ 22 января 2019

Я немного отредактировал твой код, и теперь у меня все работает нормально.Теперь вы можете открыть любой файл .txt и сохранить в нем изменения, не вызывая диалоговое окно.Для этого я удалил из вашего кода file.close() операторов.

  • Если вы попытаетесь сохранить пустой экран в виде файла, ваш filename всегда будет равен '', и поэтому вы будетев конечном итоге в диалоговом окне.
  • Если, однако, вы открываете определенный файл с открытым, вы сможете использовать сохранить без вызова диалогового окна, потому что теперь ваш filename='name of the file that you decided to open'.

filename.close() операторы будут мешать, потому что вы ничего не можете сохранить в закрытый файл ... В этом случае, если вы используете функцию file_open() с оператором filename.close(), компьютервыдаст вам ошибки, так как вы ничего не можете сохранить в закрытый файл.

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

Я надеюсь, что это поможет, и вот ваш код с небольшим изменением:

from tkinter import *
from tkinter import ttk
from tkinter import filedialog

filename = ''

form = Tk()
form.geometry('1000x600')
form.title('Text Editor')
frame = ttk.Frame(form, padding="3 3 12 12")
frame.grid(column=0, row=0, sticky=(N, W, E, S))
frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)
textentry = Text(frame, width=95, height=35)
textentry.grid(column=0, row=0, columnspan=4, sticky=(N, W, E, S))
textentry.focus()


def file_new():
    global filename
    textentry.delete('1.0', 'end')
    filename = ''


def file_open():
    global filename
    filename = filedialog.askopenfile(mode='r+')
    if filename is not None:
        t = filename.read()
        textentry.delete('0.0', 'end')
        textentry.insert('0.0', t)
        textentry.focus()


def file_save():
    global filename
    if filename == '':
        filename = filedialog.asksaveasfile(mode='w')
    if filename is not None:
        data = textentry.get('1.0', 'end')
        filename.write(data)


def file_save_as():
    global filename
    filename = filedialog.asksaveasfile(mode='w')
    file_save()


btnNew = ttk.Button(frame, text='New', command=file_new)
btnNew.grid(column=0, row=1, sticky='S')
btnOpen = ttk.Button(frame, text='Open', command=file_open)
btnOpen.grid(column=1, row=1, sticky='S')
btnSave = ttk.Button(frame, text='Save', command=file_save)
btnSave.grid(column=2, row=1, sticky='S')
btnSaveAs = ttk.Button(frame, text='Save As', command=file_save_as)
btnSaveAs.grid(column=3, row=1, sticky='S')

form.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...