Как убрать текст с метки, когда флажок не проверяется? - PullRequest
0 голосов
/ 12 мая 2018

Я работаю над этим кодом. Я хочу, чтобы он отображал текст с кнопки-флажка на ярлыке, а также удалял текст, когда кнопка-флажок не проверяется. Первый вопрос: я не могу удалить его, так каксистемные ответы

TypeError: индексы списка должны быть целыми или кусочками, а не str

другой вопрос - я хочу сделать кнопку перемешивания, которая может перетасовывать текст вthe label.i попробовал random.shuffle(), но, похоже, не работает.заранее спасибо !!

import tkinter as tk
import random

window = tk.Tk()
checkbutton_frame = tk.Frame(window)
checkbutton_frame.grid(column=0, row=1)
contentvar = tk.StringVar()
label = tk.Label(window, textvariable=contentvar,
                 bg='white', font=('Arial', 10), width=20, height=20, wraplength=50)
label.grid(column=6, row=1, padx=20,
           pady=20, columnspan=2)

cb_list = ['ray', 'kevin', 'jacky']
cb_vars = []
checked = []  
check_list = 1

def display():
    for text, var in zip(cb_list, cb_vars):
        if var.get():
            checked.append(text)
            contentvar.set(list(set(checked)))
        else:
            for i in checked:
                del checked[i]

def shuffle():
    random.shuffle(checked)

for r, element in enumerate(cb_list):
    var = tk.BooleanVar(window, False)
    cb = tk.Checkbutton(checkbutton_frame, variable=var,
                        text=element, command=display)
    cb.grid(column=check_list, row=r, sticky='w')
    cb_vars.append(var)

shuffle_button = tk.Button(window, text='SHUFFLE', command=shuffle)
shuffle_button.grid(column=8, row=2)

window.mainloop()

1 Ответ

0 голосов
/ 12 мая 2018

В функции display() у вас есть:

    else:
        for i in checked:
            del checked[i]

, но флажок - строка, поэтому я буду строкой.Попробуйте:

for i, dummy in enumerate(checked):

Было еще несколько вещей: функция display() добавляет в список checked проверенные элементы, даже если они уже есть.Похоже, что удаление не работает.Вы не можете видеть, что у вас есть много предметов, поскольку вы пропускаете их через set, прежде чем загружать их в метку, так как set не допускает идентичные предметы.

Тогда вам следует установитьcontentvar после всей обработки, то есть последней в функции.Вот версия, которая работает:

def display():
    for text, var in zip(cb_list, cb_vars):
        if var.get():
            if text not in checked:
                checked.append(text)
        else:
            if text in checked:
                checked.remove(text)
    contentvar.set(checked)

Теперь тексты на этикетке отображаются в том порядке, в котором вы их там поместили.

Функция shuffle() прекрасно работает и перетасовывает список checked.Но вам также придется загрузить его на этикетку:

def shuffle():
    random.shuffle(checked)
    contentvar.set(checked)
...