2012-02-29 27 views
2

Tkinterモジュールを使用して、グラフィックを作成するためのかなり畳み込まれたスクリプトを作成しました。Python - Tkinterで保存されたPSイメージ - 開けません。

これは期待どおりに機能し、キャンバスをPostScriptファイルとして保存します。

PSファイルを何でもレンダリングできません。まったく。

私は、Tkinterを使用することに決めたとき、私はPSファイルでもっと標準的なフォーマットにすることができると確信していました。

私は図面をPILに移植することを提案するいくつかのチュートリアルを見ましたが、それはうまくいくかもしれませんが、すべての動的オブジェクトをtkからPILに移植するのはかなりの作業になります。

誰かがウィジェットウィンドウからピクセルをイメージファイルにすばやく/より汚い方法で持っているかどうかは疑問でした。

PSファイルを表示/ラスタライズするWindowsの方法はありますか?興味があればどこかのサンプル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() 

画面のグラブコード:

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の前にオブジェクトが破壊されたことが示されます。まだまだ....

答えて

1

それは更新を()で指定された関数は、呼び出しをPostScriptに先立って必要とされる判明tk canvasマンページ。

パス名ポストスクリプト?オプション値オプション値...?

注:デフォルトでは、ポストスクリプトは画面上のキャンバスのウィンドウに表示される情報に対してのみ生成されます。キャンバスが新しく作成された場合、最初のサイズは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() 
1

ghostscriptsubprocessでお試しください。 PostScriptはほとんどのビットマップ形式でレンダリングできます。

+0

私は、コマンドラインGhostsciptから画像を開いて試してみましたが、それらはすべてでレンダリングされません - 私はまだ私が得ることができるかどうかを確認するために設定をいじっていますそれは飛んでいる。 – Jay

+0

PostScriptファイルをどこかに置くことはできますか?以前はPythonからPostScriptを生成しました。それほど難しいことではありません。 –

+0

確かに - http://dl.dropbox.com/u/59536414/fmt-15.PSこれは1000 x 1000のキャンバスにする必要があります – Jay

1

実際に起こっていることは、実際のフレームがスクリプトで更新されていないことです。ファイル生成が、ペイロード・フリー - - 私はあなたの症状を再現することができますで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') 
+0

恐ろしい - 私はグラバーコードを分割したので、今のように - このように。更新し、次にx、x1、y、y1を取得し、次にmainloopを取得し、最後の2つのim行を取得します。ありがとうございました。私は更新プログラムの呼び出しがありませんでした。あなたはこれをどのように知っていましたか? – Jay

+0

googleの "tkinter postscript"のようにしました。上記のコードを盗んだ[このリンク](http://www.daniweb.com/software-development/python/code/216929)が見つかりました。それを試して、動作しませんでした。 ipythonの下でそれを試してみました。そしてそれは私の驚きにしました。実際の違いは対話性であることを認識しました。グーグル "tkinterの更新"、残りは歴史です。 – DSM

+0

素晴らしい、ありがとう。私は本当にあなたの時間を感謝します。私はこれを開いたままにしておきますが、私はPSオープニングスレッドから何か役に立つものを得ています。 – Jay

関連する問題