在 TKinter 中实例化 StringVar 时的默认值('value=')如何会导致将该 StringVar 作为字典键处理时出现问题?

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

我有一个字典字典,用于设置一组单选按钮的一组滑块(Scale() 对象)的值,并且希望首先设置字典中的值,然后调用请求的位置键中的适当值。以下是字典的设置方式:

attributes_list = ['Gap','Power','Eye','AvK','Babip','Speed','Steal','BR','Def']
position_list = ['C','1B','2B','3B','SS','LF','CF','RF','DH']
team_weights = {}
for position in position_list:
    pos_dict = {}
    for attribute in attributes_list:
        pos_dict[attribute] = tk.DoubleVar(value=100)
    team_weights[position] = pos_dict

滑块的实例化需要有一个字典来从中提取值,因此需要在声明字典之后定义:

current_position = tk.StringVar(value="DH")

这是单选按钮调用的用于设置和调用数据的函数:

def update_sliders(position):
    old_position = current_position.get()
    team_weights[old_position]['Babip'].set(babipSlider.get())
    team_weights[old_position]['AvK'].set(avkSlider.get())
    team_weights[old_position]['Power'].set(powerSlider.get())
    ...etc.

    current_position.set(position)
    babipSlider.set(team_weights[position]['Babip'].get())
    avkSlider.set(team_weights[position]['AvK'].get())
    powerSlider.set(team_weights[position]['Power'].get())
    eyeSlider.set(team_weights[position]['Eye'].get())

最后,实例化单选按钮,并设置调用 update_sliders 函数的命令,并使用新位置的参数:

currentPositionDHRadioButton = tk.Radiobutton(canvas, text="DH", value="DH", state='normal', command=lambda:update_sliders('DH'))
currentPositionDHRadioButton.grid(column=4,row=17)

因此,理论上 - 当按下按钮时,它应该将数据保存在与先前按下的单选按钮关联的字典中,然后使用已保存在字典中的新单选按钮的数据更新屏幕 GUI。这适用于每个单选按钮,但原始 'current_position = tk.StringVar(value="")' 声明列为默认值的单选按钮除外。对于此单选按钮,滑块保持在之前所在的位置。先前的值已正确保存在字典中,但调用不起作用 - 仅适用于设置为默认位置的按钮。

所以看起来字典声明过程应该正常工作,更新滑块调用也应该正常工作,但是声明默认值的一些问题导致了问题。我检查了 TKinter 文档,但找不到任何具体的原因。有什么想法吗??

我尝试用不同的值替换初始声明,在设置为默认值的单选按钮(或其他单选按钮)上调用 select() 函数,但它们都会导致相同的错误:设置为默认值的值不被召回。

python tkinter instantiation
1个回答
0
投票

对于后代 - 一个小小的解决方法(一个 hacky 实现的 hack?)给出了更好的结果。我认为主要问题是滑块变量的定义是对默认位置的引用,这意味着直接在

update_sliders()
中更改变量实际上总是会暂时更改字典的值,键为默认位置 - 导致不可预测的结果。

解决方案是使用“temp”值定义滑块的

variable=
值,然后直接在
update_sliders()
中设置,以便滑块的状态值将与每个位置的存储值离散。此外,实现一个“python 本机”字符串变量来存储先前的位置,直到它在
update_sliders()
结束时更新,从而允许正常实现 RadioButtons 的
variable=
参数。

谢谢大家!!

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