我真的想学习如何使用似乎可用的酷格式提交问题,但对我来说,如何做到这一点并不明显....
我的问题:我的计划是将“birdlist”(从列表框输出)打印到文件“Plain.txt”然后 删除该文件,以便在程序退出后使其不可用。这个问题是由于某些原因“Plain.txt”在打印开始之前就被删除了......
下面的代码工作得很好,只要我不取消注释最后两行以删除“Plain.txt ...我也尝试使用存在的”tempfile“函数... .it不喜欢我将格式化的字符串数据发送到临时文件。有没有办法做到这一点,这足以让我的鸟脑理解???
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)
答案 0 :(得分:2)
问题是Windows ShellExecute
只会启动该进程然后返回给您。它不会等到打印过程结束。
如果直接使用Windows API,您可以使用ShellExecuteEx
功能等待,但它似乎不在win32api中。
如果用户暂时使用您的应用程序,您可以保留该文件的记录并稍后将其删除。
或者您可以编写自己的打印代码,这样您就不必将其交给其他人。见Print to standard printer from Python?
答案 1 :(得分:0)
我正在写一个类似的问题。我在for循环下调用win32api.ShellExecute()
,打印文件列表并在之后删除它们。我开始在屏幕上收到Notepad.exe弹出消息,告诉我该文件不存在。在插入一些raw_input("press enter")
语句进行调试之后,我发现我需要延迟以避免过快删除文件,因此在time.sleep(.25)
之后添加ShellExecute("print",...)
行似乎可以解决问题并修复它
可能不是最干净的方法,但我找不到任何更优雅的Python打印,更好地处理它。
我一直在考虑的一件事是使用在成功的ShellExecute()
电话中返回的“实例句柄ID”。如果它的> 32和> = 0呼叫成功。如果ShellExecute在该范围内返回,可能只运行删除,而不是尝试使用任意time.sleep
值。唯一的问题是,如果它不成功则会返回异常,并且会超出程序。
希望这有帮助!