【问题标题】:Python - Tkinter saved PS images - can't open themPython - Tkinter 保存的 PS 图像 - 无法打开它们
【发布时间】:2012-03-19 09:49:01
【问题描述】:

我已经编写了一个非常复杂的脚本来创建图形 - 通过 Tkinter 模块。

它按我的预期工作,并将画布保存为 PostScript 文件。

只是,我无法以任何方式渲染 PS 文件。完全没有。

当我决定使用 Tkinter 时,我非常有信心,我可以对 PS 文件做一些事情来将它们变成一些更标准的格式。

我看过一些建议将绘图移植到 PIL 的教程,这可能可行,但将所有动态对象从 tk 移植到 PIL 将是一项艰巨的任务。

我想知道是否有人有更快/更脏的方法将小部件窗口中的像素转换为图像文件。

或任何查看/光栅化 PS 文件的 Windows 方法?如果有兴趣,我可以在某处放置一个示例 PS 文件吗? (python代码比较复杂,需要3个MySQL表来拉数据)

我正在尝试从这里使用截屏方法:http://mail.python.org/pipermail/image-sig/2003-May/002292.html

并且努力使事情按正确的顺序排列。

tkinter 代码:

def drawCircles(MasterList,buildlist):
master = Tk()
w = Canvas(master, width=1000, height=1000)
w.config(bg='white')
coordsMain = MasterList[6:]
textMain = MasterList[0:2]
w.pack()
w.create_oval(*coordsMain, width=3, fill = "ivory3")
masterLabel = "Source PUID\n" + str(MasterList[3]) + "\nFiles = " + str(MasterList[4])
w.create_text(*textMain, text=masterLabel, justify = "center", font=("Helvetica", 16))
for i in buildlist:
 coordsSet = i[6:10]
 w.create_oval(*coordsSet, width=3, fill = i[5])
 set_label = i[3] + "\n" + str(i[4]) + "%"
 l=w.create_text(4,4, text=set_label, justify = "center", fill="white", font=("Helvetica", 16))
 a,b,c,d= (w.bbox(l))
 bboxArea =(c-a)*(d-b)   
 a,b,c,d = i[6:10]
 circleArea = (c-a)*(d-b)
 if bboxArea>circleArea:
  textSet = i[10:]
  j=w.create_text(*textSet, text=set_label, justify = "center", font=("Helvetica", 16))
  r=w.create_rectangle(w.bbox(j),fill="white", width=0)
 else:
  textSet = i[:2]
  j=w.create_text(*textSet, text=set_label, justify = "center", font=("Helvetica", 16))
  r=w.create_rectangle(w.bbox(j),fill=i[5], width=0) 
 w.tag_lower(r,j)
 PUID = str(MasterList[3])
 PUID = PUID.replace('/', '-')
 filename = "\images\\" + PUID + ".jpg"
mainloop()

截屏代码:

x0 =w.winfo_rootx()
y0 =w.winfo_rooty()
x1 =x0 + w.winfo_width()
y1 =y0 + w.winfo_height()
im =ImageGrab.grab((x0, y0, x1, y1))
im.save(filename)

我可以通过这种方式制作 jpg,但似乎无法在 jgp 中获取小部件的内容(创建的文件声明为 jpg,但没有图像负载)

如果我将屏幕抓取代码放在主循环之后,它会说它已经破坏了对象,在主循环之前,它还没有构建对象......

