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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Tkinter

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

Python

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

Q&A

解決済

1回答

3896閲覧

canvasに画像が表示されない

erisawa

総合スコア12

Tkinter

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

Python

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

1グッド

0クリップ

投稿2020/08/03 07:49

実現したいこと
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()
teamikl👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1def onKousinButton(): 2 #画像読み込み 3 img3=Image.open(image_name1) 4 img4=ImageTk.PhotoImage(img3,master=root) 5 #キャンバス2に画像を表示 6 cvs2.create_image(0,0,image=img4, anchor='nw' )

PhotoImage にはデストラクタが定義されていて、
img4 は関数内のローカル変数なので、onKousinButton 関数の終了時に破棄されてしまいます。
img2 はグローバル変数なので問題有りません。

簡単な解決策:

  • 関数内で global img4 とグローバル宣言する。
  • cvs2.img = img4 と、グローバル変数のオブジェクトに参照を持たせる。

投稿2020/08/03 15:08

teamikl

総合スコア8664

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

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

erisawa

2020/08/04 03:06

グローバル宣言すると、上手く行きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問