在 tkinter 中保存文件未正确保存

Saving file in tkinter not getting saved properly

我想保存我在列表框中输入的所有文本。 “my_list”是这里的列表框。 但是当我保存我的文件时,我得到了元组形式的输出,如下所示:

("Some","Random","Values")

下面是 python 代码。我已经添加了评论。 add_items 函数将数据添加到输入框中。 savefile函数应该是保存输入框中输入的所有数据(每条输入必须换行)

from tkinter import *
from tkinter.font import Font
from tkinter import filedialog


root = Tk()
root.title('TODO List!')
root.geometry("500x500")
name = StringVar()

############### Fonts ################

my_font = Font(
    family="Brush Script MT",
    size=30,
    weight="bold")

################# Frame #################
my_frame = Frame(root)
my_frame.pack(pady=10)


################# List Box #############
my_list = Listbox(my_frame,
           font=my_font,
           width=25,
           height=5,
           bg="SystemButtonFace",
           bd=0,
           fg="#464646",
           highlightthickness=0,
           selectbackground="grey",
           activestyle="none")

my_list.pack(side=LEFT, fill=BOTH)

############### Dummy List ##################

#stuff = ["Do daily Checkin","Do Event checkin","Complete Daily Task","Complete Weekly Task","Take a break"]

############# Add dummmy list to list box ##############
#for item in stuff:
 #   my_list.insert(END, item)
    
################# Ceate Scrollbar ###########################
my_scrollbar= Scrollbar(my_frame)
my_scrollbar.pack(side=RIGHT, fill=BOTH)

#################### Add Scrollbar ######################
my_list.config(yscrollcommand=my_scrollbar.set)
my_scrollbar.config(command=my_list.yview)

################### ADD item entry box#################
my_entry = Entry(root, font=("Helvetica", 24),width=24, textvariable=name)
my_entry.pack(pady=20)

######################## Crete button frame ##########
button_frame=Frame(root)
button_frame.pack(pady=20)


##################### Funnctions ###################


def add_item():
    my_list.insert(END, my_entry.get())
    name1 = name.get()
    my_entry.delete(0, END)

 

def saveFile():
    file = filedialog.asksaveasfile(initialdir="C:\Users\Deepu John\OneDrive\Deepu 2020\Projects\rough",
                                    defaultextension='.txt',
                                    filetypes=[
                                        ("Text file",".txt"),
                                        ("HTML file", ".html"),
                                        ("All files", ".*"),
                                    ])
    if file is None:
        return
    #fob = open(file,'w')    
    filetext = str(my_list.get('1', 'end'))
    file.write(filetext)
    file.close()
    
def delete_list():
    my_list.delete(0,END)


################# Add Buttons ################


add_button = Button(button_frame, text="Add Item",command=add_item)
save_button = Button(button_frame, text="Save",width=8,command=saveFile)

add_button.grid(row=0,column=1, padx=20)  
save_button.grid(row=0,column=2,padx=5) 

root.mainloop()      

我希望每个值都在一个新行中。像这样:

Some
Random
Values

我该怎么做?

主要部分是 listbox.get(first, last) returns 一个元组,因此您可以使用 .join 字符串方法创建一个字符串,其中元组中的每个项目都由给定的字符串分隔:

'\n'.join(listbox.get('0', 'end'))

完整示例:

from tkinter import Tk, Entry, Listbox, Button


def add_item(event=None):
    item = entry.get() or None
    entry.delete('0', 'end')
    listbox.insert('end', item)


def save_listbox():
    """the main part:
    as `listbox.get(first, last)` returns a tuple
    one can simply use the `.join` method
    to create a string where each item is separated
    by the given string"""
    
    data = '\n'.join(listbox.get('0', 'end'))
    with open('my_list.txt', 'w') as file:
        file.write(data)


root = Tk()

entry = Entry(root)
entry.pack(padx=10, pady=10)
entry.bind('<Return>', add_item)

listbox = Listbox(root)
listbox.pack(padx=10, pady=10)

button = Button(root, text='Save', command=save_listbox)
button.pack(padx=10, pady=10)

root.mainloop()

还有:
我强烈建议在导入内容时不要使用通配符 (*),您应该导入您需要的内容,例如from module import Class1, func_1, var_2 等等或导入整个模块:import module 然后你也可以使用别名:import module as md 或类似的东西,关键是不要导入所有东西,除非你真的知道你在做什么;名称冲突是问题所在。

这是一项非常简单的任务。 在保存文件的位置,写入此代码:

newlist = []
for item in mylist.get(0, END):
newlist.append(item)

f = open(file, 'w')
for line in newlist:
f.write(line+'\n')
f.close()

要了解有关在 tkinter 中保存文件的更多信息或使其更容易,您可以在 GitHub 上查看我的 txtopp 存储库。这是我制作的模块:

https://github.com/armaanPYTHON/txt-file-management-module