質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

396閲覧

pythonのImageGrabでのキャプチャで特定のGUIウインドウを無視したい

bajapan

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/16 22:31

前提

pythonのImageGrabでのキャプチャで特定のGUIウインドウを無視したい

実現したいこと

  • [ ]pythonのtkinterによって作成した背景を透明化したGUIウインドウで、そのウインドウ内をキャプチャしたいのですが、tkinterで表示されている文字列や画像は無視してキャプチャしたいです。方法を教えていただけると幸いです。

imageglabを行いたい

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1import os 2import time 3import tkinter as tk 4from tkinter import filedialog 5from PIL import Image,ImageGrab,ImageTk 6from tkinter import font 7 8def capture(): 9 global img,pimg,drawid 10 x=canvas.winfo_rootx() 11 y=canvas.winfo_rooty() 12 w=canvas.winfo_width() 13 h=canvas.winfo_height() 14 geo=root.wm_geometry() # 窓の位置を記録 15 time.sleep(0.1) 16 img=ImageGrab.grab(bbox=(x,y,x+w,y+h), include_layered_windows = True) 17 root.deiconify() # 再表示 18 root.wm_geometry(geo) # 消した位置に戻す 19 """ 20 if drawid!=None: 21 canvas.delete(drawid) 22 pimg=None 23 drawid=None 24 pimg=ImageTk.PhotoImage(image=img) 25 drawid=canvas.create_image( 26 w//2,h//2, 27 image=pimg 28 )""" 29 30root=tk.Tk() 31root.geometry("600x400") 32frame=tk.Frame(root) 33def save(): 34 path_name=filedialog.asksaveasfilename(title = "名前を付けて保存", 35 filetypes = [ ("PNG", ".png"), ("JPEG", ".jpg"), ("Tiff", ".tif"),("Bitmap", ".bmp")], # ファイルフィルタ 36 initialdir = "./images", # imageファイルが必要 37 defaultextension = "png") 38 if path_name: 39 img.save(path_name) 40 41#-------------------------------------------------------------- 42#text=tk.StringVar() 43#text.set("aaa") 44label = tk.Label(root, textvariable=text) 45label.pack() 46#---------------------------------------------------------------------------------------- 47 48captbtn=tk.Button(frame,text='Capture',command=capture)#このボタンでキャプチャ 49savebtn=tk.Button(frame,text='Save',command=save)#このボタンで保存 50savebtn.pack(side='left') 51captbtn.pack(side='left') 52#--------------------------------------------------------------------------- 53frame.pack() 54root.attributes("-transparentcolor", "red") 55canvas=tk.Canvas(root,bg='red',width=1920,height=1080) 56#canvas.pack(ipady=10,ipadx=10) 57canvas.pack(ipady=10,ipadx=10) 58root.attributes("-topmost", True) 59label=tk.Label(master=root,text="キャプチャしたくない文字列",foreground="red",background="snow") 60label.place(x=150,y=150) 61root.mainloop() 62

補足情報(FW/ツールのバージョンなど)

anaconda3
jupyternotebook
Python 3.7.11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

time.sleep(0.1) は不要です。
イベントハンドラ内で time.sleep 等の処理をブロッキングする関数は呼び出してはいけません。

GUIへの処理が反映されるのは、イベントハンドラとして良い出された関数が終わった後なので、
関数内で明示的にGUIを更新したい場合は、root.update() を呼び出します。

文字列や画像は無視してキャプチャしたいです。

文字列に関しては

  • place_forget で事前に非表示にして、
  • root.update() を呼び出し
  • キャプチャ、
  • place で再表示

という手順で可能になると思います。

画像は、同様にキャプチャの前後で表示非表示を切り替え
キャンバス内に表示された画像なら 非表示は
canvas.itemconfigure(drawid, state="hidden")
表示は "normal" で切り替え可能です。

投稿2022/05/17 14:33

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問