pythonで画面キャプチャーツールを作ってみよう(5)
掲載しているソースをコピーするボタンを設置しました。
ソースコードの部分(枠内)にマウスをもっていくと、
[Click to Copy]という表示が枠の上部に出ます。
この↑表示をクリックしようとしても駄目です(^^;)。
枠の外にあるので、マウスをそこに持っていくと
消えてしまい、クリックできません。
んじゃぁ、どうすればよいかと言うとソースコードの部分、
すわなち枠内でクリックするのです。
そうすると[Click to Copy]という表示が[Copied!]に
変わります。それがクリップボードにコピーされた合図
なので、好きなところ(エディタ等)でペーストすると
吐き出せます。
このコピーボタンですが、Javascriptで自作してみようと
試行錯誤していてましたがイマイチのデキで、ふと
wordpressプラグインがあるかも、と探してみると
ありました、ありました。
入れてみたのは Code Click to Copy という名の
プラグインです。
という訳で、前回の記事で見送っていたソースコードを
以下に掲載します。
#! /usr/bin/python3
import time
import tkinter as tk
from tkinter import filedialog
from PIL import Image,ImageGrab,ImageTk
class CapWin(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.img=None
self.pimg=None
self.drawid=None
self.frame=tk.Frame(master)
self.cv=tk.BooleanVar()
self.cv.set(False)
self.ck=tk.Checkbutton(self.frame,text="delay",variable=self.cv)
self.te=tk.Entry(self.frame,width=4)
self.te.insert(tk.END,"3")
self.ck.pack(side='left')
self.te.pack(side='left')
self.captbtn=tk.Button(self.frame,text='Capture',command=self.capture)
self.savebtn=tk.Button(self.frame,text='Save',command=self.save)
self.captbtn.pack(side='left')
self.savebtn.pack(side='left')
self.frame.pack()
self.canvas=tk.Canvas(root,bg='black',width=1920,height=1080)
self.canvas.pack()
def capture(self):
x=self.canvas.winfo_rootx() # +canvas.winfo_x() は不要
y=self.canvas.winfo_rooty() # +canvas.winfo_x() は不要
w=self.canvas.winfo_width()
h=self.canvas.winfo_height()
geo=root.wm_geometry() # 窓の位置を記録
root.withdraw() # 消す
time.sleep(0.1)
if self.cv.get() :
d=int(self.te.get())
time.sleep(d)
self.img=ImageGrab.grab(bbox=(x,y,x+w,y+h))
root.deiconify() # 再表示
p=geo.split('+')
if p[1]=="0" and p[2]=="0": # 起動後1回目は +0+0 が返るので
if x!=0 or y!=0: # 実際の位置と異なっていれば
geo=p[0] # +0+0 を削除
root.wm_geometry(geo) # 消した位置に戻す
if self.drawid!=None:
self.canvas.delete(self.drawid)
self.pimg=None
self.drawid=None
self.pimg=ImageTk.PhotoImage(image=self.img)
self.drawid=self.canvas.create_image(
w//2,h//2,
image=self.pimg
)
def save(self):
imgext=('.png','.bmp','.jpg')
path_name=filedialog.asksaveasfilename(
filetypes=[('image',imgext),('All','.*')])
if path_name :
if not path_name[-4:] in imgext :
pn=pn+".png"
self.img.save(path_name)
# end of class CapWin(tk.Frame) #############################
root=tk.Tk()
root.geometry("240x200")
root.title("Capture")
capwin=CapWin(master=root)
capwin.pack()
root.mainloop()
コピペしてお好きなようにお試しください。
(無保証です)
この記事へのコメントはこちら