是否有保存从tkinter文本小部件输入文本的好方法

问题描述

我正在使用Text小部件中的Tkinter构建收据,它在GUI

enter image description here

中格式正确

但是当我保存时,它变成了这样

enter image description here

文本文件中杂乱无章

如何在文本文件中以GUI格式格式化文本? 这是我的代码

from tkinter import *
from tkinter.filedialog import asksaveasfilename
from tkinter.messageBox import askyesno

# ------------
app = Tk()
# =================== frames ========================
frame1 = Frame(app)
frame1.pack(side=TOP)
# ----
title_label = Label(frame1,text="Facture",font=("courier",40,'bold'))
title_label.pack()
# ----
frame2 = Frame(app,bd=5)
frame2.pack(side=TOP)
# ----
frame3 = Frame(app)
frame3.pack(side=TOP)
# ============================================

# ======--- text field -----======
text_input = Text(frame2,width=47,height=25,bg="aliceblue",fg='black',font=("arial",14,'bold'))
text_input.pack()
# ============ in text field ===============
text_input.insert(END,f'--------------------------------- Facture ---------------------------------\n')
text_input.insert(END,f"\nQty  " + f"Product" + f"                                 PU" + f"                 PV/TVAC" + f'\n')
text_input.insert(END,f"\n1      " + f"FANTA CITRON" + f"                      2500" + f"              2500")
text_input.insert(END,f"\n1      " + f"BUFFET PER HEAD" + f"              10000" + f"            10000")
text_input.insert(END,f"\n1      " + f"MUKEKE GRILLE OIGNONS" + f"16000" + f"            16000" + f'\n')
text_input.insert(END,f"\nTOTAL" + f"                                                                   28500")

# --------- functions ---------
def save():
    filepath = asksaveasfilename(
        defaultextension = "csv",filetypes = [("Text Files","*.csv"),("All Files","*.*")])

    if not filepath:
        return

    with open(filepath,'w') as output_file:
        text = text_input.get('1.0',END)
        output_file.write(text)

def printR():
    pass

def delete():
    text_input.delete('1.0',END)

def exit():
    iExit = askyesno("Attention","You are on your way to quit\nAre you sure you want quit")
    if iExit > 0:
        app.destroy()
# ----------------------------------

# ============---------------===============
# =====--------- Buttons -----------========
save_button = Button(frame3,text="Save",height=3,width=10,command=save)
save_button.grid(row=0,column=0,padx=2)
# ----------------
print_button = Button(frame3,text="Print",command=printR)
print_button.grid(row=0,column=1,padx=2)
# ----------------
delete_button = Button(frame3,text="Delete",command=delete)
delete_button.grid(row=0,column=2,padx=2)
# ----------------
quit_button = Button(frame3,text="Exit",command=exit)
quit_button.grid(row=0,column=3,padx=2)
# ============================================

app.mainloop()   

.................................. .................................. .................................. .........................

解决方法

我认为问题在于仅使用Tkfixedfont字体才能很好地格式化“文本”。

我进行了一些更改,替换了格式类型,删除了粗体和大小,并使用format()函数对齐了文本。

from tkinter import *
from tkinter.filedialog import asksaveasfilename
from tkinter.messagebox import askyesno

# ------------
app = Tk()
# =================== frames ========================
frame1 = Frame(app)
frame1.pack(side=TOP)
# ----
title_label = Label(frame1,text="Facture",font=("courier",40,'bold'))
title_label.pack()
# ----
frame2 = Frame(app,bd=5)
frame2.pack(side=TOP)
# ----
frame3 = Frame(app)
frame3.pack(side=TOP)
# ============================================

# ======--- text field -----======
text_input = Text(frame2,bg="aliceblue",fg='black',font=('TkFixedFont'))
text_input.pack(expand = True)
# ============ in text field ===============
header = "{0} {1} {2}\n".format("-"*35,"Facture","-"*35)
text_input.insert(END,header)
fields = "{0:10}{1:40}{2:20}{3:8}\n".format("Qty","Product","PU","PV/TVAC")

text_input.insert(END,fields)
rs = (("1","FANTA CITRON","2500","2500"),("1","BUFFET PER HEAD","10000","10000"),"MUKEKE GRILLE OIGNONS","16000","16000"),)

for i in rs:
    fields = "{0:10}{1:40}{2:20}{3:10}\n".format(i[0],i[1],i[2],i[3])
    text_input.insert(END,fields)
    
footer = "{0:70}{1}".format("TOTAL","28500")
text_input.insert(END,footer)


# --------- functions ---------
def save():
    filepath = asksaveasfilename(
        defaultextension = "csv",filetypes = [("Text Files","*.csv"),("All Files","*.*")])

    if not filepath:
        return

    with open(filepath,'w') as output_file:
        text = text_input.get('1.0',END)
        output_file.write(text)

def printR():
    pass

def delete():
    text_input.delete('1.0',END)

def exit():
    iExit = askyesno("Attention","You are on your way to quit\nAre you sure you want quit")
    if iExit > 0:
        app.destroy()
# ----------------------------------

# ============---------------===============
# =====--------- Buttons -----------========
save_button = Button(frame3,text="Save",height=3,width=10,command=save)
save_button.grid(row=0,column=0,padx=2)
# ----------------
print_button = Button(frame3,text="Print",command=printR)
print_button.grid(row=0,column=1,padx=2)
# ----------------
delete_button = Button(frame3,text="Delete",command=delete)
delete_button.grid(row=0,column=2,padx=2)
# ----------------
quit_button = Button(frame3,text="Exit",command=exit)
quit_button.grid(row=0,column=3,padx=2)
# ============================================

app.mainloop()  

enter image description here

enter image description here