Re: [Python] Button all'interno di un for
2016-11-25 18:29 GMT+01:00 Michele TOMAIUOLO: > Ottimo! > > > In ogni caso, aggiungere alle lambda parametri con valori di default è una > tecnica ben nota ;-) > > > http://www.pythondoeswhat.com/2012/11/lambda-default-parameters.html > > > https://docs.python.org/3/faq/programming.html#why-do- > lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result > > Strano che non funzioni... Ho eseguito il codice con Python 2.7 e 3.5 > senza problemi. > > Si` non funzionava perche` mi mancava un pezzo :-) Non avevo notato il `n=numero` nella lambda, che e` la chiave della closure. Quindi, bravo, bella soluzione, non ci avevo pensato :-) Ho trovato tra i miei link http://www.datadependence.com/2016/04/how-to-build-gui-in-python-3/ giusto per avere un approccio object oriented e - dipende dal contesto - piu` ordinato. Sani Strap ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Button all'interno di un for
Ottimo! In ogni caso, aggiungere alle lambda parametri con valori di default è una tecnica ben nota ;-) http://www.pythondoeswhat.com/2012/11/lambda-default-parameters.html https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result Strano che non funzioni... Ho eseguito il codice con Python 2.7 e 3.5 senza problemi. -- Mic ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Button all'interno di un for
Il giorno 25 novembre 2016 16:40, Strap Labha scritto: > > Cosi` facendo viene creata e riservata una referenza corretta al numero > per la callback assegnata a command. > Si, grazie 1000, funziona, inserisco il codice completo Ciao from Tkinter import * root= Tk() def premuto (numero): print ("premuto bottone ",numero) #root.destroy() def factory_btn(numero): pulsante = Button(finestra) pulsante["text"] = "pulsante" pulsante["background"] = "black" pulsante["command"] = lambda: premuto(numero) pulsante["fg"] = "red" pulsante.pack() finestra = Frame(root) finestra.pack() for numero in range(1,7): factory_btn(numero) root.mainloop() ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Button all'interno di un for
2016-11-25 16:40 GMT+01:00 Michele TOMAIUOLO: > Ciao, Marcello. > > Credo tu debba usare questo codice: > > lambda n=numero: premuto(n) > > In questo modo, il valore di numero viene assegnato come default al > parametro n. > Altrimenti, prendi direttamente in closure la variabile, che poi muta > valore... > Non funziona, la lambda dovrebbe accettare un parametro che non viene passato, infatti si ha un: TypeError: () takes exactly 1 argument (0 given) > Approfitto per salutare tutta la lista, su cui finora ho solo origliato > con molto interesse :-) > Siamo in due! :-) Sani Strap ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Button all'interno di un for
2016-11-25 15:20 GMT+01:00 Marcello: > Ciao a tutti, > ho un problemino con Tkinter Button, > devo creare una finestra con svariati bottoni che mi andranno ad eseguite > dei comandi batch. > Per la creazione dei pulsati pensavo di utilizzare un ciclo for. Il > problema è che qualsiasi bottone io prema e come se premessi l'ultimo. > Dove sbaglio? I bottoni li ho creati tutti con nomi diversi. > Grazie per l'aiuto > > Marcello > > -- > from Tkinter import * > root= Tk() > def premuto (numero): > print ("premuto bottone ",numero) > #root.destroy() > > finestra = Frame(root) > finestra.pack() > for numero in range(1,7): > pulsante = "pulsante" + str(numero) > pulsante = Button(finestra) > pulsante["text"] = "pulsante" > pulsante["background"] = "black" > pulsante["command"] = lambda: premuto(numero) > pulsante["fg"] = "red" > pulsante.pack() > root.mainloop() > -- > > Ciao, il problema sta nella variabile "numero" perche` e` il valore che viene assegnato durante il for e l'interprete mantiene quello per la durata del tuo programma: >>> for x in range(1, 3): ... print(x) ... 1 2 >>> print(x) 2 >>> Una possibile soluzione e` quella di creare un factory builder per i tuoi bottoni: from Tkinter import * root= Tk() def premuto (numero): print ("premuto bottone ",numero) #root.destroy() def factory_btn(num): Button(finestra, text="pulsante {}".format(numero), background="black", command=lambda: premuto(num), fg="red").pack() finestra = Frame(root) finestra.pack() for numero in range(1,3): factory_btn(numero) root.mainloop() Cosi` facendo viene creata e riservata una referenza corretta al numero per la callback assegnata a command. Ho utilizzato il costruttore direttamente, ma seguendo il tuo codice possiamo scrivere cosi` la funzione factory_btn: def factory_btn(num): pulsante = Button(finestra) pulsante["text"] = "pulsante" pulsante["background"] = "black" pulsante["command"] = lambda: premuto(num) pulsante["fg"] = "red" pulsante.pack() Sani Strap ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Button all'interno di un for
Ciao, Marcello. Credo tu debba usare questo codice: lambda n=numero: premuto(n) In questo modo, il valore di numero viene assegnato come default al parametro n. Altrimenti, prendi direttamente in closure la variabile, che poi muta valore... Approfitto per salutare tutta la lista, su cui finora ho solo origliato con molto interesse :-) Mic ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python