[Python] Button all'interno di un for

Strap Lab lab a strap.it
Ven 25 Nov 2016 16:40:36 CET


2016-11-25 15:20 GMT+01:00 Marcello <marcello a linuxvil.it>:

> 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
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20161125/79a1a0e6/attachment.html>


Maggiori informazioni sulla lista Python