[pukiwiki]
Python標準のGUIライブラリ Tkinter。
グラフなどを描くためのCanvasウィジェットのポインタを渡すと、PngやJpeg、GIFなどの画像データとして画面をキャプチャ保存するコードを書いてみました。
キャプチャしたサンプル画像
[[http://boxheadroom.com/wp/wp-content/uploads/2009/05/rainbow-150×150.png:http://boxheadroom.com/wp/wp-content/uploads/2009/05/rainbow.png]]
あとでヘッダにしようかと。
[/pukiwiki]
[pukiwiki]
-Canvasウィジェットの座標を取得
-PILで、その場所のスクリーンキャプチャを取得
という回りくどいことをしています。普通の人は必要ないかと。
ファイル名 ”tkgrab.py”っとして保存してください
[/pukiwiki]
<<少しバグを修正>>
import Image,ImageGrab,ImageTk
import time
"""tkgrab.py
capture tkCanvas as PIL Image
"""
def grab(canvas,bbox=None):
wx,wy=canvas.winfo_rootx(),canvas.winfo_rooty()
inner_w,inner_h=int(canvas.cget("width")),int(canvas.cget("height"))
outer_w,outer_h=canvas.winfo_width(),canvas.winfo_height()
ox,oy=(outer_w-inner_w)//2,(outer_h-inner_h)//2
#ox,oy=0,0
if bbox :
x0,y0,x1,y1=bbox
else :
x0,y0=0,0
x1,y1=inner_w,inner_h
im=ImageGrab.grab((wx+x0+ox,wy+y0+oy,wx+x1+ox,wy+y1+oy))
return im
def init(root):
root.update()
root.lift()
サンプル画像を描いて、キャプチャするためのテストプログラム。
<<修正>> tkgrabモジュールをインポートするのを忘れてたので追加
import Image,ImageGrab,ImageTk
import time
from tkgrab import init,grab
#上記 tkgrab.pyの最後に追加する場合は、
#この一行を削除。
if __name__=="__main__":
import Tkinter as tk
import colorsys
W,H=760,200
root=tk.Tk()
cv=tk.Canvas(root,width=W,height=H,offset=tk.NW,bg="white")
cv.xview("moveto",0)
cv.yview("moveto",0)
cv.pack()
ox,oy=W//2,H//2
from math import pi,sin,cos
dt=4
dx=W/360.
for j in xrange(5) :
h=j/5.
col="#%02x%02x%02x"%colorsys.hsv_to_rgb(h,0.3,255)
ox=-j*16
pos=[]
for i in xrange(0,360*2,dt):
deg=pi*i/180.
x=W*i/360.+ox
y=-.7*H/2.*sin(deg)+H//2
#print x,
pos+=[x,y]
cv.create_line(*pos , **dict(fill=col,width=2,smooth=True))
#print
#cv.create_rectangle(80,60,240-1,180-1)
root.update()
init(root)
grab(cv).save("test1.png")
box=[80,10,80+320-1,10+140-1]
cv.create_rectangle(*box)
root.update()
box[2]+=1
box[3]+=1
grab(cv,box).save("test2.png")
Canvasには描画内容をpostscriptデータとして保存する 、postscriptメソッドがありますので、そちらを利用するのもよいかも。