Tkinter non nasconde il pulsante

di il
3 risposte

Tkinter non nasconde il pulsante

Cliccando il pulsante rimando ad una funzione che tra le altre cose dovrebbe nascondere il medesimo pulsante con b.place_forget()
Il problema è che non lo chiude (anche se dichiaro il bottone global) a differenza di altri widget che vengono regolarmente chiusi o nascosti, di seguito parte del codice :
        
    b=Button(f,text="  Salva  ", command=salva,background="#00FF7F")
    b.configure(cursor="hand2")
    b.place(x=800,y=CodPlessi["c12"][1]+70)
    
def salva():
    b.place_forget()   # FORGET CHE NON FUNZIONA

    try:
        CodPlessi["c1"].append(Abbina) 
        CodPlessi["c1"].append(NomeSC) 
    except NameError:
        pass
    try:
        CodPlessi["c2"].append(Abbina1) 
        CodPlessi["c2"].append(NomeSC1) 
    except NameError:
        pass
    try:
        CodPlessi["c3"].append(Abbina2) 
        CodPlessi["c3"].append(NomeSC2) 
    except NameError:
        pass
    try:
        CodPlessi["c4"].append(Abbina3) 
        CodPlessi["c4"].append(NomeSC3) 
    except NameError:
        pass
   

    for elem in CodPlessi:     
        ChiaveDoppia=""  
        if len(CodPlessi[elem])>4:
            del CodPlessi[elem][5]
        if len(CodPlessi[elem])==2:
            CodPlessi[elem][0].place_forget()
            pass
        elif len(CodPlessi[elem])==4:

            CodPlessi[elem][0].place_forget()  # QUESTA SERIE DI FORGET NASCONDONO REGOLARMENTE I RELATIVI WIDGET
            CodPlessi[elem][2].place_forget()
            CodPlessi[elem][3].place_forget()
            for elem2 in CodPlessi:
                if CodPlessi[elem][0].get()==CodPlessi[elem2][0].get(): # and CodPlessi[elem][0].get()!="" :
                    if ChiaveDoppia!="":
                        print("Doppione "+ChiaveDoppia+" "+elem2)
                       # ChiaveDoppia=""
                    else:
                        ChiaveDoppia=elem

3 Risposte

  • Re: Tkinter non nasconde il pulsante

    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
  • Re: Tkinter non nasconde il pulsante

    Intanto grazie per la precedente risposta, che ho seguito:
    1) sostituendo il nome del bottone in SalveT
    2) stampando il bottone appena dopo l’inizializzazione e poco prima della chiamata forget()
    3) nelle prove successive ho scoperto che se salvo dopo aver inserito dati su uno solo dei 12 widget entry previsti, il bottone viene regolarmente nascosto, altrimenti no ed in più nella seconda stampata del bottone il relativo valore cambia da !button a !button + un numero che corrisponde al numero dei campi a cui ho inserito dati (l’inserimento dei campi in questione avviene selezionando dei dati da una finestra che si apre quando l’utente clicca sul campo interessato)
    4) ho risolto con una eccezione che mi consente di inizializzare il bottone una sola volta.

    Stavo pensando di globalizzare le variabili e successivamente dichiarare tutte le funzioni/classi in testa al codice all’interno di una funzione richiamata solo all’apertura dell’app, come hai suggerito.
    Uso la funzione perché la globalizzazione può essere fatta solo all’interno di una funzione giusto ?
  • Re: Tkinter non nasconde il pulsante

    Non capisco cosa tu intenda con "la globalizzazione può essere fatta solo all’interno di una funzione"...
    comunque, se intendi "eseguire operazioni di lettura e scrittura alle variabili globali solo all'interno di una funzione" la risposta è no...
    puoi farlo da dove meglio credi, indifferentemente dal tipo di paradigma che tu stia adoperando.
Devi accedere o registrarti per scrivere nel forum
3 risposte