我试图创建一个程序,打开一个包含4个条目的tkinter窗口。当我按下按钮时,它应该将条目中的所有内容从上到下写入.txt文件。我设法让它像我想的那样工作,但我唯一的问题是它只将最后一行写入创建的.txt文件而不是全部四个。我对使用tkinter仍然有点新意,并且真的不知道如何解决这个问题。
到目前为止,这是我的代码:
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 :(得分:1)
您遇到的问题是您在循环的每次迭代中打开文件并且信息被覆盖。
您有两种选择:
使用with
打开fetch
中的文件,该文件会在退出块时关闭文件:
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
中写入文件:
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()
还有第三个选项,它涉及将指针保存到您结束写入的文件中的位置,并在该点重新启动,但这会使其过于复杂,因为它可以通过更简单的方法轻松解决。