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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1424閲覧

python, tkinter:複数のスピンボックスをfor文で作成したとき,いくつかが連動してしまう

55tea

総合スコア7

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/08/06 02:13

前提・実現したいこと

初心者ですがよろしくお願いします。

Python,tkinterを使って,GUIからパラメータの効果を確認する簡単なアプリを作成しようとしています。
パラメータの設定値はスピンボックスから変更できるようにと考えました。
パラメータがいくつかあるので,for文で記述することにしました。

実現したいこととしては,それぞれが独立したスピンボックスをfor文のような繰り返し処理で作成することです。

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

・スピンボックスの初期値などについて,最終インデックス番号の条件が適用されている
・スピンボックスの値を操作すると,いくつかのスピンボックスが連動してしまう
(下記のソースコードを実行すると,同列のスピンボックスが連動します)

該当のソースコード

Python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4 5#スピンボックスの設定 6spin_box_num = 3 #スピンボックス群の数 7spin_box_par_num = 5 #1つのスピンボックス群のパラメータ数 8 9spb_txt = [[0] * spin_box_par_num] * spin_box_num #リストを仮の値で作成 10spb_from = [[0] * spin_box_par_num] * spin_box_num 11spb_to = [[0] * spin_box_par_num] * spin_box_num 12spb_inc = [[0] * spin_box_par_num] * spin_box_num 13var_spinbox = [[0] * spin_box_par_num] * spin_box_num 14spb= [[0] * spin_box_par_num] * spin_box_num 15 16#スピンボックス群のそれぞれのパラメータ範囲 17spb_txt[0] = ["イタレ1", "係数A1", "係数B1", "係数C1", "オフセット1"] 18spb_from[0] = [1, 2, 3, 4, 5] 19spb_to[0] = [51, 51, 51, 51, 51] 20spb_inc[0] = [2, 2, 2, 2, 2] 21 22spb_txt[1] = ["イタレ2", "係数A2", "係数B2", "係数C2", "オフセット2"] 23spb_from[1] = [6, 7, 8, 9, 10] 24spb_to[1] = [51, 51, 51, 51, 51] 25spb_inc[1] = [2, 2, 2, 2, 2] 26 27spb_txt[2] = ["イタレ3", "係数A3", "係数B3", "係数C3", "オフセット3"] 28spb_from[2] = [11, 12, 13, 14, 15] 29spb_to[2] = [51, 51, 51, 51, 51] 30spb_inc[2] = [2, 2, 2, 2, 2] 31 32 33#スピンボックスのcommandで実行される関数 34#どのスピンボックスが操作されたか確認 35def upd_spinbox(num): 36 def x(): 37 print(str(num)+"が押されました") 38 return x 39 40 41#GUI部分 42root = tk.Tk() 43root.title("Window title") 44 45#入力値 46for i in range(spin_box_num): 47 for j in range(spin_box_par_num): 48 var_spinbox[i][j] = tk.IntVar() 49 50#フレーム 51frame0 = tk.Frame(root, bd=2, relief="ridge") 52frameX = frame0 53 54#スピンボックスをfor文で作成 55for j in range(spin_box_num): 56 for i in range(spin_box_par_num): 57 58 tk.Label(frameX, text=spb_txt[j][i]).grid(row=2*j,column=i) 59 spb[j][i] = tk.Spinbox(frameX, from_=spb_from[j][i], to = spb_to[j][i], increment = spb_inc[j][i], textvariable = var_spinbox[j][i], command = upd_spinbox(10*j + i + 1)) 60 spb[j][i].grid(row=1+2*j, column=i) 61 62 63frame0.grid(row=0, column=0) 64 65root.mainloop()

試したこと

インターネットで調べた感じでは,スピンボックスが記述されるタイミングでの問題かと思います。
ただ,いかんせん初心者なので対策の想像がつきません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

-追記-

参考記事で非常にわかりやすいものがあったので追加。

pythonで空の多次元配列


spb_txt = [[0] * spin_box_par_num] * spin_box_num(b=[[0]*a]*a)という書き方は望ましくありません。

代入を行う際、下記コードのように子リスト全ての値を変えてしまうため、バグの原因になります。

python

1lst=[[0]*3]*3 2print(lst) #[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 3lst[0][0]=1 4lst #[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

そのため、以下のようにするのが望ましいでしょう。

python

1#for文を使って多次元リストを作る 2spb_txt = [[0] * spin_box_par_num for i in range(spin_box_num)] #リストを仮の値で作成 3spb_from = [[0] * spin_box_par_num for i in range(spin_box_num)] 4spb_to = [[0] * spin_box_par_num for i in range(spin_box_num)] 5spb_inc = [[0] * spin_box_par_num for i in range(spin_box_num)] 6var_spinbox = [[0] * spin_box_par_num for i in range(spin_box_num)] 7spb= [[0] * spin_box_par_num for i in range(spin_box_num)]

参考記事:2次元リスト(配列)

投稿2019/08/06 05:08

編集2019/08/07 23:38
amahara_waya

総合スコア1029

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

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

55tea

2019/08/06 05:58

なるほど。理解できました。 ど素人の私が直感で理解するには難しい概念?でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問