2016-12-28 2 views
0

In meiner GUI-Anwendung habe ich eine Schaltfläche zum Ein-/Ausblenden. Standardmäßig ist der Schaltflächentext "Zeigen". Wenn Sie auf die Schaltfläche klicken, werden mehrere Schaltflächen aus einer vordefinierten Liste erstellt und der Schaltflächentext wird in "Ausblenden" geändert.Entfernen/Verwerfen von Schaltflächen in einer Umschaltfläche

Wenn der Benutzer auf "Verbergen" klickt, möchte ich die Schaltflächen, die erstellt wurden, ausblenden/entfernen. Ich nehme an, dass ich die grid_forget() Funktion im else Zustand verwenden muss, aber wie so?

Danke fürs Lesen.

# 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

Verwendung Liste können alle angelegten Tasten halten und dann können Sie Schaltflächen aus der Liste, um sie zu verstecken. Oder erstellen Sie 'Frame' mit Schaltflächen und Sie müssen nur einen Rahmen anzeigen/ausblenden. – furas

Antwort

0

Sie haben die Liste erstellen Tasten zu halten und dann können Sie verwenden grid() und 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() 

Wenn Sie immer die gleichen Tasten, dann können Sie sie einmal erstellen.

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

Oder Sie Frame zur Gruppe 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

Ich habe ein Beispiel mit 'Frame' hinzugefügt – furas

+0

Danke, @furas! Das Speichern der Schaltflächenobjekte in einer Liste und das Aufrufen von 'grid_forget()' an jedem Element in der else-Bedingung haben den Trick bewirkt. – Astrodude11

+0

Der Text der Schaltflächen wird sich ändern, so dass die Verwendung einer Liste oder das Erstellen eines neuen Rahmens die besten Lösungen für meinen Fall sind. – Astrodude11

Verwandte Themen