Удалить ярлык в другом - PullRequest
       37

Удалить ярлык в другом

0 голосов
/ 18 апреля 2019

Совсем недавно с Python 3 и написанием моего первого приложения в tkinter.

У меня есть создание ярлыка, если ваучер (число) находится вне диапазона, макс. И мин. Однако, если я сначала выйду за пределы диапазона, а затем изменю свой номер, я хотел бы удалить ярлык в начале моего остальной код.

Я пробовал с Label.delete, Label.destroy, но только с ошибками.

if int(voucher.get()) > int(maxN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)
    textbox.configure(state="disabled")

elif int(voucher.get()) < int(minN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)
    textbox.configure(state="disabled")

else:
    # I want to destroy Label here
    textbox.configure(state="normal")
    Label(root, text="All well")

Любая помощь приветствуется.

// Фред

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Это выбрасывает ошибки, потому что вы не назначили объект этим меткам. Если у них нет ссылки, как питон узнает, какую метку нужно уничтожить.

destroy() - это метод класса Label, который вы не можете вызвать просто Label.destroy(), если не создали объект для класса Label.

Например:

L = Label(root, text="Hello World")
L.pack()

# Now, we can destroy it by

L.destroy()

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

if int(voucher.get()) > int(maxN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    L1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
    L1.place(x=200, y=175)
    textbox.configure(state="disabled")

elif int(voucher.get()) < int(minN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    L2 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
    L2.place(x=200, y=175)
    textbox.configure(state="disabled")

else:
    L1.destroy()      # Label in if will destroy
    L2.destroy()      # Label in elif will destroy
    textbox.configure(state="normal")
    L3 = Label(root, text="All well")
0 голосов
/ 18 апреля 2019

Вы создали ярлыки, но не дали каждому ссылку / название ярлыка. Без ссылки вы не можете указать программе, какую метку удалить.

Вместо использования:

Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)

Вы должны использовать (например, с меткой Label1:):

Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
Label1.place(x=200, y=175)

Это создаст ярлык с именем ссылки / ярлыка 'Label1' Примечание. Я помещаю .place () в строку ниже, потому что, когда вы помещаете .place () в одну строку, как показано ниже:

Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)

Ссылка / метка Label1 устанавливается на то, что возвращается:

Label(root, text="The voucher " + str(voucher.get()) + " number is outside of   valid range").place(x=200, y=175)

поэтому он установлен в none, потому что .place () не возвращает none.

Чтобы уничтожить метку (например, Label1), вы используете Label1.destroy ().

Ваш улучшенный код:


if int(voucher.get()) > int(maxN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
    Label1.place(x=200, y=175)
    textbox.configure(state="disabled")

elif int(voucher.get()) < int(minN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
    Label1.place(x=200, y=175)
    textbox.configure(state="disabled")

else:
    Label1.destroy()
    textbox.configure(state="normal")
    Label2 = Label(root, text="All well")
    Label2.place(x=200, y=175)

Я рекомендую вам добавить:

if Label1.winfo_exists():
    Label1.destroy()

к вашему оператору else, так что код Label1.destroy () - это только запуск метки 1. Таким образом, если метка 1 никогда не создавалась, программа не пытается ее уничтожить.

Это сделает ваше утверждение else похожим на:

else:
    if Label1.winfo_exists():
        Label1.destroy()
    textbox.configure(state="normal")
    Label2 = Label(root, text="All well")
    Label2.place(x=200, y=175)
...