【问题标题】:Problems with tkinter textbox output into a .txt filetkinter 文本框输出到 .txt 文件的问题
【发布时间】:2016-06-14 13:15:44
【问题描述】:

我正在尝试创建一个程序,该程序可以打开一个包含 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()

【问题讨论】:

  • 每次循环都打开要写入的文件。不要那样做。另外,使用with 块。所以你应该有with open('file', 'w') as textfile: for entry in entries: ...

标签: python tkinter python-3.5


【解决方案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))
    
  • 使用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()
    

还有第三个选项,它涉及将指针保存到文件中您结束写入的位置并在该位置重新启动,但这会使它过于复杂,因为它可以通过更简单的方法轻松解决。

【讨论】:

  • 你错了原因 - 它与不关闭文件/刷新缓冲区无关,而与 OP 打开文件 4 次这一事实有关,并简单地重写已写入的内容。
  • 不是投反对票的理由,但 FWIW 唯一的原因是,您不应该在文件操作中使用 with 块,如果您在整个过程中传递文件程序(或者你需要一个永远闲逛)。
  • 啊好吧!我的坏然后哈哈解决方案是正确的,但出于不同的原因哈哈哈我会编辑开始文本然后
  • 很多。不确定是否值得担心指针和文件位置,因为当您以“w”模式打开文件时,它实际上会截断文件,所以...
  • 请注意,即使有了这个改进的版本,“test2.txt”也会在每次调用fetch 时被覆盖。这可能(也可能不是)是期望的行为。如果不需要,可以以“a”模式打开文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
相关资源
最近更新 更多