【问题讨论】:

    标签: python image save tkinter


    【解决方案1】:

    您可以尝试通过subprocess 将其交给ghostscript。这可以以几乎任何位图格式呈现 PostScript。

    【讨论】:

    • 我已尝试从命令行 Ghostscipt 打开图像,但它们根本不渲染 - 我仍在摆弄设置,看看是否可以让它飞起来。
    • 你能把 PostScript 文件放在某个地方吗?我以前从 Python 生成过 PostScript。没那么难。
    • 当然 - dl.dropbox.com/u/59536414/fmt-15.PS 应该是 1000 x 1000 的画布
    • 我在后记代码中看到了两个问题。首先,它设置一个剪切路径,然后在它外部绘制所有文本。其次,所有文本都以 RGB 1,1,1 即白色绘制。如果我删除剪切路径并将颜色设置为 0,0,0,我会看到几个重叠的文本;它们都画在同一个地方。
    • 嗯。好的。我会看看我能不能解决这个问题。图像保存代码在上面包含,并且首先要开始工作是非常有问题的。愚蠢的是我没有检查输出,只是做了一个ps。白色文本可能是我的错 - 在代码中我强制它制作一些文本,所以我可以测量 bbox,然后可能移动文本 - 现在我知道如何使用更新我可能能够否定这一点。谢谢。
    【解决方案2】:

    我认为可能发生的情况是实际框架没有在脚本中更新。我可以通过在以下注释中注释掉 cv.update() 调用来重现您的症状——文件已生成但无负载:

    import Tkinter as tk
    root = tk.Tk()
    root.title("Simple plot")
    cv = tk.Canvas(width=200, height=200, bg='white')
    cv.pack()
    cv.create_text(100, 100, text="hello world!")
    cv.update() # comment out to make empty postscript!
    cv.postscript(file="my_drawing.ps", colormode='color')
    

    【讨论】:

    • 太棒了 - 我拆分了抓取代码 - 所以现在它可以工作了 - 就像这样。更新,然后获取 x,x1,y,y1,然后是 mainloop,然后是最后两行 im。谢谢你。我错过了更新电话。你怎么知道要使用这个?
    • 像这样:谷歌搜索“tkinter postscript”。找到this link,我从中窃取了上面的代码。试过了,没用。在 ipython 下尝试过,然后它做到了,令我惊讶的是。意识到真正的区别在于交互性;谷歌搜索“tkinter update”,剩下的就是历史了。
    • 太棒了,谢谢。我真的很感谢你的时间。我将把这个打开一段时间,以防我从 PS 开场线程中得到任何有用的信息。
    【解决方案3】:

    事实证明,在调用 postscript 之前需要 update() 函数,正如 tk canvas 手册页所指定的那样。

    pathName postscript ?option value option value ...?

    注意:默认情况下,Postscript 仅针对屏幕上画布窗口中出现的信息生成。如果画布是新创建的,它的初始大小可能仍为 1x1 像素,因此 Postscript 中不会出现任何内容。要解决此问题,请调用“更新”命令等待画布窗口达到其最终大小,或者使用 -width 和 -height 选项指定要打印的画布区域。

    我已将此标记为修复,因为 PS 文件是首选的保存格式,并且质量比截屏方法高得多。

    现在工作代码变成:

    def drawCircles(MasterList,buildlist):
    master = Tk()
    w = Canvas(master, width=1000, height=1000)
    w.config(bg='white')
    coordsMain = MasterList[6:]
    textMain = MasterList[0:2]
    w.pack()
    w.create_oval(*coordsMain, width=3, fill = "ivory3")
    masterLabel = "Source PUID\n" + str(MasterList[3]) + "\nFiles = " + str(MasterList[4])
    w.create_text(*textMain, text=masterLabel, justify = "center", font=("Helvetica", 16))
    for i in buildlist:
     coordsSet = i[6:10]
     w.create_oval(*coordsSet, width=3, fill = i[5])
     set_label = i[3] + "\n" + str(i[4]) + "%"
     l=w.create_text(4,4, text=set_label, justify = "center", fill="white", font=("Helvetica", 16))
     a,b,c,d= (w.bbox(l))
     bboxArea =(c-a)*(d-b)   
     a,b,c,d = i[6:10]
     circleArea = (c-a)*(d-b)
     if bboxArea>circleArea:
      textSet = i[10:]
      j=w.create_text(*textSet, text=set_label, justify = "center", font=("Helvetica", 16))
      r=w.create_rectangle(w.bbox(j),fill="white", width=0)
     else:
      textSet = i[:2]
      j=w.create_text(*textSet, text=set_label, justify = "center", font=("Helvetica", 16))
      r=w.create_rectangle(w.bbox(j),fill=i[5], width=0) 
     w.tag_lower(r,j)
     PUID = str(MasterList[3])
     PUID = PUID.replace('/', '-')
     filename = "\images\\" + PUID + ".PS"
     w.update()
    mainloop()
    

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2011-09-03
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多