Переменная Tkinter Checkbutton - PullRequest
0 голосов
/ 16 мая 2018

Я не очень хорош в tkinter или даже в python, поэтому столкнулся с тем, что должно быть простой проблемой.

У меня есть что-то вроде этого в середине моего проекта:

visible = numLevels * [IntVar(value=1)]

top = Toplevel()
settingslabel = Label(top, text='Settings', height=0, width=100)

for i in range(0, numLevels ):
    check = ttk.Checkbutton(settingslabel, text='Level ' + str(i), variable=visible[i])
    check.grid(column = 0, row = i)
    check.var = visible[i]

settingslabel.grid(column = 0, row=0)

Я хочу иметь экран настроек с флажком для каждого уровня, сохраняя при этом массив целых чисел, которые представляют состояние каждой кнопки.

Однако все флажки синхронизированы.То есть, когда я отмечаю флажок, все остальные флажки также становятся отмеченными.Я полагаю, что это связано с полем «переменная» кнопки.Поскольку цикл продолжается, я обновляюсь, и в результате видимый [i] также изменяется.Я хочу сохранить переменную при создании кнопки.Я не понимаю, как tkinter / python работают достаточно хорошо, чтобы знать.

Число уровней может быть любым целым числом> 0 и определяется во время выполнения, поэтому я не могу просто развернуть цикл.

Есть ли лучший способ сделать это?Заранее спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Это дубликат этой ТАКОЙ записи, но объяснение ниже.

Это потому, что все ваши ящики используют один и тот же tkinter.Intvar() объект:

numlevels = 5
visible = numlevels * [IntVar(value = 1)]

for i in range(len(visible)):
    print (hex(id(visible[i]))

# Outputs:
'0x67f8190'
'0x67f8190'
'0x67f8190'
'0x67f8190'
'0x67f8190'

Решить: visible = [IntVar(value = 1) for i in range(numlevels)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...