Ciao,
vedendo quella parte di codice... non dovresti avere problemi...
Il problema potrebbe essere:
- Utilizzi la variabile "b" altrove, dichiarando magari un altro widget con tale nominazione. In questo modo perderesti il riferimento al tuo bottone;
- La funzione non viene richiamata correttamente. Il mio consiglio sarebbe di dichiarare tutte le funzioni/classi il testa al codice, in modo da evitare qualunque problema di "not define";
In definitiva, prova:
1_ usa nomi appropriati per ogni variabile, non singole lettere, in modo da evitare errori;
2_ per accertarsi che la tua funzione parta e che esegua il "place_forget" ci sono due modi: esegui un debug guardando riga per riga cosa succede, o, più banalmente, scrivi una serie di "print" per vedere che operazioni ha eseguito, ad esempio:
def salva():
print('prima riga')
b.place_forget()
print('place_forget eseguito')
...
O ancora meglio... se stampi il bottone, ti verrà mostrato in output il riferimento al bottone... stampa il bottone appena lo dichiari e appena prima di quando viene fatto il "place_forget" in modo da assicuranti che il riferimento sia perfettamente uguale.
NB: il codice sarebbe semplicemente:
print(b) #o print(str(b))
Buona programmazione