Python tkinter - Создание меток и их удаление - PullRequest
0 голосов
/ 28 мая 2020

Я хочу создать несколько ярлыков один под другим при нажатии кнопки (Создать), а затем удалить все ярлыки в одном экземпляре при другом нажатии кнопки (Удалить).

Сейчас я думаю о создании несколько имен для ярлыков - каждое имя создается одним щелчком мыши. Итак, если я нажму кнопку n раз, я получу n имен: myLabel1, myLabel2, ..., myLabeln

Затем, когда я нажму кнопку Удалить, у меня будет что-то вроде - myLabel1.destroy (), myLabel2 .destroy (),. . . myLabeln.destroy ()

Я борюсь с присвоением этих имен меткам в форме - myLabel1 = tk.Label, et c. Я думаю о функции eval в MATLAB. Есть ли что-нибудь подобное для Python?

Есть ли лучший способ делать то, что я хочу делать?

Если я использую метод .pack (), я получаю свои ярлыки один под другим. Но все они присвоены только myLabel (поскольку я использую myLabel = tk.Label). И когда я использую myLabel.destroy (), удаляется только последний экземпляр метки.

Код с .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()

Но поскольку при этом удаляется только последняя созданная метка, я попробовал метод, упомянутый в начале -

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 l oop, et c.

Пожалуйста, посоветуйте.

Спасибо

R

1 Ответ

1 голос
/ 28 мая 2020

Вы можете использовать этот скрипт: текст каждой метки хранится в переменных метки.

Вместо того, чтобы назначать переменную для каждой метки, вы можете воссоздать одну метку в новой строке, но добавив ее в массив или что-то в этом роде, которое может содержать все метки, поэтому вы можете удалить каждую из них, когда захотите.

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()

Заполните поле ввода и нажмите кнопки.

Вы можете использовать сетка для организации окна. В этом случае для удаления меток используйте 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()
...