当我创建一个 for 循环在 tkinter 中创建 6 个滑块并将其值存储到列表中时,当我控制任何滑块时,for 循环的索引保持在最后一个(数字 6)。
我猜我存储的值确实会改变。然而,索引没有,让我无法命令它做其他事情。
这是我的代码
import tkinter as tk
from tkinter import ttk
root = tk.TK()
root.geometry('700x700')
Joint_param = {}
Joint_param["J1"] = [0, -120, 120]
Joint_param["J2"] = [10, -70, 90]
Joint_param["J3"] = [20, -120, 60]
Joint_param["J4"] = [30, -90, 90]
Joint_param["J5"] = [40, -140, 140]
Joint_param["J6"] = [50, -180, 180]
slider_value = []
for i in range(6):
self.slider_value[i].append(tk.DoubleVar())
for i in range(6):
slider[f'{i+1}'] = ttk.Scale(self.frame_control, from_=Joint_param[f'J{i+1}'][2], to=Joint_param[f'J{i+1}'][1], orient=tk.VERTICAL, variable=slider_value[i], command = lambda x: slider_ctrl(i))
命令滑块_ctrl:
这里我尝试打印索引值来查看问题
def slider_ctrl(index):
print(index)
slider_value[index].set(round(float(slider_value[index].get()),2))
结果:
0
1
2
3
4
5
5
5
5
5
5
5
从0到5是因为我在第一次创建它时打印它
其他的是当我尝试更改每个滑块时
您可以将
i
的当前值作为 lambda 函数中的默认参数传递,这将在每次迭代中冻结 i
的值。
例如:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('700x700')
Joint_param = {
"J1": [0, -120, 120],
"J2": [10, -70, 90],
"J3": [20, -120, 60],
"J4": [30, -90, 90],
"J5": [40, -140, 140],
"J6": [50, -180, 180]
}
# Frame for controls
frame_control = tk.Frame(root)
frame_control.pack()
# Initialize sliders and values
slider_value = []
sliders = []
# Function to handle slider value change
def slider_ctrl(index):
print(f"Slider {index + 1} value: {slider_value[index].get()}")
slider_value[index].set(round(float(slider_value[index].get()), 2))
# Create sliders in a loop
for i in range(6):
# Init DoubleVar for each slider
var = tk.DoubleVar(value=Joint_param[f"J{i + 1}"][0])
slider_value.append(var)
# create and pack each slider
slider = ttk.Scale(
frame_control,
from_=Joint_param[f'J{i+1}'][2],
to=Joint_param[f'J{i+1}'][1],
orient=tk.VERTICAL,
variable=var,
command=lambda x, idx=i: slider_ctrl(idx) # Pass idx as default arg
)
slider.grid(row=0, column=i, padx=10)
sliders.append(slider)
root.mainloop()
希望这有帮助。