2013-07-24 3 views
2

Использование python и tkinter У меня есть приложение, которое динамически создает множество флажков (около 40), и я хотел бы добавить еще один, который их преследует, который может проверить все checkboxes«Отметьте все флажки» Флажок в Python

Примером этого является электронная почта ..., когда вы хотите удалить большое количество сообщений электронной почты, вы можете проверить флажки «Выбрать все».

Вопрос: как добавить эту функциональность в мое приложение для графического интерфейса python. Я думаю, что это связано с 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

Я принимаю это ключевое слово здесь 'button [button] .set (True)' это тоже изменяет переменную, назначенную кнопкам проверки? –

+0

@ DCA- Да для обоих ваших заявлений. 'buttons [button]' дает переменную (BooleanVar), которая идет с 'button'. Я сделал словарь, чтобы его ключи были экземплярами кнопок, а значения - соответствующими BooleanVars. – 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() 

Я знаю, что это не очень чистой, чтобы использовать глобальные переменные, но я в настоящее время ленив, чтобы попасть в ООП.

Смежные вопросы