打印Python Tkinter输出
我正在尝试打印一个Python tkinter画布的内容。我试过用画布的postscript方法来创建一个postscript文件,但结果却是空白页。我知道这是因为我在画布里嵌入了小部件,而这些小部件在postscript方法中无法被渲染。
在我重新编写程序,创建一个更适合打印的布局之前,有人能建议我该如何解决这个问题吗?我读过的所有编程书籍在处理输出到打印机的问题时,都是有点含糊其辞,类似于:“这是个复杂的问题,需要和操作系统进行交互。”我也很难找到相关的资源,因为网上有很多关于在屏幕上打印的内容。
我使用的是Python 2.6,操作系统是Ubuntu 9.04。
3 个回答
我觉得你可能快到Tkinter的极限了。如果不是因为那些小部件,另一种方法是用PIL的图像绘制对象来画同样的图像,因为这两者的使用方法很相似。
还有一种比较“hacky”的解决办法,就是用PIL里的ImageGrab功能,程序化地截取你想要的窗口区域的屏幕图像。
wxPython是一个不错的替代选择。个人来说,我更喜欢Qt,它在打印支持方面非常出色。而且它的图形视图框架也很棒。
这个问题确实挺复杂的,因为它涉及到和操作系统的互动。(抱歉,我忍不住了!)
把画布转换成PostScript的方案只适用于在画布上绘制的内容——它不处理嵌入的窗口。有一些库可以把画布转换成PDF,但我没有使用过这些库,也不知道它们是否能处理嵌入的窗口(我猜应该不能)。
还有一个叫做 pdflib 的东西,这是一个商业的C语言库,可以和Python和Tcl(也就是Tkinter)结合使用。我对这个库没有经验,我猜它也可能不处理嵌入的窗口。我觉得它的功能比较基础——提供一些命令来创建页面、页眉、页脚等等。
这个问题在Tk中确实存在;一直以来都是,可能将来也会一直存在,因为似乎没有太多人有兴趣或者需求去以跨平台的方式解决这个问题。
原来在导出后处理文件之前,你需要先更新画布。可以这样做:
from Tkinter import *
root = Tk()
canvas = Canvas(bg='white', width = 200, height = 200)
canvas.pack()
canvas.create_line(0, 0, 199, 199, fill="blue", width = 5)
canvas.create_line(0, 199, 199, 0, fill="blue", width = 5)
canvas.update()
canvas.postscript(file = "x.ps")
root.mainloop()
感谢Rio在这里提供的解决办法。