2014-02-06 2 views
0

Я пытаюсь создать автономные Checkbuttons в цикле, но с тем же именем Checkbutton работает вместе. Я не знаю, где моя ошибка ...Tkinter, пытающийся генерировать Checkbutton в цикле

#!/usr/bin/env python 
#-*-coding:utf-8-*- 
import os 
from Tkinter import * 
import ttk 

def checkBoxText(st): 
    if st == 0: 
     st="Disabled" 
    if st == 1: 
     st="Enabled" 
    return st 

root = Tk() 

winSt={1:1,2:1,3:0,4:0} 
cbTexts={} 
cbVariables={} 
cb={} 
cb_x={ "1":"0.0", "2":"0.0", "3":"0.6", "4":"0.6" } 
cb_y={"1": "0.1", "2": "0.8", "3": "0.1", "4": "0.8"} 
for i in sorted(winSt.keys()): 
    cbTexts[i] = StringVar() 
    cbTexts[i].set(checkBoxText(winSt[i])) 
    cbVariables[i] = IntVar() 
    cbVariables[i].set(winSt[i]) 

    cb[i] = Checkbutton(root, text=cbTexts[i].get(), variable=cbVariables[i].get()) 
    cb[i].place(relx=cb_x[str(i)], rely=cb_y[str(i)], relheight=0.1,relwidth=0.4) 
mainloop() 
+0

Я не знаю, где ваша ошибка. Это поможет, если вы объясните свой ожидаемый результат по сравнению с фактическим результатом и любыми ошибками, которые вы можете получить. –

+0

Извините, я исправлю название и вопрос, потому что я написал поле со списком вместо кнопки проверки. Так что я понимаю, что вижу ошибку, когда создаю контрольные кнопки в цикле и задаю конфигурацию «переменная», и у кого есть такое же значение переменной, что они работают как одна контрольная кнопка. Возможно, мне нужно проверить контрольные кнопки после цикла, но как? cb ["1"]. Configure (variable = 1) это не работает. – empax

+1

Изменить 'variable = cbVariables [i] .get()' to 'variable = cbVariables [i]'. –

ответ

1

Проблема заключается в этой строке:

cb[i] = Checkbutton(..., variable=cbVariables[i].get()) 

При использовании атрибута variable, вы должны дать ему ссылку на объект переменной , а не значение, содержащееся в объекте. Измените код:

cb[i] = Checkbutton(..., variable=cbVariables[i]) 

Вы делаете несколько схожую ошибку с текстом контрольной кнопки. Вы создаете StringVar, но затем используете значение StringVar для текста checkbutton вместо фактической переменной. Синтаксически это правильно при использовании с атрибутом text, но он делает больше работы, чем нужно. Вы должны либо использовать атрибут textvariable, либо просто не создать StringVar.

Вот как использовать атрибут textvariable вместо атрибута text:

cb[i] = Checkbutton(root, textvariable=cbTexts[i], ...) 

Вам не нужно STRINGVAR вообще, если этот текст не изменится. Если это так, вы можете просто сделать это и сохранить пару строк кода:

cb[i] = Checkbutton(root, text=checkBoxText(winSt[i]), ...) 
Смежные вопросы