Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Tkinter保存的PS图像-can';不要打开它们_Python_Image_Save_Tkinter - Fatal编程技术网

Python-Tkinter保存的PS图像-can';不要打开它们

Python-Tkinter保存的PS图像-can';不要打开它们,python,image,save,tkinter,Python,Image,Save,Tkinter,我已经编写了一个相当复杂的脚本来创建图形-通过Tkinter模块 它按照我的预期工作,并将画布保存为PostScript文件 只是,我无法以任何方式呈现PS文件。一点也不 当我决定使用Tkinter时,我非常自信,我可以用PS文件做一些事情,将它们转换成更标准的格式 我看到一些教程建议将图形移植到PIL,这可能会奏效,但将所有动态对象从tk移植到PIL将是一项相当艰巨的任务 我想知道是否有人有一种更快/更脏的方法将像素从窗口小部件中提取到图像文件中 或任何查看/光栅化PS文件的windows方法

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

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

只是,我无法以任何方式呈现PS文件。一点也不

当我决定使用Tkinter时,我非常自信,我可以用PS文件做一些事情,将它们转换成更标准的格式

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

我想知道是否有人有一种更快/更脏的方法将像素从窗口小部件中提取到图像文件中

或任何查看/光栅化PS文件的windows方法?如果有兴趣,我可以在某处放置一个示例PS文件?(python代码非常复杂,需要3个MySQL表才能将数据汇集在一起)

我尝试从这里使用屏幕抓取方法:

努力把事情安排得井井有条

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,但没有图像负载)


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

你可以试着在一段时间内把它交给我。它可以以几乎任何位图格式呈现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文件是首选的保存格式,并且其质量比屏幕抓图方法高得多

工作代码现在变为:

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

我试着从命令行Ghostscipt打开图像,但它们根本没有渲染-我仍然在摆弄设置,看看能否让它飞起来。你能把PostScript文件放在什么地方吗?我以前从Python生成过PostScript。这没那么难。当然,这应该是一个1000 x 1000的画布。我在postscript代码中看到了两个问题。首先,它设置一个剪切路径,然后绘制它外部的所有文本。其次,所有文本均以RGB 1,1,1绘制,即白色。如果我删除剪辑路径并将颜色设置为0,0,0,我会看到两个重叠的文本;他们都是在同一个地方画的。好啊我看看能不能弄明白。上面包含了图像保存代码,在开始工作时遇到了很多问题。愚蠢的是,我没有检查输出,只是做了一个ps。白色文本可能是我的错-在代码中,我强迫它做一些文本,这样我可以测量bbox,然后可能移动文本-现在我知道如何使用更新,我可能能够否定这一点。谢谢。太棒了-我拆分了抓取器代码-所以现在它可以工作了-就像这样。更新,然后得到x,x1,y,y1,然后是mainloop,最后两条im线。非常感谢。我错过了更新电话。你是怎么知道用这个的?像这样:谷歌搜索“tkinter postscript”。找到了,我从中偷了上面的代码。试过了,没用。在ipython手下试过,然后成功了,令我惊讶。认识到真正的区别在于互动性;谷歌搜索了“tkinter更新”,剩下的都是历史了。太棒了,谢谢。我真的很感谢你抽出时间。我会让这个打开一段时间,以防我从PS打开线程中得到任何有用的东西。