Как удалить 1 ярлык при добавлении другого - python tkinter

Довольно новый для Python. Я использую меню параметров, и к ним прикреплены ярлыки:

from tkinter import *
root=Tk()

def f(s):
    if s=="btn":
        one=Label(root,text="one blah blah")
        one.grid(column=1,row=2)
    if s=="btn2":
        two=Label(root,text="two")
        two.grid(column=1,row=2)


v=StringVar(root)
v.set("f")
a=OptionMenu(root,v,"btn","btn2",command=f)
a.grid(column=1,row=1)

root.configure()
root.geometry("100x100")
root.mainloop()

Я не могу понять, как заставить "один бла-бла" удалить "два", чтобы он не был виден, когда вы нажимаете btn2 после нажатия btn1. Я пробовал.grid_forget и подобные вещи, но я никогда не смогу заставить его работать.

Если это имеет значение, то это пример программы для большой программы, которую я создаю, где есть много различных опционных меню и меток.

2 ответа

Решение

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

import tkinter as tk

# --- functions ---

def f(s):
    if s == "btn":
        l['text'] = "one blah blah"
    elif s == "btn2":
        l['text'] = "two"
    else:
        print('ERROR: unknow:', s)

# --- main ---

root = tk.Tk()
root.geometry("100x100")

v = tk.StringVar(value="f")

a = tk.OptionMenu(root, v, "btn", "btn2", command=f)
a.grid(column=1, row=1)

l = tk.Label(root)
l.grid(column=1, row=2)

root.mainloop()

Если вам нужно удалить Label (потому что вы должны поставить другой виджет - т.е. Button) затем используйте destroy()

import tkinter as tk

# --- functions ---

def f(s):
    global w # inform function to use external variable when you will use `=`

    if s == "label":
        if w: # check if widget already exist
            w.destroy()

        w = tk.Label(root, text="Hello World!")
        w.grid(column=1, row=2)

    elif s == "button":
        if w: # check if widget already exist
            w.destroy()

        w = tk.Button(root, text="Click Me")
        w.grid(column=1, row=2)

    else:
        print('ERROR: unknow:', s)

# --- main ---

root = tk.Tk()
root.geometry("100x100")

v = tk.StringVar(value="f")

a = tk.OptionMenu(root, v, "label", "button", command=f)
a.grid(column=1, row=1)

w = None # create global variable without value
         # to use later with widget (and keep access to this widget)

root.mainloop()

Кстати: вы можете создавать виджеты только один раз и заменить их - затем использовать grid_forget() скрыть виджет

import tkinter as tk

# --- functions ---

def f(s):
    global w # inform function to use external variable when you will use `=`

    if s == "label":
        if w: # check if widget already exist
            w.grid_forget()

        w = l
        w.grid(column=1, row=2)

    elif s == "button":
        if w: # check if widget already exist
            w.grid_forget()

        w = b
        w.grid(column=1, row=2)

    else:
        print('ERROR: unknow:', s)

# --- main ---

root = tk.Tk()
root.geometry("100x100")

v = tk.StringVar(value="f")

a = tk.OptionMenu(root, v, "label", "button", command=f)
a.grid(column=1, row=1)

# create but not display
l = tk.Label(root, text="Hello World!")
b = tk.Button(root, text="Click Me")

w = None # create global variable without value
         # to use later with widget (and keep access to this widget)

root.mainloop()

Функция может быть короче, если вы проверите все возможные значения для s

def f(s):
    global w # inform function to use external variable when you will use `=`
    if w: # check if widget already exist
        w.grid_forget()

    if s == "label":
        w = l
    elif s == "button":
        w = b

    w.grid(column=1, row=2)

Попробуйте изменить one=Label(root,text="one blah blah",width=20)а также two=Label(root,text="two",width=20)или поставить подходящую ширину. Все будет хорошо.

Код выглядит так:

from tkinter import *

root=Tk()

def f(s):

  if s=="btn":

    one=Label(root,text="one blah blah",width=20)

    one.grid(column=1,row=2)

  if s=="btn2":

    two=Label(root,text="two",width=20)

    two.grid(column=1,row=2)


v=StringVar(root)

v.set("f")

a=OptionMenu(root,v,"btn","btn2",command=f)

a.grid(column=1,row=1)

root.configure()

root.geometry("100x100")

root.mainloop()

Один бла бла будет стёрт полностью, а два будут написаны.

Другие вопросы по тегам