質問: ImageTk.PhotoImage(img) # 表示するイメージを用意 return img canvas.create_image( # キャンバス上にイメージを配置 0, # x座標 0, # y座標 image=img, # 配置するイメージオブジェクトを指定 tag="illust", # タグで引数を追加する。 anchor=tk.NW # 配置の起点となる位置を左上隅に指定 ) root.mainloop() ```
回答: `btn_click_1_1`関数に`canvas.create_image`の呼び出し文がないです。 そのため、変数:imgに値を格納しても画面の更新が行わなれないかと。 ``` def btn_click_1_1(): global url global img img = imageprint(url) # canvas.create_imageの行を追加root.mainloopのcanvas.create_imageは不要です。 canvas.create_image( # キャンバス上にイメージを配置 0, # x座標 0, # y座標 image=img, # 配置するイメージオブジェクトを指定 tag="illust", # タグで引数を追加する。 anchor=tk.NW # 配置の起点となる位置を左上隅に指定 ) print(img) ``` > > 毎回webからスクレイピングをするのは負担がかかる > > > pathlibを使って画像をローカルに保存するという手(※)もありますが。 ※hashlibを使って、urlからハッシュ関数の出力結果を求め、保存ファイル名として使用すればよいかと。 同じURLに対してプログラム起動中はキャッシュを行いたいだけならば。 functools.lru_cacheが使えます。 ``` # -*- coding: utf-8 -*- """ web上にある画像を保存します """ import tkinter as tk from PIL import Image, ImageTk import urllib.request from io import BytesIO from functools import lru_cache from PIL import Image @lru_cache(maxsize=None) def get_content(url: str): headers = { "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0", } request = urllib.request.Request(url=url, headers=headers) print("content") return BytesIO(urllib.request.urlopen(request).read()) def imageprint(url): img = Image.open(get_content(url)) img.thumbnail((200, 200), Image.ANTIALIAS) img = ImageTk.PhotoImage(img) # 表示するイメージを用意 return img img ="" url = "http://imgcc.naver.jp/kaze/mission/USER/20180519/35/3012705/157/500x718xedab7ba7e203cd7576d12004.jpg" root = tk.Tk() root.geometry('800x560') root.title('IMG') canvas = tk.Canvas( root, # 親要素をメインウィンドウに設定 width=500, # 幅を設定 height=500, # 高さを設定 #relief=tk.RIDGE # 枠線を表示 # 枠線の幅を設定 bg = "black" ) canvas.place(x=0, y=0) # メインウィンドウ上に配置 def btn_click_1_1(): #global url # 再代入を伴わないので、globalはコメントアウト global img img = imageprint(url) print(img) canvas.create_image( # キャンバス上にイメージを配置 0, # x座標 0, # y座標 image=img, # 配置するイメージオブジェクトを指定 tag="illust", # タグで引数を追加する。 anchor=tk.NW # 配置の起点となる位置を左上隅に指定 ) # ボタンを表示 command=処理 button= tk.Button(text="button",command=btn_click_1_1) button.place(x=0, y=200) root.mainloop() ```