python - 重命名文本后如何摆脱标签?
问题描述
所以我有一个标签,当按下按钮时,它会更改文本的名称以在现有标签下方显示另一个标签。它几乎只是在下面的行上打印具有不同文本的相同标签。按下删除文本按钮时,它将删除已创建的新标签,但如何删除新标签之前的标签?我也只能通过销毁删除标签,不要忘记。
我尝试将变量的文本更改回它在窗口上显示的内容,但似乎一旦名称更改,标签在 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()
当我在输入框中输入我想要的内容并按打印文本时,我希望它创建一个标签。每次按打印文本时,我都希望它在旧标签下创建一个新标签。当我按下删除项目时,我希望它删除我创建的标签。当我一直按删除项目时,我希望它继续删除标签。
解决方案
问题:一旦标签的文本被重命名,如何摆脱标签?
定义一个
class
包含Label
.
这里我们使用class LabelListbox
which 继承自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
推荐阅读
- karate - 空手道 driver.url 不捕获窗口位置中的内容
- jquery - 如何使用 JQuery 创建相同数量的输入字段并从可用列表项中获取数据?
- python - 如何防止我的机器人获得角色
- angular - Angular mat-tab:仅加载初始选定选项卡的内容
- c# - 如何使用'LibGit2sharp'获取有关每个提交的git分支信息
- mongodb - 如何在 macbook 上运行 mongo 导出?
- c# - C# - Unity - 参数传递问题
- angular - npm 版本只是主要的(没有次要/补丁部分)
- javascript - 更改选择选项时如何获取对象值 - Angular9
- winapi - 在 Windows 上与用户客户端进行自定义软件驱动程序通信