2016-06-14 36 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'块的原因是,如果你在整个程序中传递一个文件(或者你需要一个文件永远存在)。 –