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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

Q&A

解決済

2回答

1352閲覧

pythonのtkinterで、子ウインドウ上に画像が表示できない

tks_clap34

総合スコア5

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/05/19 13:59

編集2022/05/19 15:02

親ウインドウ上に図形を描画し、その上にマウスが置かれると子ウインドウを作成して所定の画像を表示させたいです。

【確認した事】
親ウインドウの図形上にマウスを置いた時、子ウインドウが出力
【困っている事】
子ウインドウ上に画像が表示されず、背景色に指定した真っ白なウインドウのみ表示される

画像を表示するためには、どのように修正すればよろしいでしょうか?
エラーなどがないため、修正するための手がかりも無い状態です。
不足情報がございましたら、おっしゃってください。
ご回答、よろしくお願いいたします。

※ご指摘頂きました点、修正致しました


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()

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

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

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

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

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

melian

2022/05/19 14:23

本題とは関係ないかもしれませんが、def hello(): は def hello(self, e): とするのではないでしょうか(メソッドなので)。
tks_clap34

2022/05/19 15:03

ご指摘ありがとうございます。 抜粋時に記載が漏れていましたので、追記致しました。
meg_

2022/05/19 15:40

子ウインドウのコードでエラーが出ます。
melian

2022/05/19 16:15

おそらく複数の child window を表示した場合に、最新の child window 以外の window で表示されていた画像が消えてしまう現象が発生しているのではないでしょうか? もしそうであれば、disp_image メソッド内の、 self.photo_image = ImageTk.PhotoImage(image=pil_image, master=self.root) このインスタンスを global scope へ移すことで解決するはずです。
tks_clap34

2022/05/20 17:52

meg_ 様 ⇒ インデントがおかしくなっていました。失礼いたしました
tks_clap34

2022/05/20 17:53

melian 様 ⇒ ご回答ありがとうございます。問題が2つあり、1つはご指摘頂いた点でした。        もう1つは、回答編集して展開致します。        ありがとうございました。
guest

回答2

0

以下の2点、不備がありました。
①:グローバルスコープの問題
②:Canvasサイズを取得できていなかった
子ウインドウ側を以下の通り修正した所、表示されました。
ご回答ありがとうございました。

class ChildWindow(tk.Frame):    def __init__(self): self.root = tk.Toplevel() self.root.geometry("400x400") self.root.update_idletasks() #② self.canvas= tk.Canvas(self.root, bg="white") self.canvas.pack(fill=tk.BOTH, expand=True) self.canvas.update_idletasks() #② def disp_image(self, filename): pil_image = Image.open(filename) self.canvas.photo = ImageTk.PhotoImage(image=pil_image, master=self.root) #① self.canvas.create_image(self.canvas.winfo_width()/ 2, self.canvas.winfo_height()/ 2, image=self.canvas.photo) #①

投稿2022/05/20 18:07

tks_clap34

総合スコア5

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

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

0

ベストアンサー

手持ちの画像で質問のコードを試したところ(インデントは修正しました)、2つ目のウィンドウに画像が表示されました。
※他の画像でも質問同様表示されないのでしょうか?

Python

1import tkinter as tk 2from PIL import Image, ImageTk 3 4class ChildWindow(tk.Frame): 5 def __init__(self): 6 self.root = tk.Toplevel() #修正:tk.TK() ⇒ tk.Toplevel() 7 self.root.geometry("400x400") 8 9 self.canvas= tk.Canvas(self.root, bg="white") 10 self.canvas.pack(fill=tk.BOTH, expand=True) 11 12 def disp_image(self, filename): 13 pil_image = Image.open(filename) 14 self.photo_image = ImageTk.PhotoImage(image=pil_image, master=self.root) 15 16 self.canvas.create_image(self.canvas.winfo_width()/ 2, self.canvas.winfo_height()/ 2, image=self.photo_image) 17 18class ParentWindow: 19 def __init__(self): 20 self.root = tk.Tk() 21 self.root.geometry("400x400") 22 23 self.canvas = tk.Canvas(self.root, bg="white") 24 self.canvas.pack(fill=tk.BOTH, expand=True) 25 26 self.canvas.create_oval(100, 100, 110, 110, tag="point") #図形は適当 27 self.canvas.tag_bind("point", "<Enter>", self.hello) 28 self.root.mainloop() 29 30 def hello(self, e): 31 self.sub_root = ChildWindow() 32 self.sub_root.disp_image('test.bmp) 33 34ParentWindow()

Python 3.8.3

投稿2022/05/19 15:49

編集2022/05/19 15:58
meg_

総合スコア10579

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

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

tks_clap34

2022/05/20 17:58

ご回答ありがとうございます。 はい、私の環境では上記コードでは2つ目のウインドウは表示されましたが、ウインドウ上に画像は表示されませんでした。 ご指摘頂いたグローバルスコープの問題と、canvasサイズを取得する箇所に不備がありました。 何故、meg_様の環境で表示されるのかは気になるところですが、グローバルスコープ問題についてご回答頂きましたのでベストアンサーとさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問