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

コピペしてお好きなようにお試しください。
(無保証です)

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)