2017-01-02 7 views
-1

Довольно новый для python. Я использую меню опций и у меня есть метки, прикрепленные к ним:Как удалить 1 ярлык при добавлении другого - python tkinter

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 и подобные вещи, но я никогда не могу заставить его работать.

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

+1

Что бы вы ни пытались, вероятно, дал вам сообщение об ошибке. Это сообщение об ошибке сообщает вам, в чем проблема. Покажите нам, что вы пробовали, и какова ошибка. –

+1

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

ответ

1

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

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)