首页 > 解决方案 > 未选中检查按钮时如何从标签中删除文本?

问题描述

我正在处理此代码。我想让它显示标签上检查按钮的文本,并在未检查检查按钮时删除文本。第一个问题是我无法删除它,因为系统响应

TypeError:列表索引必须是整数或切片,而不是 str

另一个问题是我想制作一个随机播放按钮,它可以随机播放标签中的文本。我试过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()

标签: checkboxtkinterlabel

解决方案


display()您拥有的功能中:

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

但检查是一个字符串,所以我将是一个字符串。尝试:

for i, dummy in enumerate(checked):

还有一些事情:该函数display()会附加到已checked检查项目的列表中,即使它们已经存在。这使它看起来像删除不起作用。在将它们加载到标签之前,您看不到您必须将set它们放入标签中,set因为不允许相同的项目。

然后你应该设置contentvarafter all processing ,即函数中的最后一个。这是一个有效的版本:

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)

推荐阅读