Python Tkinter - 保存画布 - tkinter 崩溃

3

我正在尝试使用PostScript方法保存我的画布,但Tkinter崩溃了...

w.postscript(file="my_drawing.ps", colormode='color')

获取异常:

w.postscript(file="my_drawing.ps", colormode='color')
File "C:\python27\lib\lib-tk\Tkinter.py", line 2307, in postscript
self._options(cnf, kw))
_tkinter.TclError: invalid command name ".57816328L"

我不确定这个错误的含义 - 有人遇到过吗?

我也尝试了不带颜色选项,但是没有用。


编辑 - 简化小部件仍然会出现相同的错误:

from Tkinter import *
master = Tk()
w = Canvas(master, width=1000, height=1000)
w.pack()
w.create_oval(450,550,550,450)
mainloop()
w.postscript(file="my_drawing.ps")

这段代码对我来说可行,使用了椭圆形、文本和矩形。我怀疑问题与本地配置有关。话虽如此,如果您想发布完整的画布代码,我很乐意在此执行以查看是否能够重现错误。如果您只需要一张图片,您可以截屏吗? - ABS
简化一下,如果你运行一个较短的脚本并且只有少量对象,看看是否仍然出现错误会有所帮助。如果是,我们先修复这个较短的脚本。如果不是,你可以继续添加代码,直到找到问题所在。 - ABS
@ABS 我添加了最基本的内容,但它仍然崩溃了 - 我猜这是一个本地实现问题 - 我将在几个小时后到达办公室时在我的工作机器上检查它。也许需要从不同的来源重新安装Tkinter? - Jay Gattuso
1
看起来您正在使用Windows。从阅读此文:http://wiki.tcl.tk/949,您可能需要通过ghostscript发送输出以使其工作。如果您在工作中有一个*nix系统,那么您应该能够避免这种情况。 - ABS
啊,我在Windows上。好的,这是一个要跟进的线程,看起来对我来说有点复杂,但我会看看能否理解它。我发现的另一个解决方法是将绘图移植到PIL - 这可能会少些痛苦...谢谢你的帮助。 - Jay Gattuso
显示剩余3条评论
2个回答

4
如果您只是简单地将w.postscript()调用移动到mainloop()调用上面,似乎可以工作。这意味着错误是由于在关闭Tkinter GUI后调用w.postscript()(因为mainloop()一直运行直到窗口关闭)引起的。
我注意到这是您的代码与此示例之间的一个区别,所以我尝试了一下,发现.ps文件是在脚本运行时就创建的。

太棒了,做得好。谢谢你。而且这也很有道理。 - Jay Gattuso
有趣的是,如果您在mainloop()之后放置print()语句,则可以正常执行它们。 - gary

0

Python 3 更新:

请注意:
- 必须在画布上调用 update 方法。
- 画布背景不会被保存。
- 只有画布可见部分会被保存。

import tkinter as tk
import random

COLORS = ["white", "black", "red", "green", "blue", "cyan", "yellow", "magenta"]

root = tk.Tk()

cv = Canvas(root, width=1000, height=1000, bg='cyan')
cv.pack()

for _ in range(1000):
    coordinates = [random.randrange(0, 1000) for _ in range(4)]
    cv.create_oval(*coordinates, outline=random.choice(COLORS))

cv.update()
cv.postscript(file="my_drawing.ps")

mainloop()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接