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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Tkinter

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

Q&A

解決済

2回答

3386閲覧

Python+Tkinterの複数ウィンドウ生成時エラー

inainaina

総合スコア8

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Tkinter

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

0グッド

0クリップ

投稿2017/11/12 13:06

編集2017/11/12 13:08

###前提・実現したいこと
Python+TkinterでGUIアプリケーションを作っています。
複数のウィンドウを生成し、それぞれに画像を表示しようとしているのですが、
2個目以降のウィンドウをTk()で生成すると、2個目以降のウィンドウに
画像を表示する際にエラーが発生します。
2個目以降のウィンドウをToplevel()で生成するとエラーが発生しないことは
わかったのですが、Tk()でエラーが発生する理由がわかりません。
Tk()ではいけない理由をご存知の方、アドバイスをいただけないでしょうか。

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:.../multi_window_example.py", line 18, in <module> label2 = Tk.Label(frame2, image=img2) File "C:\Anaconda2\lib\lib-tk\Tkinter.py", line 2597, in __init__ Widget.__init__(self, master, 'label', cnf, kw) File "C:\Anaconda2\lib\lib-tk\Tkinter.py", line 2096, in __init__ (widgetName, self._w) + extra + self._options(cnf)) _tkinter.TclError: image "pyimage2" doesn't exist

###該当のソースコード

import Tkinter as Tk from PIL import Image, ImageTk root = Tk.Tk() frame = Tk.Frame(root) im = Image.open('tmp.png') img = ImageTk.PhotoImage(im) label = Tk.Label(frame, image=img) label.pack() frame.pack() root2 = Tk.Tk() # root2 = Tk.Toplevel() frame2 = Tk.Frame(root2) im2 = Image.open('tmp.png') img2 = ImageTk.PhotoImage(im2) label2 = Tk.Label(frame2, image=img2) label2.pack() frame2.pack() root.mainloop()

###試したこと
google検索

###補足情報(言語/FW/ツール等のバージョンなど)
Anacondaを使用
Python 2.7.13

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

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

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

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

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

guest

回答2

0

自己解決

Tkinterのコードを読んでみたところ、
ImageTk.PhotoImageの中でTkinter.PhotoImageを呼んでおり、
Tkinter.PhotoImageでは特に指定がなければ
一番初めに生成されたTkのインスタンスに
生成したPhotoImageを紐付けるようになっているようでした。

よって紐づけ先を明示的に指定してあげれば回避できるようです。

結論としては、以下のコードで無事に動作するようです。

import Tkinter as Tk from PIL import Image, ImageTk root = Tk.Tk() frame = Tk.Frame(root) im = Image.open('tmp.png') img = ImageTk.PhotoImage(im) label = Tk.Label(frame, image=img) label.pack() frame.pack() root2 = Tk.Tk() # root2 = Tk.Toplevel() frame2 = Tk.Frame(root2) im2 = Image.open('tmp.png') img2 = ImageTk.PhotoImage(im2, master=root2) # img2 = ImageTk.PhotoImage(im2) label2 = Tk.Label(frame2, image=img2) label2.pack() frame2.pack() root.mainloop()

投稿2017/11/12 16:12

inainaina

総合スコア8

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

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

0

2番目以降のウィンドウはToplevel()でなければならないからでは回答になりませんか?

stackoverflow - tkinter.TclError: image “pyimage3” doesn't exist

stackoverflow - why python photoimages don't exist?

投稿2017/11/12 14:35

wakame

総合スコア1170

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

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

inainaina

2017/11/12 16:21

ご回答ありがとうございます! 頂いた参照先を参考にしつつ何とか解決できました。 Toplevel()で良さそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問