为什么将保存的文本文件加载到 tkinter (python) 的列表框中时,将每个保存的数据输入显示为一行?
Why when loading the saved text file into list-box of tkinter (python) displays every saved data input into one line?
from tkinter import*
import webbrowser
def add():
name = entry1.get()
id = entry2.get()
listbox.insert(END, name+ " : " +id)
def delete():
select = listbox.curselection()
index = select[0]
Listbox.delete(index)
def save():
list1 = list(listbox.get(0,END))
f = open("file.txt","w")
f.writelines(str(list1))
f.close()
read = open("file.txt","r")
data_list = read.readlines()
read.close()
data_list = [data.rstrip() for data in data_list]
win = Tk()
win.title("Class")
frame1=Frame(win)
frame2=Frame(win)
frame1.pack()
frame2.pack()
label1 = Label(frame1,text="Name : ")
label1.grid(row=0,column=0)
label2 = Label(frame1,text="Id : ")
label2.grid(row=1,column=0)
name = StringVar()
entry1 = Entry(frame1,textvariable=name)
entry1.grid(row=0,column=1)
id = StringVar()
entry2 = Entry(frame1,textvariable=id)
entry2.grid(row=1,column=1)
scrollbar = Scrollbar(frame2,orient=VERTICAL)
listbox = Listbox(frame2,selectmode=EXTENDED,yscrollcommand=scrollbar.set,width=60)
listbox.pack()
scrollbar.config(command=listbox)
for item in data_list:
listbox.insert(END,item)
button1 = Button(frame2,text="Add",command=add)
button1.pack()
button2 = Button(frame2,text="Delete",command=delete)
button2.pack()
button3 = Button(frame2,text="Save to File",command=save)
button3.pack()
win.mainloop()
[请打开并查看下面上传的屏幕截图,以便更好地理解问题]
第一次执行应用程序时
Screenshot of opening application for 1st time
1. 添加"Mike : 11"和"Bob : 22"。这里两者都在 separate lines 中。
2. 保存文件并关闭应用程序。
正在重新启动应用程序
Screenshot of opening application for 2nd time
1. 为什么 Mike 和 Bob 的数据是一样的,我怎样才能让这个东西在不同的行中加载
(完全像:
迈克:11
鲍勃:22
)
两种解决方案:
- 更改将文件数据放入
Listbox
的方式。
- 更改将它们保存到文件的方式。
对于第一个解决方案,因为你用列表 format.While 保存了一个字符串,你读取了这个保存的文件,字符串将是:
您需要将字符串更改为 list.An 简单方法:
import ast
....
read = open("file.txt","r")
data_list = ast.literal_eval(read.read())
read.close()
或者使用一些字符串处理operation.That有点复杂。
对于第二种方案,只要改变你在每一行保存it.add一个\n
的方式。(因为你使用.readlines()
来读取文件。)
def save():
with open("file.txt","w") as f:
for i in listbox.get(0,END):
f.write(i+"\n")
from tkinter import*
import webbrowser
def add():
name = entry1.get()
id = entry2.get()
listbox.insert(END, name+ " : " +id)
def delete():
select = listbox.curselection()
index = select[0]
Listbox.delete(index)
def save():
list1 = list(listbox.get(0,END))
f = open("file.txt","w")
f.writelines(str(list1))
f.close()
read = open("file.txt","r")
data_list = read.readlines()
read.close()
data_list = [data.rstrip() for data in data_list]
win = Tk()
win.title("Class")
frame1=Frame(win)
frame2=Frame(win)
frame1.pack()
frame2.pack()
label1 = Label(frame1,text="Name : ")
label1.grid(row=0,column=0)
label2 = Label(frame1,text="Id : ")
label2.grid(row=1,column=0)
name = StringVar()
entry1 = Entry(frame1,textvariable=name)
entry1.grid(row=0,column=1)
id = StringVar()
entry2 = Entry(frame1,textvariable=id)
entry2.grid(row=1,column=1)
scrollbar = Scrollbar(frame2,orient=VERTICAL)
listbox = Listbox(frame2,selectmode=EXTENDED,yscrollcommand=scrollbar.set,width=60)
listbox.pack()
scrollbar.config(command=listbox)
for item in data_list:
listbox.insert(END,item)
button1 = Button(frame2,text="Add",command=add)
button1.pack()
button2 = Button(frame2,text="Delete",command=delete)
button2.pack()
button3 = Button(frame2,text="Save to File",command=save)
button3.pack()
win.mainloop()
[请打开并查看下面上传的屏幕截图,以便更好地理解问题]
第一次执行应用程序时
Screenshot of opening application for 1st time
1. 添加"Mike : 11"和"Bob : 22"。这里两者都在 separate lines 中。
2. 保存文件并关闭应用程序。
正在重新启动应用程序
Screenshot of opening application for 2nd time
1. 为什么 Mike 和 Bob 的数据是一样的,我怎样才能让这个东西在不同的行中加载
(完全像:
迈克:11
鲍勃:22
)
两种解决方案:
- 更改将文件数据放入
Listbox
的方式。 - 更改将它们保存到文件的方式。
对于第一个解决方案,因为你用列表 format.While 保存了一个字符串,你读取了这个保存的文件,字符串将是:
您需要将字符串更改为 list.An 简单方法:
import ast
....
read = open("file.txt","r")
data_list = ast.literal_eval(read.read())
read.close()
或者使用一些字符串处理operation.That有点复杂。
对于第二种方案,只要改变你在每一行保存it.add一个\n
的方式。(因为你使用.readlines()
来读取文件。)
def save():
with open("file.txt","w") as f:
for i in listbox.get(0,END):
f.write(i+"\n")