Tkinter、Python。使用 for 循环创建滑块时,它卡在最后一个索引处

问题描述 投票:0回答:1

当我创建一个 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是因为我在第一次创建它时打印它
其他的是当我尝试更改每个滑块时

python tkinter
1个回答
0
投票

您可以将

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()

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.