2015-02-10 108 views
0

的結果參見下面的代碼片段:獲得()不能夠得到複選框

def choose_ID(): 
    import ttk 
    global single_ID 
    id = BooleanVar() 
    toplevel = Toplevel() 
    label1 = Label(toplevel, text = "Choose a User ID.", width = 40).pack(anchor=W, pady=5) 
    for items in range(len(single_ID)): 
     id = Checkbutton(toplevel, text=single_ID[items], variable=single_ID[items]) 
     id.pack(anchor=W, padx=5) 
    single_run_but = Button(toplevel, text = "Run", width=10, height=1, command=run_command).pack(anchor=S, pady=5) 
    id.get() 

其目的是打開一個彈出窗口,與一些複選框(數量可能會從1什麼100),其中包含已從腳本中的較早版本傳遞給函數的用戶標識。

問題出在最後的id.get()行。當它運行它的錯誤,說「檢查按鈕實例沒有屬性」得到'「

我需要改變,以便能夠記下哪個複選框已被檢查(它可能只有一個或多個框)?

非常感謝, 克里斯。

回答

2

最後一次設置id位於for循環中。在此期間,您將id設置爲checkbutton,但沒有get()方法。

你想要做的是使用與相關聯的get()方法,該方法與checkbutton至variable屬性相關聯。您可以將這些變量的引用保留在列表中。我已經做了一個小例子來說明如何動態創建checkbutton並仍然能夠獲取它們的值。

from Tkinter import * 

def run_command(): 
    selected_ids = [] 
    for i, id_var in enumerate(id_var_list): 
     if id_var.get(): 
      selected_ids.append(id_list[i]) 
    print selected_ids 

root = Tk() 
Label(root, text = "Choose a User ID.", width = 40).pack(anchor=W, pady=5) 

id_list = ['ID1', 'ID2', 'ID100'] 
id_checkbutton_list = [] 
id_var_list = [] 

for item in id_list: 
    id_var = IntVar() 
    id_checkbutton = Checkbutton(root, text=item, variable=id_var) 
    id_checkbutton.pack(anchor=W, padx=5) 

    id_var_list.append(id_var) 
    id_checkbutton_list.append(id_checkbutton) 

Button(root, text = "Run", width=10, height=1, command=run_command).pack(anchor=S, pady=5) 

root.mainloop() 
+0

謝謝@fhdrsdg,這都是好東西!你如何將id_var.get()給你的0或1翻譯回用戶ID,以便在其他地方執行? – user3514446 2015-02-10 16:47:44

+0

我編輯了'run_command()'來獲取選擇的用戶標識符。 – fhdrsdg 2015-02-10 18:25:55

+0

太棒了!謝謝@fhdrsdg! – user3514446 2015-02-11 09:52:42