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 崩溃的主要内容,如果未能解决你的问题,请参考以下文章