2016-06-14 3 views
0

4つのエントリを持つtkinterウィンドウを開くプログラムを作成しようとしています。ボタンを押すと、項目のすべてを.txtファイルに上から下に書き込むことになっています。私はそれが私の唯一のように動作するように管理してきましたが、唯一の問題は、すべての4つではなく、作成された.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'ブロックを使用してください。だから、あなたは 'with open( 'file'、 'w')をテキストファイルとして持っていなければなりません:エントリのエントリのために: –

答えて

1

あなたが持っている問題は、ループの各反復でファイルを開いているとの情報が上書きされていることです。ファイルへの書き込みを

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)) 
  • 使用closeまたはflush:ブロックの終了時にファイルをクローズfetchでファイルを開く

    • 使用with

      は、2つのオプションがあります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の理由ではありませんが、あなたのファイル操作に 'with'ブロックを使用しないでください*だけの理由は、あなたがプログラム中でファイルを渡している場合です(または永遠にぶつかる必要があります)。 –

    関連する問題