tkinterでwebから画像をスクレイピングする部分を関数化してキャンパスに描写できない
tkinterでボタンをクリックしたらwebから画像を習得したいのですが、毎回webからスクレイピングを
するのは負担がかかると思い↓のように関数化したのですがなぜか関数化すると画像がキャンパスに描写されませんでした。普通に書くと問題なく描写されるのですが、それだと毎回通信をして画像をwebからスクレイピングしているのかと思いボタンの中で関数化しました。
そもそもtkinterのループの仕組みがわかっていないからなのか、とりあえずリファレンスを読みましたが手抜きのあまりにもひどいリファレンスだったので全く理解できず・・・
##関数化の部分 def imageprint(url): 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) f = io.BytesIO(urllib.request.urlopen(request).read()) img = Image.open(f) img.thumbnail((200, 200), Image.ANTIALIAS) img = ImageTk.PhotoImage(img) # 表示するイメージを用意 return img
##こちらが全ソース import tkinter as tk from PIL import Image, ImageTk import urllib.request import io from PIL import Image ''' web上にある画像を保存します ''' 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 img img = imageprint(url) print(img) # ボタンを表示 command=処理 button= tk.Button(text="button",command=btn_click_1_1) button.place(x=0, y=200) def imageprint(url): 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) f = io.BytesIO(urllib.request.urlopen(request).read()) img = Image.open(f) img.thumbnail((200, 200), Image.ANTIALIAS) img = ImageTk.PhotoImage(img) # 表示するイメージを用意 return img canvas.create_image( # キャンバス上にイメージを配置 0, # x座標 0, # y座標 image=img, # 配置するイメージオブジェクトを指定 tag="illust", # タグで引数を追加する。 anchor=tk.NW # 配置の起点となる位置を左上隅に指定 ) root.mainloop()
回答2件
あなたの回答
tips
プレビュー