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

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

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

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

Tkinter

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

2632閲覧

tkinterのbuttonをfor文で一括して書きたいが、逐次書くのと同値なはずのコードが動作しない

tanaka_shota

総合スコア19

Python 3.x

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

Tkinter

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2019/07/02 18:05

前提・実現したいこと

tkinterでbuttonを設置しようとしています。
複数の画像つきbuttonを設置したいので、for文を用いて処理したいのですが、逐次書いた場合とfor文で書いた場合で結果が異なります。

該当のソースコード

import tkinter as tk root = tk.Tk() root.title("Equity Calculater") root.geometry("800x600") c1 = tk.PhotoImage(file="card/1c.png", master = root) button = tk.Button(root, image=c1, command="pushed") button.grid(row=0, column=0) d1 = tk.PhotoImage(file="card/1s.png", master = root) button = tk.Button(root, image=d1, command="pushed") button.grid(row=1, column=0) h1 = tk.PhotoImage(file="card/1d.png", master = root) button = tk.Button(root, image=h1, command="pushed") button.grid(row=2, column=0) s1 = tk.PhotoImage(file="card/1h.png", master = root) button = tk.Button(root, image=s1, command="pushed") button.grid(row=3, column=0)

このコードは正しく動作しますが、

deck = ['card/1c.png', 'card/1d.png', 'card/1h.png', 'card/1s.png'] photo = ['c1', 'd1', 'h1', 's1'] for i, (photo_, deck_) in enumerate(zip(photo,deck)): photo_ = tk.PhotoImage(file=deck_, master = root) button = tk.Button(root, image=photo_, command="pushed") button.grid(row=i, column=0)

とすると、表示されるボタンは"s1"のみで、他は画像が表示されません。

補足情報(FW/ツールのバージョンなど)

逐次書いた場合の結果の画像:
イメージ説明
for文で書いた場合の結果の画像:
イメージ説明

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

photo_がGCに連れて行かれるとだめというパターンな気がします。なんでもいいので参照を残すようにしてみてください。

listに突っ込むパターン

python

1# ... 2_photo_references = [] 3for i, (photo_, deck_) in enumerate(zip(photo,deck)): 4 photo_ = tk.PhotoImage(file=deck_, master = root) 5 _photo_references.append(photo_) 6 # ... 7

http://lrcgf.hatenablog.com/entry/2013/06/30/222918

投稿2019/07/02 18:52

hayataka2049

総合スコア30933

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

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

tanaka_shota

2019/07/02 19:54

ありがとうございます。この通りにするとうまく動作しました。GCなんて勝手な機能があるとは知りませんでした…
hayataka2049

2019/07/02 20:43

GCが勝手にやってくれるから快適にプログラミングできる側面もあります。 (C言語で適切にfreeする苦労に比べれば。) どちらかといえばtkinterの作りが悪いという気も……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問