2016-12-28 4 views
0

Dans mon application GUI, j'ai un bouton Afficher/Masquer. Par défaut, le texte du bouton est "Afficher". Lorsque vous cliquez dessus, le bouton crée un certain nombre de boutons suivants à partir d'une liste prédéfinie et le texte du bouton devient "Masquer". Lorsque l'utilisateur clique sur "Cacher", je souhaite masquer/supprimer les boutons qui ont été créés. Je suppose que j'ai besoin d'utiliser la fonction grid_forget() dans l'état else mais comment?Supprimer/Supprimer les boutons dans un bouton bascule

Merci d'avoir lu.

# Toggles between Show/Hide and creates buttons 
def toggle_text(): 
    if btn['text'] == 'Show': 
     btn['text'] = 'Hide' 
     for i, item in enumerate(some_list): 
      btn = Button(root, text='%s' % item) 
      btn.grid(row=6+i, column=0, sticky=W) 
    else: 
     btn['text'] = 'Hide' 

# Show/Hide button 
btn = Button(root, text='Show', command=toggle_text) 
btn.grid(row=5, column=0, sticky=W) 
+0

liste utiliser pour garder tous les boutons créés et vous pouvez utiliser les boutons de la liste pour les cacher. Ou créez 'Frame' avec des boutons et vous n'aurez qu'à afficher/masquer une image. – furas

Répondre

0

Vous devez créer la liste pour maintenir les boutons et vous pouvez utiliser grid() et grid_forget()

import tkinter as tk 

# --- functions --- 

def toggle_text(): 
    global buttons # inform function to use external/global variable 

    if btn['text'] == 'Show': 
     btn['text'] = 'Hide' 

     for i, item in enumerate(some_list, 6): 
      # don't use name `btn` because you overwrite external `btn` 
      b = tk.Button(root, text=item) 
      b.grid(row=i, column=0, sticky='we') 
      buttons.append(b) 
    else: 
     btn['text'] = 'Show' 

     for b in buttons: 
      #b.grid_forget() 
      # better `destroy` because you will create new buttons 
      # so you can free memory 
      b.destroy() 

     # remove all buttons from list 
     #buttons.clear() # only Python 3 (doesn't need `global buttons`) 
     #buttons[:] = [] # Python 2 and 3 (doesn't need `global buttons`) 
     buttons = [] # Python 2 and 3 but needs `global buttons` 

# --- main --- 

some_list = ['A', 'B', 'C'] 
buttons = [] # create global variable 

root = tk.Tk() 

btn = tk.Button(root, text='Show', command=toggle_text) 
btn.grid(row=5, column=0, sticky='w') 

root.mainloop() 

Si vous avez toujours les mêmes boutons, vous pouvez les créer une fois.

import tkinter as tk 

# --- functions --- 

def toggle_text(): 

    if btn['text'] == 'Show': 
     btn['text'] = 'Hide' 

     for i, b in enumerate(buttons, 6): 
      b.grid(row=i, column=0, sticky='we') 

    else: 
     btn['text'] = 'Show' 

     for b in buttons: 
      b.grid_forget() 

# --- main --- 

root = tk.Tk() 

some_list = ['A', 'B', 'C'] 

buttons = [] # create global variable 
for item in some_list: 
    b = tk.Button(root, text=item) 
    buttons.append(b) 

btn = tk.Button(root, text='Show', command=toggle_text) 
btn.grid(row=5, column=0, sticky='w') 

root.mainloop() 

Ou vous pouvez utiliser Frame groupe pour Buttons

import tkinter as tk 

# --- functions --- 

def toggle_text(): 

    if btn['text'] == 'Show': 
     btn['text'] = 'Hide' 
     frame.grid(row=6, column=0, sticky='we') 
    else: 
     btn['text'] = 'Show' 
     frame.grid_forget() 

# --- main --- 

root = tk.Tk() 

some_list = ['A', 'B', 'C'] 

frame = tk.Frame(root) 
frame.columnconfigure(0, weight=1) # resise column 

for i, item in enumerate(some_list): 
    b = tk.Button(frame, text=item) 
    b.grid(row=i, column=0, sticky='we') 

btn = tk.Button(root, text='Show', command=toggle_text) 
btn.grid(row=5, column=0, sticky='w') 

root.mainloop() 
+0

J'ai ajouté un exemple avec 'Frame' – furas

+0

Merci, @furas! Stocker les objets du bouton dans une liste puis appeler 'grid_forget()' sur chaque élément de la condition else a fait l'affaire. – Astrodude11

+0

Le texte des boutons va changer alors utiliser une liste ou faire un nouveau cadre sont les meilleures solutions à mon cas. – Astrodude11