Python Tkinter保存的PS图像无法打开

2024-06-28 20:46:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

它像我预期的那样工作,并将画布保存为PostScript文件。在

只是,我不能以任何方式呈现PS文件。完全。在

当我决定使用Tkinter时,我非常有信心,我可以对PS文件做些什么,使它们成为更标准的格式。在

我看过一些教程,建议将图形移植到PIL中,这可能会奏效,但将所有动态对象从tk移植到PIL将是一项相当艰巨的任务。在

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

或任何windows查看/光栅化PS文件的方法?如果有兴趣,我可以把一个PS文件放在某个地方?(python代码比较复杂,需要3个MySQL表才能把数据拉到一起)

我试图从这里使用screengrab方法: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()

屏幕抓取代码:

^{pr2}$

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

如果我把屏幕抓取代码放在mainloop之后,它会说它销毁了对象,在mainloop之前,它还没有构建对象。。。。在


Tags: 文件代码textcreatewidthfillpscenter
3条回答

你可以试着把它交给subprocess中的ghostscript。它可以以几乎任何位图格式呈现PostScript。在

我认为可能发生的是脚本中的实际帧没有得到更新。我可以通过在下面注释掉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')

正如tk canvas manpage指定的那样,在postscript调用之前需要update()函数。在

路径名postscript?选项值选项值。。。?在

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

我将其标记为修复,因为PS文件是首选的保存格式,并且质量比screengrab方法高很多。在

工作代码现在变成:

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

相关问题 更多 >