0

我真的很想学习如何使用似乎可用的很酷的格式提交问题,但对我来说如何做到这一点并不明显......

我的问题:我的计划是将“birdlist”(从列表框输出)打印到文件“Plain.txt”,然后删除该文件,使其在程序退出后不可用。问题在于,由于某种原因,“Plain.txt”在打印开始之前就被删除了……

只要我不取消注释最后两行以删除“Plain.txt ...”,下面的代码就可以很好地工作...我也尝试使用存在的“tempfile”函数...确实如此不像我将格式化的字符串数据发送到临时文件。有没有一种方法可以简单到让我的鸟脑理解???

text_file = open("Plain.txt","w")
for name,place,time in birdlist:
    text_file.write('{0:30}\t {1:>5}\t {2:10}\n'.format(name, place, time))
win32api.ShellExecute (0,"print",'Plain.txt','/d:"%s"' % win32print.GetDefaultPrinter (),".",0)
text_file.close()
#os.unlink(text_file.name)
#os.path.exists(text_file.name)
4

2 回答 2

2

问题是 WindowsShellExecute只会启动该过程,然后返回给您。它不会等到打印过程完成。

如果直接使用windows API,可以等待使用该ShellExecuteEx函数,但是win32api中似乎没有。

如果用户将使用您的应用程序一段时间,您可以保留文件记录并稍后将其删除。

或者您可以编写自己的打印代码,这样您就不必将其交给其他人。请参阅从 Python 打印到标准打印机?

于 2013-07-13T00:52:14.847 回答
0

我正在编写的程序有类似的问题。win32api.ShellExecute()我在 for 循环下调用,打印文件列表并在之后删除它们。我开始在屏幕上收到 Notepad.exe 弹出消息,告诉我该文件不存在。在插入一些raw_input("press enter")语句进行调试后,我发现我需要延迟以避免删除文件过快,所以time.sleep(.25)在我之后添加一行ShellExecute("print",...)似乎可以解决问题并修复它。

可能不是最干净的方法,但我找不到任何更优雅的 Python 打印来更好地处理它。

我一直在考虑的一件事是使用成功ShellExecute()调用时返回的“实例句柄 ID”。如果它 > 32 且 >= 0,则调用成功。如果 ShellExecute 在该范围内返回,也许只运行删除,而不是尝试使用任意time.sleep值。唯一的问题是,如果它不成功并退出程序,它会返回一个异常。

希望这可以帮助!

于 2013-08-02T19:06:56.450 回答