首页 > 解决方案 > 第二次写入文件的问题,Python3

问题描述

我已经创建了一个电话簿,当我tkinkerPython 3.6 人员添加到电话簿时,它会将其保存到文件中。

当我再次加载程序时,它会按原样加载文件。如果我在第一次运行时添加 2 人,一切正常。第二次运行,我添加了一个人,它在索引 1 处添加了一个空行,并按应有的方式添加了下面的人。第三次运行,我添加了一个人,它在索引 1 处添加了一个新行,在列表中添加了一个人。现在我得到 2 个空行。

我不知道为什么它会在索引 1 处创建一个空白空间。它不应该这样做。

这是代码,评论是瑞典语,对此感到抱歉。

我如何写入文件在函数中lägg_till() 它会在您第一次运行时自动创建 kontakter.txt。“Lägg until”表示在瑞典添加,“Avsluta”表示退出程序。

from tkinter import *
import os.path


root = Tk()
root.geometry("640x640+200+100")
root.title("Telefon listan")

def avsluta():
    quit()

def spara():
    #Spara kontakter till fil.
    name = entry_1.get()
    mobil = entry_2.get()
    if name == "" or mobil == "" :
        pass
    else:
        with open("kontakter.txt","w") as file:
            file.write("\n".join(kontakter.get(0,END)))

def ta_bort():
    # Ta bort kontakter,genom att välja index av element och sparar värdet i variabel index.
    index = kontakter.curselection()
    print(index)
    kontakter.delete(index)

def lägg_till():
    # Ta inmatade värden från name,mobil och spara i kontakter.
    # Använder .get() för att hämta
    name = entry_1.get()
    mobil = entry_2.get().replace(" ", "") # Använder replace för att rensa whitespace
    # Varning när alla värden inte är ifyllda
    if name == "" or mobil == "" :
        label_error.config(text="Alla fälten är inte ifyllda")

    else:
    # trycka in dessa i kontakter med .insert() END för slutet av listan, dvs index "kan vara 0,1,2,3"
        #Rensar error fältet innan man lägger till kontakten
        label_error.config(text="")
        kontakter.insert(END,name + " - " + mobil)
        # Rensa fältet efter lägg till
        entry_1.delete(0,END)
        entry_2.delete(0,END)
        kontakt = kontakter.get(0,END)
        with open("kontakter.txt","w") as file:
            file.write("\n".join(kontakt))


def uppdatera():
    # Hämta det markerade data
    index = kontakter.curselection()
    name = entry_1.get()
    mobil = entry_2.get()
    # Varning när alla värden inte är ifyllda
    if name == "" or mobil == "" :
        label_error.config(text="Alla fälten är inte ifyllda")
    else:
        # trycka in dessa i kontakter med .insert() END för slutet av listan, dvs index "kan vara 0,1,2,3"
        #Rensar error fältet innan man lägger till kontakten
        label_error.config(text="")
        # Raderar det ifyllda data
        kontakter.delete(index)
        #Skriver nytt
        kontakter.insert(index,name + "-" + mobil)
        entry_1.delete(0,END)
        entry_2.delete(0,END)

# Skapar frame
#Namn
fram_1 = Frame(root)
fram_1.pack()
#Mobil
fram_2 = Frame(root)
fram_2.pack()
#Knappar
fram_3 = Frame(root)
fram_3.pack()
# Listbox
fram_4 = Frame(root)
fram_4.pack()

#Skapar label
#Namn
label_1 = Label(fram_1,text="Name:")
label_1.grid(row=0, column=0)
#Mobil
label_2 = Label(fram_2,text="Mobil:")
label_2.grid(row=1,column=0)


# Skapar entry
#namn
entry_1 = Entry(fram_1)
entry_1.grid(row=0,column=1)
#Mobil
entry_2 = Entry(fram_2)
entry_2.grid(row=1,column=2,)

# Kolla om filen finns, annars skapa den, behöver importera os.path
if not os.path.exists("kontakter.txt"):
    open('kontakter.txt', 'w').close()
else:
    pass


# Läsa från fil
data = []
with open("kontakter.txt" ,"r") as fil:
    for line in fil:
        data += [line]


# Listbox
kontakter = Listbox(fram_4,height=8,width=40,bg="pink")
kontakter.grid(row=0,column=0)
# Lägger till kontakter , första värdet är index följt av värde,
kontakter.insert(END,)

#Läsa in från fil
for i in range(len(data)):
    kontakter.insert(i+0 , data[i])

# Error
label_error = Label(root,text="",fg="red")
label_error.pack()

# Knappar
# knapp Lägg till
button_1 = Button(fram_3,text="Lägg till",command=lägg_till)
button_1.grid(row=0,column=0)
# knapp edit
button_2 = Button(fram_3,text="Uppdatera",command=uppdatera)
button_2.grid(row=0,column=1)
# Knapp delete
button_3 = Button(fram_3,text="Radera",command=ta_bort)
button_3.grid(row=0,column=2)
# Knapp avsluta
button_4 = Button(fram_3,text="Avsluta",command=avsluta)
button_4.grid(row=0,column=3)
button_5 = Button(fram_3,text="Spara",command=spara)
button_5.grid(row=0,column=4)


root.attributes("-topmost", True)
root.mainloop()

标签: python

解决方案


lägg_till()当您打开文件时在里面使用ab而不是w

with open("kontakter.txt","ab") as file:
        file.write("\n".join(kontakt))

推荐阅读