Как помимо Text сохранять color и font?

Рейтинг: 1Ответов: 0Опубликовано: 29.04.2023

Я пишу свой текстовый редактор на Python 3.9 и не понимаю, как помимо самого текста сохранять в файл ещё цвет и шрифт, который задал пользователь. (шрифт может быть не один во всём документе (textbox), а несколько). Я ничего не пробовал сделать, поскольку не нашёл информации.

import tkinter.filedialog, tkinter as tk, time
from tkinter import messagebox as mb
from tkinter import ttk
import fileinput
from tkinter import filedialog
from tkinter import colorchooser
import webbrowser
from tkinter.colorchooser import*
import os
import sys

def help():
    webbrowser.open('www.printword-official.tk')

def select_all():
    textbox.tag_add(SEL, "1.0", END)
    textbox.mark_set(INSERT, "1.0")
    textbox.see(INSERT)

def cut_text(self):
        self.copy_text()
        self.delete_text()


    
def paste_text(self):
    textbox.insert(tk.INSERT, self.clipboard_get())

def delete_text(self):
    selection = textbox.tag_ranges(tk.SEL)
    if selection:
        textbox.delete(*selection)

def popup(event):
    global x, y
    x = event.x
    y = event.y
    km.post(event.x_root, event.y_root)

x = 0
y = 0
    
def prg():
    tkinter.messagebox.showinfo('О программе', 'Вы используете PrintWord версии 1.4.\nСпасибо за выбор нашей программы!\n Евгений Чертин. 2023. ')

def app_exit():
    answer = tkinter.messagebox.askokcancel('Выход', 'Вы точно хотите выйти?')
    if answer:
        app.destroy()


def change_theme(theme):
    app['bg'] = view_colors[theme]['text_bg'] 
    textbox['fg'] = view_colors[theme]['text_fg']



    
  

def NewFile():
    answer = tkinter.messagebox.askokcancel('Новый файл', 'Вы точно хотите создать новый файл? Все несохранённые файлы удалятся')
    if answer:
        textbox.delete('1.0', 'end')
        textbox.pack()
        

def LoadFile():
     file_path = filedialog.askopenfilename(title='Выбор файла', filetypes=(('Текстовые документы (*.txt)', '*.txt'), ('Все файлы', '*.*'),  ('Файлы PrintWord', '*.prtw*')))
     if file_path:
        textbox.delete('1.0', END)
        textbox.insert('1.0', open(file_path, encoding='utf-8').read())



class App(tk.Tk):

    def __init__(self):
        super().__init__()
  
  



 
def font_changed(font):
    if textbox.tag_ranges('sel'):
        textbox.tag_add('fonttag_' + str(), SEL_FIRST,SEL_LAST)
        textbox.tag_configure('fonttag_' + str(), font=font)
    else:
        textbox.config(font=font)

def select_color():
    global count
    color = askcolor()
    if textbox.tag_ranges('sel'):
        textbox.tag_add('colortag_' + str(count), SEL_FIRST,SEL_LAST)
        textbox.tag_configure('colortag_' + str(count), foreground=color[1])
        count += 1
    else:
        textbox.config(foreground=color[1])
   
def select_font():
    app.tk.call("tk", "fontchooser", "configure", "-font", textbox["font"], "-command", app.register(font_changed))
    app.tk.call("tk", "fontchooser", "show")
    
    
def SaveFile():
    file_path = filedialog.asksaveasfilename(defaultextension='.*', filetypes=(('Текстовые документы', '*.txt'), ('Все файлы', '*.'),  ('Файлы PrintWord', '*.prtw')))
    f = open(file_path, 'w', encoding='utf-8')
    text = textbox.get('1.0', END)
    f.write(text, color, font)
    f.close()
    

count=0 
app = App()
app.state('zoomed')
app.title('PrintWord 1.4')
app["bg"] = "lavender"
panelFrame = Frame(app, height=25, bg='steelblue')
panelFrame.pack(side='top', fill='x')
label = Label(panelFrame, text='PrintWord                                                                                                                                                                                                                                                                                                                                                                                                                                                    ', bg='steelblue', fg='white')
label.pack()


textFrame = Frame(app, height=1000, width = 800)
textFrame.pack_propagate(False)
textFrame.pack(side='right', expand=1)
textbox = Text(textFrame, height=100, width = 100, font='Colibri 11', wrap=WORD)


scrollbar = Scrollbar(textFrame)
scrollbar['command'] = textbox.yview
scrollbar.pack(side='right', fill='y')

textbox['yscrollcommand'] = scrollbar.set
textbox.pack(side='left', fill='none')




menu = tk.Menu()
file_menu = tk.Menu(menu, tearoff=0)
file_menu.add_command(label='Новый файл', command=NewFile)
file_menu.add_command(label='Открыть', command=LoadFile)
file_menu.add_separator()
file_menu.add_command(label='Сохранить как', command=SaveFile)
menu.add_cascade(label='Файл', menu=file_menu)

view_menu = Menu(menu, tearoff=0)
menu.add_cascade(label='Вид', menu=view_menu)
view_menu_sub = Menu(view_menu, tearoff=0)
view_menu_sub.add_command(label='Светлая', command=(lambda : change_theme('light')))
view_menu_sub.add_command(label='Тёмная', command=(lambda : change_theme('dark')))
view_menu.add_cascade(label='Тема', menu=view_menu_sub)

font_menu_sub = Menu(view_menu, tearoff=0)

view_menu.add_command(label='Шрифт', command=select_font)
view_menu.add_command(label='Цвет', command=select_color)

code_menu = Menu(menu, tearoff=0)

def dev():
    menu.add_cascade(label='Кодировки', menu=code_menu)
    code_menu.add_command(label='UTF-8', command=utf)
    code_menu.add_command(label='ANSI', command=ansi)

view_colors = {'dark':{'text_bg':'gray5', 
  'text_fg':'white'}, 
 'light':{'text_bg':'white', 
  'text_fg':'black'}}

km = Menu(tearoff=0)
km.add_command(label='Вырезать', accelerator="Ctrl+X", command=lambda: app.focus_get().event_generate('<<Cut>>'))
km.add_command(label='Копировать', accelerator="Ctrl+C", command=lambda: app.focus_get().event_generate('<<Copy>>'))
km.add_command(label='Вставить', accelerator="Ctrl+V", command=lambda: app.focus_get().event_generate('<<Paste>>'))
km.add_separator()
km.add_command(label='Выделить всё', accelerator="Ctrl+A", command=select_all)



help_menu = Menu(menu, tearoff=0)
menu.add_cascade(label='Справка', menu=help_menu)

help_menu.add_command(label='Сайт PrintWord', command=help)
help_menu.add_separator()
help_menu.add_command(label='О программе', command=prg)

menu.add_command(label='Выйти', command=app_exit)

app.bind("<Button-3>", popup)



app.config(menu=menu)
app.mainloop()

Ответы

Ответов пока нет.