2012-03-27 27 views
12
from Tkinter import * 
root = Tk() 
cv = Canvas(root) 
cv.create_rectangle(10,10,50,50) 
cv.pack() 
root.mainloop() 

キャンバスのコンテンツをビットマップやその他のイメージに変換し、イメージの回転や拡大、座標の変更などの操作を行いたいとします。キャンバスコンテンツをイメージに変換するにはどうすればよいですか?

ビットマップを使用すると、描画が中止されたことを示す効率が向上します。

どうすればよいですか?

+0

アクションスクリプトでは、python tkinterでどのように動作するかを実現するdraw()関数がありますか? – liupeixin

答えて

14

あなたはPostScriptドキュメント(:ImageMagickの、Ghostscriptの、などいくつかの他のツールに供給する):生成することができますいずれか

from Tkinter import * 
root = Tk() 
cv = Canvas(root) 
cv.create_rectangle(10,10,50,50) 
cv.pack() 
root.mainloop() 

cv.update() 
cv.postscript(file="file_name.ps", colormode='color') 

root.mainloop() 

またはPILにとのTkinterのキャンバス上で並列に同じ画像を描画する(参照:Saving a Tkinter Canvas Drawing (Python)を)。たとえば(同じ記事に触発されている):

from Tkinter import * 
import Image, ImageDraw 

width = 400 
height = 300 
center = height//2 
white = (255, 255, 255) 
green = (0,128,0) 

root = Tk() 

# Tkinter create a canvas to draw on 
cv = Canvas(root, width=width, height=height, bg='white') 
cv.pack() 

# PIL create an empty image and draw object to draw on 
# memory only, not visible 
image1 = Image.new("RGB", (width, height), white) 
draw = ImageDraw.Draw(image1) 

# do the Tkinter canvas drawings (visible) 
cv.create_line([0, center, width, center], fill='green') 

# do the PIL image/draw (in memory) drawings 
draw.line([0, center, width, center], green) 

# PIL image can be saved as .png .jpg .gif or .bmp file (among others) 
filename = "my_drawing.jpg" 
image1.save(filename) 

root.mainloop() 
9

これは本当に役立つ素晴らしい方法です。そのためには、PILモジュールが必要です。コードは次のとおりです。

from PIL import ImageGrab 

def getter(widget): 
    x=root.winfo_rootx()+widget.winfo_x() 
    y=root.winfo_rooty()+widget.winfo_y() 
    x1=x+widget.winfo_width() 
    y1=y+widget.winfo_height() 
    ImageGrab.grab().crop((x,y,x1,y1)).save("file path here") 

これは、機能にウィジェット名を渡すことです。 root.winfo_rootx()root.winfo_rooty()というコマンドは、rootウィンドウ全体の左上のピクセル位置を取得します。

次に、widget.winfo_x()widget.winfo_y()が追加されます。基本的には、キャプチャしたいウィジェットの左上のピクセル座標(画面のピクセル(x、y))を取得します。

次に、ウィジェットの左下のピクセルである(x1、y1)を見つけます。 ImageGrab.grab()は印刷画面を作成し、それをトリミングしてウィジェットを含むビットのみを取得します。完璧ではありませんが、可能な限り最良のイメージを作り出すことはできませんが、これはウィジェットのイメージを取得して保存するための素晴らしいツールです。

質問がある場合は、コメントを投稿してください!これが助けて欲しい!

+0

こんにちは、コードを実行すると、画像が早すぎます。 tkinterグラフィックスのサンプルスクリプトを投稿して保存していただけますか?たぶん私は間違った時間に機能を配置したり呼び出すことがあります。 –

+0

@ EerikMuuli写真を撮影するときにのみ、この機能を呼び出す必要があります。例えば、コマンドを持つボタンを得ることができます。ボタンのコマンドの関数では、単にgetter(x)を入力します。ここで、xはウィジェット、またはルートウィンドウ全体です。それは問題ではありません。さらに問題がある場合は、ここでコメントに返信してください。 –

+0

さて、どこに問題があるのか​​分かりました。ここにコードを貼り付けます。スクリプトが今行うことは、キャンバスを2回印刷してエラーに陥ることです。ただし、4.5秒後に一度開いて閉じてください。それはまた本当に奇妙な2回 "ウット"を印刷します。コードは次のとおりです:http://pastebin.com/MPgABMEv –