首页 > 解决方案 > 重命名文本后如何摆脱标签?

问题描述

所以我有一个标签,当按下按钮时,它会更改文本的名称以在现有标签下方显示另一个标签。它几乎只是在下面的行上打印具有不同文本的相同标签。按下删除文本按钮时,它将删除已创建的新标签,但如何删除新标签之前的标签?我也只能通过销毁删除标签,不要忘记。

我尝试将变量的文本更改回它在窗口上显示的内容,但似乎一旦名称更改,标签在 python 上不存在,但它仅存在于窗口上。

from tkinter import *

main = Tk()

NameList = []
counter = 0


def PrintText():

    #Globalising first and last name so that they can be used in other subroutines
    global name, counter, NameLabel

    #Defining the .get() function as something else to make it easier
    name = name_entry.get()

    NameList.append(name)
    NameLabel = Label(main, text=(NameList[0+counter]))
    NameLabel.grid(row=(counter+3))
    counter += 1

def DeleteText():

    global NameLabel, counter

    NameLabel.destroy()
    counter -= 1
    del NameList[counter]

def Name():
    #Globalising the labels and buttons so that they can be deleted later on
    global first_name_label, first_quit, next_button
    #
    name_label = Label(main, text="Name:")
    name_label.grid(row=0, column=0)
    #
    PrintTextButton = Button(main, text="Print Text", width=8, command=PrintText, bg="light blue")
    PrintTextButton.grid(row=2, column=0)
    DeleteTextButton = Button(main, text="Delete Text", width=8, command=DeleteText, bg="light blue")
    DeleteTextButton.grid(row=2, column=1)


name_entry = Entry(main)
name_entry.grid(row=0, column=1, columnspan=4)

errorName = StringVar()
Name()

当我在输入框中输入我想要的内容并按打印文本时,我希望它创建一个标签。每次按打印文本时,我都希望它在旧标签下创建一个新标签。当我按下删除项目时,我希望它删除我创建的标签。当我一直按删除项目时,我希望它继续删除标签。

标签: pythonpython-3.xtkinterlabel

解决方案


问题:一旦标签的文本被重命名,如何摆脱标签?

  • 定义一个class包含Label.
    这里我们使用class LabelListboxwhich 继承自tk.Frame.

    class LabelListbox(tk.Frame):
        def __init__(self, parent, *args, **kwargs):
            super().__init__(parent, *args, **kwargs)
    
  • 按排序顺序@property .labels返回Container 中的所有内容。 Label

    @property
    def labels(self):
        return sorted(self.children)
    
  • 向容器中添加一个新Label的,布局到列表的末尾

    def add_label(self, text):
        tk.Label(self, text=text).grid()
    
  • 更改由其索引引用text=的 a的 。Label

    def configure_text(self, idx, text):
        labels = self.labels
        if idx in range(0, len(labels)):
            self.children[labels[idx]].configure(text=text)
    
  • Label从容器中取出最后一个

    def remove_last(self):
        if self.labels:
            self.children[self.labels[-1]].destroy()
    
  • 删除Label给定索引处的 a。(从 0 开始)

    def remove_by_index(self, idx):
        labels = self.labels
        if idx in range(0, len(labels)):
            self.children[labels[idx]].destroy()
    
  • 删除所有可以找到Label给定的位置text

    def remove_by_text(self, text):
        for label in self.labels:
            if text in self.children[label]['text']:
                self.children[label].destroy()
    

用法:依次点击菜单项!

import tkinter as tk


class LabelListbox(tk.Frame):
    # Here define all of the above


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.menubar = tk.Menu(self)
        self.config(menu=self.menubar)

        lbl_listbox = LabelListbox(self)
        lbl_listbox.grid(row=0, column=0)

        for _ in range(4):
            lbl_listbox.add_label('This is Label {}'.format(_))

        self.menubar.add_command(label='Remove last',
                                 command=lbl_listbox.remove_last)

        self.menubar.add_command(label='Remove by index 1',
                                 command=lambda:lbl_listbox.remove_by_index(1))

        self.menubar.add_command(label='Change Label text"',
                                 command=lambda:lbl_listbox.
                                 configure_text(0, 'The text changed to Label 1'))

        self.menubar.add_command(label='Remove by text "Label 1"',
                                 command=lambda:lbl_listbox.remove_by_text('Label 1'))

if __name__ == '__main__':
    App().mainloop()

用 Python 测试:3.5


推荐阅读