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

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

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

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

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

Python

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

Q&A

解決済

1回答

2942閲覧

Python Tkinter ウィジェット変数をfor文で作成したい

shinya117

総合スコア10

Tkinter

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

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

Python

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

0グッド

0クリップ

投稿2022/04/07 06:57

pythonで、Tkinter.ttkを用いて、GUIアプリを作成しています。

状況に応じて変化させるラベルをfor文で10個作成しました。

状況に応じて変化させるので、StringVar()を使い、初期値を設定しましたが、初期値が反映されず、ラベルが表示されません。
何がダメなのか、検証するために、Stringvarではなく、普通のtextで作成したところ、しっかり作成でき、Stringvarを使ったことによる問題だとわかりました。

下記コードを記載しますので、問題点がどこにあるか教えていただきたいです。よろしくお願いいたします。

↓Stringvarを使ったコード

Python

1from tkinter import ttk 2from tkinter import StringVar 3import tkinter 4 5root = tkinter.Tk() 6root.title('discord Push') 7root.geometry('1000x600') 8root.attributes('-topmost',True) 9style = ttk.Style() 10style.theme_use('vista') 11 12ydistans = 0 13 14for i in range(10): 15 state = StringVar(value = '未接続') 16 17 label = ttk.Label(root,textvariable=state) 18 label.place(x=100,y=ydistans) 19 20 ydistans += 25 21 22root.mainloop() 23

↓Stringvarを使っていないコード

python

1from tkinter import ttk 2from tkinter import StringVar 3import tkinter 4 5root = tkinter.Tk() 6root.title('discord Push') 7root.geometry('1000x600') 8root.attributes('-topmost',True) 9style = ttk.Style() 10style.theme_use('vista') 11 12ydistans = 0 13 14for i in range(10): 15 16 label = ttk.Label(root,text='未接続') 17 label.place(x=100,y=ydistans) 18 19 ydistans += 25 20 21root.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

StringVar をリスト等別の場所に保持するようにしてください。

Tkinter の 非ウィジェット(PhotoImage や StringVar等) は、
デストラクタで解放される為、何処かに参照を保持する必要があります。

for 文を使ったコードでは2巡目以降も同じ変数へ上書きしている為、
前のループで生成した StringVar が破棄され、最後のStringVarのみが有効になってる状態です。

投稿2022/04/07 07:33

teamikl

総合スコア8681

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

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

shinya117

2022/04/07 11:32

ご回答ありがとうございます。 大変お手数ですが、 サンプルコードをいただけないでしょうか。
teamikl

2022/04/07 12:16 編集

質問のコードに適応するなら # for 文の前でリストを作成し state_list = [] # for 文の中でリストに追加 state_list.append(state) 質問のコードでは全てグローバル変数ですが、 関数内に書く際は、変数の有効範囲に注意してください。 state_list がローカル変数の場合は、その関数を抜けた際に中の StringVar 達も破棄されます。
shinya117

2022/04/07 13:09

ご丁寧にありがとうございます。 ローカル変数、グローバル変数の視点が抜けておりましたので、大変参考になりました。 この度は本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問