繁体   English   中英

Python tkinter - 创建标签然后删除它们

[英]Python tkinter - Creating Labels and then deleting them

我想在单击按钮(创建)时在另一个下方创建多个标签,然后在单击另一个按钮(删除)时删除一个实例中的所有标签。

现在,我正在考虑为标签创建多个名称 - 每个名称都是通过单击创建的。 因此,如果我单击按钮 n 次,我将获得 n 个名称:myLabel1、myLabel2、...、myLabeln

然后,当我单击“删除”按钮时,我会看到类似的东西 - myLabel1.destroy(), myLabel2.destroy(), 。 . . myLabeln.destroy()

我正在努力以 -myLabel1 = tk.Label 等的形式将这些名称分配给标签。我正在考虑 Z8F6823ABD383A341BBF0D78EF38 中的 eval function。 Python 有类似的东西吗?

有没有更好的方法来做我想做的事?

如果我使用 .pack() 方法,我会得到一个低于另一个的标签。 但它们都只分配给 myLabel(因为我使用 myLabel = tk.Label)。 而当我使用 myLabel.destroy() 时,只删除了 label 的最后一个实例。

代码 with.pack() 和 myLabel 的单一用法,其中标签根据需要形成,但只删除最后一个:

import tkinter as tk
from tkinter import ttk
import tkinter.font as tkFont

root = tk.Tk()

def click():
    global myLabel
    myLabel = tk.Label(root, text = e.get())
    myLabel.pack(pady=10)
    e.delete(0,'end')

def delete():
    myLabel.destroy()

e = tk.Entry(root, width = 50)
e.pack(padx = 10, pady = 10)

CreateButton = tk.Button(root, text = 'Enter name', command = click)
CreateButton.pack(pady=10)

DeleteButton = tk.Button(root, text = 'Delete', command = delete)
DeleteButton.pack(pady=40)

root.mainloop()

但是由于这只会删除最后一个创建的 label,所以我尝试了我在开始时提到的方法 -

import tkinter as tk
from tkinter import ttk
import tkinter.font as tkFont

ii = 0

root = tk.Tk()

def click():
    global labelname, ii
    ii += 1
    labelname = 'myLabel' + str(ii)
    print(labelname)
    labelname = tk.Label(root, text = e.get()) # I wanted 'labelname' here to be 'myLabel1'
    e.delete(0,'end')

def delete():
#     for ii in range(1,max(ii)):
    labelname.config(text = '') # I wanted 'labelname' here to be 'myLabeln' in a for loop going from 1 to n

e = tk.Entry(root, width = 50)
e.pack(padx = 10, pady = 10)

CreateButton = tk.Button(root, text = 'Enter name', command = click)
CreateButton.pack(pady=10)

DeleteButton = tk.Button(root, text = 'Delete', command = delete)
DeleteButton.pack(pady=40)

root.mainloop()

也许我以一种非常复杂的方式来处理它,并且有一种更简单的方法而不使用 For 循环等。

请指教。

谢谢

R

您可以使用此脚本:每个 label 的文本都存储在 var 标签中。

您可以在新行中重新创建一个 label,而不是为每个 label 分配一个变量,但是通过将其添加到一个数组或类似的东西可以包含所有标签,因此您可以随时删除它们中的每一个。

from tkinter import *

win = Tk()                         # create the window

labels = []                        # no labels

def add_label():
    global labels, text
    labels.append(Label(win, text=text.get())) # append a label object to the list
    labels[-1].pack()              # draw the last label

def delete_all_labels():
    global labels
    for label in labels:           # delete all the labels
        label.pack_forget()
    labels = []

text = Entry(win)                  # add the entry
text.pack()

Button(win, text="Create new label", command=add_label).pack()
Button(win, text="Delete all the labels", command=delete_all_labels).pack()

win.mainloop()

填写条目并单击按钮。

您可以使用网格来组织 window。 在这种情况下,使用 grid_forget 而不是 pack_forget 来删除标签。

from tkinter import *

win = Tk()                         # create the window

labels = []                        # no labels

                                   # index for method grid()
rowIndex = 2                       # Set to 2 because of the
                                   # buttons and the entry.
                                   # this variable is used to increment
                                   # the y position of the labels so that
                                   # they are drawn one after the other,
                                   # and not on top of each other.

def add_label():
    global labels, text, rowIndex
    labels.append(Label(win, text=text.get())) # append a label object to the list
    rowIndex += 1                  # increment the y position

                                   # draw the added label
    labels[-1]\
            .grid(columnspan=2,    # for align in the middle.
                  row=rowIndex,    # y position specific to this label
                  pady=5)

def delete_all_labels():
    global labels
    for label in labels:           # delete all the labels
        label.grid_forget()        # one by one

    rowIndex = 2                   # reset the vars
    labels = []                    #

label=Label(win, text="Type the text :")
label.grid(column=0, row=0, padx=5)

text = Entry(win)                  # add the entry
text.grid(column=1, row=0, padx=5)
text.focus()                       # focus in entry

Button(win, text="Create new label", command=add_label)\
            .grid(column=0, row=1, padx=5)
Button(win, text="Delete all the labels", command=delete_all_labels)\
            .grid(column=1, row=1, padx=5)

win.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM