親ウインドウ上に図形を描画し、その上にマウスが置かれると子ウインドウを作成して所定の画像を表示させたいです。
【確認した事】
親ウインドウの図形上にマウスを置いた時、子ウインドウが出力
【困っている事】
子ウインドウ上に画像が表示されず、背景色に指定した真っ白なウインドウのみ表示される
画像を表示するためには、どのように修正すればよろしいでしょうか?
エラーなどがないため、修正するための手がかりも無い状態です。
不足情報がございましたら、おっしゃってください。
ご回答、よろしくお願いいたします。
※ご指摘頂きました点、修正致しました
python3.8.5
import tkinter as tk from PIL import Image, ImageTk
子ウインドウ
class ChildWindow(tk.Frame): def __init__(self): self.root = tk.Toplevel() #修正:tk.TK() ⇒ tk.Toplevel() self.root.geometry("400x400") self.canvas= tk.Canvas(self.root, bg="white") self.canvas.pack(fill=tk.BOTH, expand=True) def disp_image(self, filename): pil_image = Image.open(filename) self.photo_image = ImageTk.PhotoImage(image=pil_image, master=self.root) self.canvas.create_image(self.canvas.winfo_width()/ 2, self.canvas.winfo_height()/ 2, image=self.photo_image)
親ウインドウ
class ParentWindow: def __init__(self): self.root = tk.Tk() self.root.geometry("400x400") self.canvas = tk.Canvas(self.root, bg="white") self.canvas.pack(fill=tk.BOTH, expand=True) self.canvas.create_oval(100, 100, 110, 110, tag="point") #図形は適当 self.canvas.tag_bind("point", "<Enter>", self.hello) self.root.mainloop() def hello(self, e): #修正:hello() ⇒ hello(self, e) self.sub_root = ChildWindow() self.sub_root.disp_image('./test.bmp') ParentWindow()
本題とは関係ないかもしれませんが、def hello(): は def hello(self, e): とするのではないでしょうか(メソッドなので)。
ご指摘ありがとうございます。
抜粋時に記載が漏れていましたので、追記致しました。
子ウインドウのコードでエラーが出ます。
おそらく複数の child window を表示した場合に、最新の child window 以外の window で表示されていた画像が消えてしまう現象が発生しているのではないでしょうか? もしそうであれば、disp_image メソッド内の、
self.photo_image = ImageTk.PhotoImage(image=pil_image, master=self.root)
このインスタンスを global scope へ移すことで解決するはずです。
meg_ 様 ⇒ インデントがおかしくなっていました。失礼いたしました
melian 様 ⇒ ご回答ありがとうございます。問題が2つあり、1つはご指摘頂いた点でした。
もう1つは、回答編集して展開致します。
ありがとうございました。
回答2件
あなたの回答
tips
プレビュー