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

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

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

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

Q&A

解決済

1回答

213閲覧

二回目の実行で画像が開けない。jpyterhab

watr

総合スコア2

Python

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

0グッド

0クリップ

投稿2024/03/31 11:10

実現したいこと

この命令文をjpyterhabで実行すると一回目は新しいウィンドウに画像が添付されてうまくいくのですが、二回目連続して実行するとエラーメッセージが出てきて実行できません。連続しても実行できるようにするにはどうすればいいですか?

発生している問題・分からないこと

実行すると以下のようなメッセージが表示されます。

エラーメッセージ

error

1TclError Traceback (most recent call last) 2Cell In[4], line 10 3 6 frame.pack() 4 8 my_image = tk.PhotoImage(file = "images/radio1.png") #画像のコンストラクタを使用してインスタンスを作成 5---> 10 label = tk.Label(frame, image=my_image) 6 11 label.pack() 7 13 root.mainloop() 8 9File ~\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py:3232, in Label.__init__(self, master, cnf, **kw) 10 3214 def __init__(self, master=None, cnf={}, **kw): 11 3215 """Construct a label widget with the parent MASTER. 12 3216 13 3217 STANDARD OPTIONS 14 (...) 15 3230 16 3231 """ 17-> 3232 Widget.__init__(self, master, 'label', cnf, kw) 18 19File ~\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py:2648, in BaseWidget.__init__(self, master, widgetName, cnf, kw, extra) 20 2646 for k, v in classes: 21 2647 del cnf[k] 22-> 2648 self.tk.call( 23 2649 (widgetName, self._w) + extra + self._options(cnf)) 24 2650 for k, v in classes: 25 2651 k.configure(self, v) 26 27TclError: image "pyimage3" doesn't exist

該当のソースコード

jpyterhab

1import tkinter as tk 2 3root = tk.Tk() 4 5frame = tk.Frame(root) 6frame.pack() 7 8my_image = tk.PhotoImage(file = "images/radio1.png") 9 10label = tk.Label(frame, image=my_image) 11label.pack() 12 13root.mainloop()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

パスを打ち直したりしてみたのですが、一回目に実行する分には問題ないようです。

補足

使用しているのは最新のjpyterhabのデスクトップ版です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python+Tkinterの複数ウィンドウ生成時エラー と同じではないでしょうか。

解決方法は2つあって

  • Tk() でインスタンスを複数生成しない。(Tk()Toplevel() に変える)
  • PhotoImage(..., master=root) のように master を指定してやる。

master を指定しない場合、一番最初に生成された Tk() のインスタンスを指定したのと同じ意味になるので、質問のエラーが発生しています。

Tk インスタンスを複数生成すると、この手の問題がほかでも起こりがちなので、今後も tk の処理を増やす予定があるのなら、前者の対策のほうが良いと思います。

投稿2024/04/01 04:20

bsdfan

総合スコア4899

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

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

watr

2024/04/02 14:44

教えていただきありがとうございます! エラーが出なくなりました! 追加で質問いいでしょうか? Toplevel()でサブウィンドウを表示するとエラーが出なくなるのはどうしてでしょうか? また、master=rootと指定するとどうしてエラーを防げるのか具体的に教えてほしいです。 次から次へとすみません💦
bsdfan

2024/04/02 23:46

https://stackoverflow.com/questions/48045401 に詳しいです。 tkinter では Tk インスタンス毎に中で独立した環境(tclインタプリタが走っている)が作られます。 master オプションは、どの環境(tclインタプリタ)にそのオブジェクトを作るかを指定するものです。 指定しないと、最初に作った Tk 環境の中に作られるので、2番目の Tk インスタンスの環境からは見えません。逆に、master で 2番目の Tk インスタンスを指定してやると、2番目からは見えるけど1番目からは見えないものになります。 このあたりのことがややこしいので、あまりわからないうちは Tk インスタンスを複数作るのはやめたほうがいいという話になります。 Toplevel() では、新しい Tk インスタンスは作らずに、サブウィンドウを作るだけなので、上のような問題は発生しません。 質問者さんの場合 jupyter で作業されているので、セルを実行するたびに root=Tk() で新しい Tk インスタンスが生成されるので、master=root を指定してやる必要があります。(同じ root という名前ですが、違うものを指定していることになります)
watr

2024/04/05 12:38

つまり、root=Tk()を何回も実行すると、その分だけTkインスタンスが生成されるんですね。 自分は一つしかないように見えても、裏では複数できていたんですね。 とても説明が分かり易かったです。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問