【问题标题】:Problem writing a file, the file doesn’t get written until I close the program - Tkinter Python 3 - example code [duplicate]写入文件时出现问题,在我关闭程序之前不会写入文件 - Tkinter Python 3 - 示例代码 [重复]
【发布时间】:2019-11-03 17:03:56
【问题描述】:

编辑: 是的,我有一个与下面的链接类似的问题,但我不认为这是一个重复的问题,因为不幸的是,答案并没有解决我的问题。 How come a file doesn't get written until I stop the program?

我尝试了 f=open(file,w) f.close() f.flush() os.fsync(f) 并没有帮助。另请注意,我正在使用 with 语句,它应该完成与 Python 从 with 块退出时相同的事情,文件会自动关闭。

在我关闭程序之前,文件的所有内容仍然没有被写入。

我现在也注意到这不是我最初认为的 Tkinter 问题,如果没有 Tkinter GUI,问题就会存在。可能与lxml.etree有关

下面的原始问题

我尝试为 XML 转换器脚本制作一个简单的 GUI。

我在保存文件时遇到问题。在我关闭或销毁() Tkinter 程序之前,该文件不会被写入。谁能解释为什么会发生这种情况以及如何解决?我想在 Tkinter 窗口运行时写入文件。

请在下面找到代码:

from tkinter import *
import lxml.etree as ET
import tkinter.filedialog as fdialog

def mfileopen():
    global xml_file
    xml_file = fdialog.askopenfile()
    Label(text=xml_file) .pack()

def dropdown_select(selection):
    global xslt_file
    if selection == "Stylesheet 1":
        xslt_file = "stylesheet1.xsl"

    elif selection == "Stylesheet 2":
        xslt_file = "stylesheet2.xsl"

def convert_xml(xslt_file, input_xml):
    dom = ET.parse(input_xml)
    xslt = ET.parse(xslt_file)
    transform = ET.XSLT(xslt)
    newdom = transform(dom)
    write_file(newdom)

def write_file(csv_file):
    with open("output.csv", "w") as f:
        f.write(str(csv_file))

OPTIONS = [
"Stylesheet 1",
"Stylesheet 2",
]

master = Tk()

Label (text="Open XML file and then Choose XSLT Code from the dorpdown menu and press Load XSLT. Finally press Convert XML") .pack()

button = Button(text="Open XML File", width=30, command=mfileopen)
button.pack()

variable = StringVar(master)
variable.set(OPTIONS[0]) # default value

w = OptionMenu(master, variable, *OPTIONS)
w.pack()

button = Button(master, text="Load XSLT", command=lambda: dropdown_select(variable.get()))
button.pack()

button = Button(master, text="Convert XML", command=lambda: convert_xml(xslt_file, xml_file))
button.pack()

master.mainloop()

【问题讨论】:

  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。这段代码有很多多余的行。
  • 还要小心全局变量。当调用convert_xml(xslt_file, xml_file) 时,可能的xslt_filexml_file 不存在。
  • 同时,尝试跟踪执行:插入并行的print 语句以在您写入文件时转储​​行。我的怀疑是你根本没有填满缓冲区。在你写的时候在输出流上尝试flush
  • @Prune 谢谢你的建议。 Print 工作正常,打印所有内容,我尝试了 f.flush() ,不幸的是,它没有帮助。另请注意,我正在使用 with 语句,它应该完成与 Python 从 with 块退出时相同的事情,文件会自动关闭。
  • @Error - Syntactical Remorse 感谢您指出全局变量,但在这种情况下这不是问题。

标签: python tkinter


【解决方案1】:

您需要f.close() 将文件写入缓冲区刷新到文件中。或者在您的情况下,您可能只想做一个f.flush(); os.fsync();,这样您就可以使用打开的文件句柄继续循环。

别忘了import os

欲了解更多信息:How come a file doesn't get written until I stop the program?

【讨论】:

  • 感谢您的建议。我试过f=open(file,w)f.close()f.flush()os.fsync(f),不幸的是它没有帮助。
  • @Tim 在你写信后添加f.flush() RIGHT。 (在open 语句内。另外,您不需要f.close(),因为您有with 语句。
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 2017-03-21
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多