`bu1` und `bu2` sind lokale Variablen, die nur innerhalb von showReihe2 existieren. Ebenso sollte `master` eine lokale Variable sein, die als Argument showReihe2 übergeben wird.
Um das zu Ändern, muß man sich den Zustand (also die Knöpfe) über die Dauer des Funktionsaufrufst merken. Das macht man mit Klassendefinitionen. Jedes nicht-triviale GUI-Programm braucht das.
Benutze keine Abkürzungen, wenn Du schaltflaeche meinst, dann schreibe nicht bu. Besser wäre es noch, die Schaltfläche nach ihrer Bedeutung zu benennen. Funktionsnamen schreibt man wie Variablennamen klein_mit_unterstruch, also loesche_reihe2, eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs und die Namen aus Tkinter werden üblicherweise per tk.Button angesprochen, mit dem entsprechenden Import `import tkinter as tk`.
Das Grundgerüst eines GUI-Programms sieht eigentlich immer ähnlich aus:
Code: Alles auswählen
import tkinter as tk
from functools import partial
class MasterWindow(tk.Tk):
def __init__(self):
super().__init__()
self.schaltflaeche1 = None
self.schaltflaeche2 = None
self.bind('g', self.show_reihe2)
self.bind('b', self.loesche_reihe2)
def show_reihe2(self, event):
if self.schaltflaeche1 is not None:
# Schaltflaechen schon erzeugt
return
self.schaltflaeche1 = tk.Button(master, width=13, text='Schaltfläche 1', command=partial(self.berechnung, 'variante1'))
self.schaltflaeche1.grid(row=2, column=0, sticky=tk.W, padx=1)
self.schaltflaeche2 = tk.Button(master, width=13, text='Schaltfläche 1', command=partial(self.berechnung, 'variante2'))
self.schaltflaeche2.grid(row=2, column=1, sticky=tk.W, padx=1)
def loesche_reihe2(self, event):
if self.schaltflaeche1 is None:
# keine Schaltflaeche da
return
self.schaltflaeche1.destroy()
self.schaltflaeche2.destroy()
self.schaltflaeche1 = None
self.schaltflaeche2 = None
def berechnung(self, variante):
pass
def main():
master = MasterWindow()
master.mainloop()
if __name__ == '__main__':
main()
Man versucht eigentlich, zu vermeiden, im nachhinein ein Fenster zu verändern. Üblich ist es, die Knöpfe schon in __init__ zu erzeugen und nur bei Bedarf anzuzeigen, bzw. aktiv zu schalten.