2016-06-14 60 views
0

我試圖創建一個程序,它打開一個帶4個條目的tkinter窗口。當我按下一個按鈕時,它應該從上到下將條目中的所有內容寫入.txt文件。我已經設法使它像我想要的那樣工作,但我唯一的問題是它只將最後一行寫入創建的.txt文件而不是全部四行。我對tkinter的工作還很陌生,並不知道如何解決這個問題。tkinter文本輸出到.txt文件中的問題

這是我到目前爲止的代碼:

import os 

from tkinter import * 
fields = "Vorname", "Nachname", "Beruf", "Wohnort" 

def fetch(entries): 
    for entry in entries: 
     field = entry[0] 
     text = entry[1].get() 
     textfile = open("test2.txt", "w") 
     textfile.write('%s: "%s"' % (field, text)) 

def makeform(root, fields): 
    entries = [] 
    for field in fields: 
     row = Frame(root) 
     lab = Label(row, width=15, text=field, anchor='w') 
     ent = Entry(row) 
     row.pack(side=TOP, fill=X, padx=5, pady=5) 
     lab.pack(side=LEFT) 
     ent.pack(side=RIGHT, expand=YES, fill=X) 
     entries.append((field, ent)) 
    return entries 

if __name__ == "__main__": 
    root = Tk() 
    ents = makeform(root, fields) 
    root.bind("<Return>", (lambda event, e=ents: fetch(e))) 
    b1 = Button(root, text="Drucken", 
      command=(lambda e=ents: fetch(e))) 
    b1.pack(side=LEFT, padx=5, pady=5) 
    b2 = Button(root, text="Abbrechen", command=root.destroy) 
    b2.pack(side=LEFT, padx=5, pady=5) 
    root.mainloop() 
+0

您正在打開文件以便每次在循環中寫入。不要這樣做。另外,使用'with'塊。所以你應該把'open'('file','w')作爲文本文件:在條目中輸入:...' –

回答

1

你的問題是,你在每次循環打開文件和信息被覆蓋。

你有兩個選擇:

  • 使用withfetch其中逢塊的出口文件,打開文件:

    def fetch(entries): 
        with open("test2.txt", "w") as textfile: 
         for entry in entries: 
          field = entry[0] 
          text = entry[1].get() 
          textfile.write('%s: "%s"\n' % (field, text)) 
    
  • 使用closeflush寫入文件在fetch

    def fetch(entries): 
        textfile = open("test2.txt", "w") 
        for entry in entries: 
         field = entry[0] 
         text = entry[1].get() 
         textfile.write('%s: "%s"\n' % (field, text)) 
        textfile.close() 
    

還有第三個選項,其中包括將指針保存到文件中的位置,該位置已結束寫入並重新啓動,但由於可以使用更簡單的方法輕鬆解決該問題,因此會使其過度複雜化。

+0

答案有問題嗎? – Mixone

+1

你錯誤的原因 - 它與沒有關閉文件/刷新緩衝區沒有任何關係,以及與OP打開文件* 4次的事實有關的所有事情,並且簡單地寫入已經寫入的內容。 –

+1

不是一個downvote的原因,但是FWIW只有*你不應該爲你的文件操作使用'with'塊的原因是,如果你在整個程序中傳遞一個文件(或者你需要一個文件永遠存在)。 –