Python Tkinter - 保存画布 - tkinter 崩溃

Posted

技术标签:

【中文标题】Python Tkinter - 保存画布 - tkinter 崩溃【英文标题】:Python Tkinter - save canvas - tkinter crashes 【发布时间】:2012-02-23 08:35:21 【问题描述】:

我正在尝试使用 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"

我不确定这个错误是什么意思 - 以前有人遇到过吗?

我也尝试不使用颜色选项,但无济于事。


编辑 - widgit 精简到基础给出相同的错误:

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 我可以发布完整的代码 - 所有对象都是动态创建的,所以您需要整个脚本对吗?我想自动化这个过程,所以屏幕截图不太理想.. 为简化起见,如果您使用较少的对象运行较短的脚本并查看是否仍然出现错误,这可能会有所帮助。如果是,让我们先修复较短的脚本。如果没有,您可以继续添加回代码,直到您看到什么中断。 哦,好计划,我去看看,谢谢。 看来您使用的是 Windows。通过阅读此:wiki.tcl.tk/949,您可能需要通过 ghostscript 发送输出才能工作。如果你有一个 *nix 系统在工作,你应该可以避免这种情况。 【参考方案1】:

如果您只是将w.postscript() 调用移到mainloop() 调用之上,它似乎可以工作。这意味着错误是由于在 Tkinter GUI 关闭之后调用w.postscript()(因为 mainloop() 一直运行到窗口关闭)。

我注意到这是您的代码和 this example 之间的差异,所以我尝试了一下,发现 .ps 文件在脚本运行后立即创建。

【讨论】:

是的。搞定了。谢谢你。这也很有意义。 有趣的是,如果将 print() 语句放在 mainloop() 之后,它会执行得很好。【参考方案2】:

python 3 更新:

请注意: - 需要在画布上调用 update。 - Canvas 背景未保存。 - 只保存画布的可见部分。

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()

【讨论】:

以上是关于Python Tkinter - 保存画布 - tkinter 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将画布从 tkinter 保存到文件

Python Tkinter刷新画布

Python,Tkinter:如何在可滚动画布上获取坐标

python tkinter 无法在画布上实现提升方法

Python Tkinter。以画布形式打开 BMP 文件

在 Tkinter Python 中创建全局画布