環境
Python 3.13
Tkinterインストール済み
「遅延評価」によっておきるバグ
Tkinterでフレーム等を使いリストを表示し、その中のボタンにfor文でコマンドを設定したら、for文のカウントと一致せずにコマンドが設定されてしまうことがあります(下は例のコードです)
import tkinter as tk
root = tk.Tk()
root.geometry("500x300")
button = []
for i in range(5):
button.append(
tk.Button(
root,
text=str(i),
command=lambda:print(i)
)
)
button[-1].pack(fill="x")
root.mainloop()
# 0,1,2,3,4いずれのボタンを押しても4がprintされてしまう
解決方法
commandの引数を変えましょう
import tkinter as tk
root = tk.Tk()
root.geometry("500x300")
button = []
for i in range(5):
button.append(
tk.Button(
root,
text=str(i),
- command=lambda:print(i)
+ command=lambda count=i:print(count)
)
)
button[-1].pack(fill="x")
root.mainloop()
# きちんと押したボタンの数字がprintされる