実現したいこと
canvas1でトリミングし、保存した画像を更新ボタンを押してcanvas2に表示したい。現状、更新ボタンを押してもcanvas2に画像が表示されない。
import tkinter as tk import tkinter.ttk as ttk from PIL import Image, ImageTk root = tk.Tk() image_name="IMG_20200630 164118.jpg" image_name1="a.jpg" def xy_print(event): line = 'x:' + str(event.x) + ' ' + 'y:' + str(event.y) ent.delete(0, 20) ent.insert(0, line) def onSaveButton(): #表示画像を取り込み temp_image=Image.open(image_name) temp_image_resize=temp_image.resize(size=(512,384)) #選択位置で切り出し cropped_image=temp_image_resize.crop((left.get(), top.get(), right.get(), bottom.get())) #保存 cropped_image.save("a.jpg") def onKousinButton(): #画像読み込み img3=Image.open(image_name1) img4=ImageTk.PhotoImage(img3,master=root) #キャンバス2に画像を表示 cvs2.create_image(0,0,image=img4, anchor='nw' ) def onSliderLeft(args): cvs.delete("left_line") cvs.create_line(left.get(), 0, left.get(),384, tag="left_line", fill='green',width=4) def onSliderRight(args): cvs.delete("right_line") cvs.create_line(right.get(), 0, right.get(),384, tag="right_line", fill='red',width=4) def onSliderTop(args): cvs.delete("top_line") cvs.create_line(0, top.get(), 512,top.get(), tag="top_line", fill='green',width=4) def onSliderBottom(args): cvs.delete("bottom_line") cvs.create_line(0, bottom.get(),512,bottom.get(), tag="bottom_line", fill='red',width=4) #ウィンドウサイズを定義する root.geometry('1500x750')#横×縦 root.title('蒸気流量計読み取り') #キャンバス1の作成 cvs = tk.Canvas(root, height=384, width=512, bg='white') cvs.grid(rowspan=3,columnspan=3,row=0, column=0) #キャンバス2の作成 cvs2 = tk.Canvas(root, height=250, width=250, bg='white') cvs2.grid(rowspan=10,row=5, column=0, sticky=tk.NW) cvs2.bind('<Motion>', xy_print) #座標表示画面の作成 ent = tk.Entry(root) ent.grid(row=4, column=0, sticky=tk.NW) #座標表示横のラベル lbl=tk.Label(text='[トリミング画像の座標]') lbl.grid(row=3,column=0, sticky=tk.NW) #スライダ用の変数を確保 left=0 right=0 top=0 bottom=0 #画像切り出しようのスライダ left=ttk.Scale(root, orient='h',from_=0,to_=512,length=150,command=onSliderLeft) left.grid(row=0,column=4) right=ttk.Scale(root,orient='h',from_=0,to_=512,length=150,command=onSliderRight) right.grid(row=1,column=4) top=ttk.Scale(root, orient='v',from_=0,to_=384,length=150,command=onSliderTop) top.grid(row=0,column=5) bottom=ttk.Scale(root,orient='v',from_=0,to_=384,length=150,command=onSliderBottom) bottom.grid(row=0,column=6) #画像切り出しようのラインを表示している画像に合わせて移動 left.set(0) right.set(0) top.set(0) bottom.set(0) #円中心座標入力画面の作成 ent_circle_x = tk.Entry(root) ent_circle_x.grid(row=6, column=1, sticky=tk.NW+tk.NE) ent_circle_y = tk.Entry(root) ent_circle_y.grid(row=6, column=2, sticky=tk.NW+tk.NE) #円中心座標入力ラベル lbl=tk.Label(text='[円中心のx座標]') lbl.grid(row=5,column=1, sticky=tk.SW) lbl=tk.Label(text='[円中心のy座標]') lbl.grid(row=5,column=2, sticky=tk.SW) #0目盛り座標入力画面の作成 ent_0_x = tk.Entry(root) ent_0_x.grid(row=9, column=1, sticky=tk.NW+tk.NE) ent_0_y = tk.Entry(root) ent_0_y.grid(row=9, column=2, sticky=tk.NW+tk.NE) #0目盛り座標入力ラベル lbl_1=tk.Label(text='[0目盛りのx座標]') lbl_1.grid(row=8,column=1, sticky=tk.SW) lbl_1=tk.Label(text='[0目盛りのy座標]') lbl_1.grid(row=8,column=2, sticky=tk.SW) #ボタン btn=tk.Button(root,text='保存',width=10, command=onSaveButton) btn.grid(row=2,column=4,sticky=tk.NW+tk.NE+tk.S) btn_1=tk.Button(root,text='開始') btn_1.grid(row=14,column=1,sticky=tk.NW+tk.NE+tk.S) btn_2=tk.Button(root,text='終了') btn_2.grid(row=14,column=2,sticky=tk.NW+tk.NE+tk.S) btn_4=tk.Button(root,text='更新',width=10, command=onKousinButton) btn_4.grid(row=2,column=5,sticky=tk.NW+tk.NE+tk.S) #画像読み込み1⇒画像opencvからpilに変換 img=Image.open("IMG_20200630 164118.jpg") img_resize=img.resize(size=(512,384)) img2=ImageTk.PhotoImage(img_resize,master=root) #キャンパスに画像1を表示する cvs.create_image(0,0,image=img2, anchor='nw' ) root.mainloop()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/04 03:06