pythonのtkinterのcanvas上に、プリントスクリーンした画像をウインドウサイズに合わせて配置できるコードを書きました。
画像も表示され、目的は達成できているのですが少し気になるところがあります。
配置を実行した後のコードid_list.append(im)のところで
(NameError: name 'id_list' is not defined)のエラーが出ています。
id_listが定義されていないのかと思い、id_list = []を追加すると、
エラーは無くなりますが画像が表示できなくなります。
方法を調べながら作成したものですが、このid_list.append(im)の意味がよくわかっておらず、このコードがないと画像表示ができないため残しています。
エラー表示なく画像を表示するには、どのようにしたら良いでしょうか?
import tkinter as tk from tkinter import * from PIL import Image, ImageTk,ImageGrab import tkinter.messagebox as mb import tkinter.filedialog #id_list = [] def readpic(): haba=window_width.get() im = ImageGrab.grabclipboard() if isinstance(im, Image.Image): width, height = im.size hiritu = int(haba)/width xx =int(width*hiritu) yy =int(height*hiritu) im_resize = im.resize((xx,yy)) im_resize.save('tmp.jpg', 'JPEG', quality=100, optimize=True) img = Image.open("tmp.jpg") new_img = Image.new("RGBA", (width, height), (255, 255, 255)) new_img.paste(img, (0, 0)) image = ImageTk.PhotoImage(new_img) im=cvs.create_image(0, 0, image=image, anchor = tk.NW,tag="gazou") id_list.append(im) else: mb.showinfo("", "クリップボードにデータがありません。") def show_width(event): window_width.delete(0, tk.END) window_width.insert(0, event.width) window = tk.Tk() window.title('サンプル') frame1 = tk.Frame(window,bd=1,relief="ridge") frame1.grid(row=0, column=0,sticky='news') frame2 = tk.Frame(window,bd=1,relief="ridge") frame2.grid(row=2, column=0,sticky='news') btn = tk.Button(frame1, text='クリップボード貼付', command=readpic) btn.pack(side=LEFT) cvs = tk.Canvas(frame2, height=600, width=1000, bg='white',bd=1,relief="ridge") cvs.grid(row=0, column=0,sticky='news') cvs.bind("<Configure>", show_width) window_width = tk.Entry(frame1) window_width.pack(side=RIGHT) frame2.grid_columnconfigure(0,weight=1) frame2.grid_rowconfigure(0,weight=1) window.grid_columnconfigure(0,weight=1) window.grid_rowconfigure(2,weight=1) window.mainloop()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/04 12:13
2018/12/04 12:22 編集