2014-01-16 37 views
0

我試圖在python中創建聯繫人應用程序。這是相對簡單的,我不認爲它需要很多解釋。我是嘗試使用pickle模塊來存儲元組列表,這些元組是存儲實際聯繫人信息的主要格式。當程序啓動時,它從保存在泡菜中的地方導入列表phonelist。我設置它來處理錯誤,因爲這是程序第一次在機器上運行,並且以前從未在所述機器上醃製過phonelist。我對鹹菜知之甚少。這是我第一次使用它。我遇到的這個問題是,第一次運行程序並首次酸洗清單後,我無法對列表進行更改。每次運行程序時,都要更改列表,關閉程序 - 希望通過在程序結尾處清理列表來保存我的更改 - 然後重新打開它,我會得到與列表相同的列表我第一次醃製這份清單。有「重新酸洗」的問題

from tkinter import * 
    import pickle 
    try: 
     phonelist = pickle.load(open("save.p", "rb")) 
    except FileNotFoundError: 
     print ("First Run Error") 
     phonelist = [['name', 'phone no.', 'email']] 
     pass 

    def whichSelected() : 
     return int(select.curselection()[0]) 

    def addEntry() : 
     phonelist.append ([nameVar.get(), phoneVar.get(), emailVar.get()]) 
     setSelect() 

    def updateEntry() : 
     phonelist[whichSelected()] = [nameVar.get(), phoneVar.get(), emailVar.get()] 
     setSelect() 

    def deleteEntry() : 
     del phonelist[whichSelected()] 
     setSelect() 

    def loadEntry () : 
     name, phone, email = phonelist[whichSelected()] 
     nameVar.set(name) 
     phoneVar.set(phone) 
     emailVar.set(email) 

    def makeWindow() : 
     global nameVar, phoneVar, emailVar, select 
     win = Tk() 

     frame1 = Frame(win) 
     frame1.pack() 

     Label(frame1, text="Name").grid(row=0, column=0, sticky=W) 
     nameVar = StringVar() 
     name = Entry(frame1, textvariable=nameVar) 
     name.grid(row=0, column=1, sticky=W) 

     Label(frame1, text="Phone").grid(row=1, column=0, sticky=W) 
     phoneVar= StringVar() 
     phone= Entry(frame1, textvariable=phoneVar) 
     phone.grid(row=1, column=1, sticky=W) 

     Label(frame1, text="Email").grid(row=2, column=0, sticky=W) 
     emailVar= StringVar() 
     email= Entry(frame1, textvariable=emailVar) 
     email.grid(row=2, column=1, sticky=W) 

     frame2 = Frame(win)  # Row of buttons 
     frame2.pack() 
     b1 = Button(frame2,text=" Add ",command=addEntry) 
     b2 = Button(frame2,text="Update",command=updateEntry) 
     b3 = Button(frame2,text="Delete",command=deleteEntry) 
     b4 = Button(frame2,text=" Load ",command=loadEntry) 
     b1.pack(side=LEFT); b2.pack(side=LEFT) 
     b3.pack(side=LEFT); b4.pack(side=LEFT) 

     frame3 = Frame(win)  # select of names 
     frame3.pack() 
     scroll = Scrollbar(frame3, orient=VERTICAL) 
     select = Listbox(frame3, yscrollcommand=scroll.set, height=6) 
     scroll.config (command=select.yview) 
     scroll.pack(side=RIGHT, fill=Y) 
     select.pack(side=LEFT, fill=BOTH, expand=1) 
     return win 

    def setSelect() : 
     phonelist.sort() 
     select.delete(0,END) 
     for name,phone,email in phonelist : 
      select.insert (END, name) 

    pickle.dump(phonelist, open("save.p", "wb")) 

    win = makeWindow() 
    setSelect() 
    win.mainloop() 
+0

最好的辦法是使用不同的格式來存儲數據;泡菜很糟糕。 – geoffspear

+1

雖然存儲格式與他的問題無關。 –

+0

我正在考慮它。這是迄今爲止我發現的最簡單的方法,所以我希望能夠讓它工作。 – wjjd225

回答

0

它看起來像我在運行該程序之前保存電話列表。您應該將保存步驟移至mainloop()之後。如果要更新mainloop()中的列表,則需要在更新後保存它。您可能希望更加直接,在addEntry(),updateEntry()deleteEntry()末尾保存,以便在程序不規則地退出時,存儲的數據不會與內存中的數據不同步。

0

您的代碼嘗試將任何現有的"save.p"文件讀入phonelist。如果由於文件不存在而失敗,它將初始化爲phonelist。但是,在進入應用程序的主循環之前,它將phonelist中的數據寫入文件(並且根據我所知,永遠不會再次)。這意味着該文件將永遠不會包含除初始化數據以外的任何內容,這些數據將一遍又一遍地讀入和寫出。

您需要添加某種保存命令和/或只有(重新)寫入文件,如果應用程序退出時其中的內容已更改。