2013-07-24 18 views
2

使用python和tkinter我有一個應用程序動態地創建大量的複選框(大約40),我想添加另一個先於它們的可以檢查所有複選框在Python中檢查所有框的複選框

一個例子是在電子郵件中...當你想刪除大量的電子郵件時,你可以選中'全選'複選框。

我的問題是如何將此功能添加到我的python GUI應用程序。我認爲這是與chk_btn.config(state=""),但我不知道

任何和所有幫助表示讚賞!

回答

2

動態創建複選框通常是一個壞主意。它可能導致諸如丟失按鈕軌跡等問題。不過,我寫了這個小腳本應該演示如何做你想要的:

from Tkinter import * 

root = Tk() 

# Create a dictionary where the keys are the checkbuttons 
# and the values are their BooleanVars 
buttons = dict() 
for _ in xrange(10): 
    buttons[Checkbutton(root)] = BooleanVar() 

for button in buttons: 
    # Place each button on the window 
    button.grid() 
    # Hook each button up to its BooleanVar 
    button.config(variable=buttons[button]) 
    # Set each BooleanVar to True 
    buttons[button].set(True) 

# I printed this just to show what is going on 
print buttons 

root.mainloop() 

什麼失去按鈕的軌道節省了我是我提出來存儲他們和他們的BooleanVars字典。如果你想訪問一個按鈕或它的變量,你可以在該字典中找到它。

+0

我認爲這裏的關鍵部分是'buttons [button] .set(True)'這是否也改變了分配給檢查按鈕的變量? –

+0

@ DCA-對你的兩個陳述都是肯定的。 'buttons [button]'產生與'button'一致的變量(BooleanVar)。我讓字典的鍵是按鈕實例和值是它們合適的布爾值。 – iCodez

1

任何有興趣 - 無視我得到了答案(哎呦),用這個:

from tkinter import * 
root = Tk() 
frame = Frame(root).grid() 

class state: 
    def read_states(): 
     arry = list(map(lambda var: var.get(), states)) 
     for n in range(len(arry)): 
      print(arry[n]) 
     print('----') 
    def change_states(x): 
     for n in range(len(folder1)): 
      x[n].set(1) 
    def clear_states(): 
     for n in range(len(states)): 
      states[n].set(0) 
states = [] 
bgs = [] 
folder1 = [] 
folder2 = [] 
folder_break = [] 
for n in range(10): 
    var = IntVar() 
    chk = Checkbutton(frame, text=n+1, variable=var) 
    chk.grid(row=n+3) 
    if n < 5: 
     folder1.append(var) 
    else: 
     folder2.append(var) 
    states.append(var) 


btn_2 = Button(frame, text='Change', command=lambda w=folder1: state.change_states(w)) 
btn_2.grid(row=1) 
btn_3 = Button(frame, text='Change2', command=lambda w=folder2: state.change_states(w)) 
btn_3.grid(row=1, column=1) 
btn_4 = Button(frame, text='Clear', command=state.clear_states) 
btn_4.grid(row=2) 
btn = Button(frame, text='GO', command=state.read_states) 
btn.grid(row=0) 

root.mainloop() 

這給了我更多的自由和控制,並通過第一個答案的啓發。再爲該

謝謝:)

0

這裏是我如何解決它使用checkbutton選擇/取消所有的複選框:

import Tkinter as tk 

def select_clear_states(): 
    global Vars, all_states 
    states = all_states.get() 

    if states == 0: 
     for i in range(len(Vars)): 
      Vars[i].set(0) 
    if states == 1: 
     for i in range(len(Vars)): 
      Vars[i].set(1) 

Vars = [] 

root = tk.Tk() 

all_states = tk.IntVar() 
select_all = tk.Checkbutton(root, text = "select/deselect all", 
          variable = all_states, command = select_clear_states) 
select_all.grid(row = 0, column = 0, padx = 5, pady = 1) 

for n in range(10): 

    var = tk.IntVar() 
    Vars.append(var) 
    checkbox = tk.Checkbutton(root, text = n+1, variable= Vars[n]) 
    checkbox.grid(row = n+1, column = 0, padx = 5, pady = 1)  

root.mainloop() 

我知道這是不是很乾淨使用全局變量,但我目前懶得進入OOP。