2014-02-06 65 views
0

我想在循環中生成獨立的Checkbuttons,但是他們有相同名稱的Checkbutton一起工作。我不知道哪裏是我的錯......Tkinter,試圖在循環中生成檢查按鈕

#!/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

對不起,我糾正標題和問題,因爲我寫了組合框,而不是檢查按鈕。 所以我叮叮噹我看到錯誤,當我在循環中創建checkbuttons並設置「變量」配置和誰有相同的變量值,他們的工作就像一個checkbutton。 也許我必須檢查循環後的checkbutton,但如何? cb [「1」] .configure(variable = 1)this is not working。 – empax

+1

將'variable = cbVariables [i] .get()'改爲'variable = cbVariables [i]'。 –

回答

1

的問題是在這條線:

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

當您使用variable屬性,你必須給它一個變量對象的引用,而不是包含在對象中的值。將代碼更改爲:

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

您正在使checkbutton文本出現類似的錯誤。您正在創建一個StringVar,但是然後使用StringVar的值作爲checkbutton文本而不是實際變量。語法上與text屬性一起使用時是正確的,但它的工作量比需要的多。您應該使用textvariable屬性,或者簡單地使用而不是創建一個StringVar。

下面是如何使用的,而不是text屬性textvariable屬性:

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

你不需要STRINGVAR在所有如果這段文字永遠不會改變。如果是這樣的話,你可以這樣做,並保存幾行代碼:

cb[i] = Checkbutton(root, text=checkBoxText(winSt[i]), ...)