简体   繁体   English

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

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

I want to create multiple labels one below the other upon button-click (Create) and then delete all labels in one instance upon another button-click (Delete).我想在单击按钮(创建)时在另一个下方创建多个标签,然后在单击另一个按钮(删除)时删除一个实例中的所有标签。

Right now I am thinking of creating multiple names for the labels - each name created on a single click.现在,我正在考虑为标签创建多个名称 - 每个名称都是通过单击创建的。 So if I click button n times, I will get n names: myLabel1, myLabel2,..., myLabeln因此,如果我单击按钮 n 次,我将获得 n 个名称:myLabel1、myLabel2、...、myLabeln

Then when I click the Delete button, I will have something like - myLabel1.destroy(), myLabel2.destroy(), .然后,当我单击“删除”按钮时,我会看到类似的东西 - myLabel1.destroy(), myLabel2.destroy(), 。 . . . . myLabeln.destroy() myLabeln.destroy()

I am struggling with assigning these names to labels in the form of - myLabel1 = tk.Label, etc. I am thinking in terms of the eval function in MATLAB.我正在努力以 -myLabel1 = tk.Label 等的形式将这些名称分配给标签。我正在考虑 Z8F6823ABD383A341BBF0D78EF38 中的 eval function。 Is there anything like that for Python? Python 有类似的东西吗?

Is there even a better way of doing what I want to do?有没有更好的方法来做我想做的事?

If I use the.pack() method, I get my labels one below the other.如果我使用 .pack() 方法,我会得到一个低于另一个的标签。 But they all are assigned to only myLabel (since I use myLabel = tk.Label).但它们都只分配给 myLabel(因为我使用 myLabel = tk.Label)。 And when I use myLabel.destroy(), only the last instance of label is deleted.而当我使用 myLabel.destroy() 时,只删除了 label 的最后一个实例。

Code with.pack() and single usage of myLabel where the labels are formed as needed, but only last one is deleted:代码 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()

But as this only deletes the last label that was created, I tried the method I mentioned at the start -但是由于这只会删除最后一个创建的 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()

Maybe I going about it in a very convoluted way and there is an easier way without using For loop, etc.也许我以一种非常复杂的方式来处理它,并且有一种更简单的方法而不使用 For 循环等。

Please advice.请指教。

Thank you谢谢

R R

You can use this script: the text of each label is stocked in var labels.您可以使用此脚本:每个 label 的文本都存储在 var 标签中。

Instead of assigning a variable for each label, you can recreate one label in a new row, but by adding it to an array, or something like that which can contain all the labels, so you can delete each of them whenever you want.您可以在新行中重新创建一个 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()

Fill the Entry and click buttons.填写条目并单击按钮。

You can use grid to organize the window.您可以使用网格来组织 window。 In this case, use grid_forget and not pack_forget to delete the labels.在这种情况下,使用 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