Topic: [RISOLTO] creazione lista dinamica di pulsanti  (Letto 1747 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline pycasso

  • python erectus
  • ***
  • Post: 107
  • Punti reputazione: 0
    • Mostra profilo
    • viva la polpetta
[RISOLTO] creazione lista dinamica di pulsanti
« il: Maggio 21, 2013, 10:41 »
salve sto creando una lista di pulsanti dinamicamente a seconda degli elementi di una lista che passo in un ciclo for:

[codice=python]
list=list_modules()
for i in list:
   button=gtk.Button()
   hb.add(button)
   hb.set_child_packing(button,0,0,0,gtk.PACK_START)
   button.set_size_request(200,200)
   button_image=gtk.Image()
   button_image.set_from_file("modules/"+i+"/"+i+".png")
   button.set_image(button_image)
   button.connect("clicked",lambda *w: play("modules/"+i+"/"+i+".wav"))
[/codice]

vengono realizzati il numero giusto di pulsanti, ognuno con la propria immagine corretta,
ma tutti connessi alla stessa funzione.
come posso risolvere?
« Ultima modifica: Maggio 21, 2013, 19:55 da pycasso »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.183
  • Punti reputazione: 9
    • Mostra profilo
Re: creazione lista dinamica di pulsanti
« Risposta #1 il: Maggio 21, 2013, 11:17 »
non ricordo se ci sono modi più idiomatici per farlo con le gtk, ma tipicamente in questi casi vuoi mantenere un dizionario interno dei pulsanti creati, qualcosa come
[codice]
my_buttons = {}
for i in list:
    button = gtk.Button()
    (...)
    my_buttons[button] = i
    (...)
[/codice]
A questo punto, puoi connetterli tutti quanti allo stesso callback generico... Nel callback, scopri da quale pulsante è partito il click (non mi ricordo come si fa con gtk), e ti regoli di conseguenza:
[codice]
def on_click(self, ...):
    button_clicked = ....
    tune = "modules/%s/%s.wav" % (my_buttons[button_clicked], my_buttons[button_clicked])
    play(tune)
[/codice]

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: creazione lista dinamica di pulsanti
« Risposta #2 il: Maggio 21, 2013, 14:12 »
Dici che i bottoni sono hashabili?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.183
  • Punti reputazione: 9
    • Mostra profilo
Re: creazione lista dinamica di pulsanti
« Risposta #3 il: Maggio 21, 2013, 14:39 »
con le wx lo sono...
al limite, puoi hashare gli id (uhm... non ricordo... anche con le gtk i widget hanno un id univoco? accidenti, è proprio una vita che non uso più le gtk...)

Offline pycasso

  • python erectus
  • ***
  • Post: 107
  • Punti reputazione: 0
    • Mostra profilo
    • viva la polpetta
Re: creazione lista dinamica di pulsanti
« Risposta #4 il: Maggio 21, 2013, 15:03 »
grazie x l'aiuto..
sono arrivato a questo:
[codice=python]
list=list_modules()
conn={}
for i in list:
        button=gtk.Button()
        hb.add(button)
        hb.set_child_packing(button,0,0,0,gtk.PACK_START)
        button.set_size_request(200,200)
        button_image=gtk.Image()
        button_image.set_from_file("modules/"+i+"/"+i+".png")
        button.set_image(button_image)
        conn=button.__hash__()
[/codice]
ed in effetti:
[codice]
print conn
{'cane': 145745024, 'rana': 145745504, 'asino': 145745144, 'gatto': 145745624, 'mucca': 145745384, 'pecora': 145745264}
[/codice]
quindi ogni button ha un numero univoco..
ma adesso come posso connettere la funzione ad ogni pulsante?
posso usare l'hash come variabile?

edit:
[codice=python]
list=list_modules()
conn={}
for i in list:
        button=gtk.Button()
        hb.add(button)
        hb.set_child_packing(button,0,0,0,gtk.PACK_START)
        button.set_size_request(200,200)
        button_image=gtk.Image()
        button_image.set_from_file("modules/"+i+"/"+i+".png")
        button.set_image(button_image)
        conn[button.__hash__()]=i

for i in hb.get_children():
        i.connect("clicked",lambda *w:play("modules/"+conn[i.__hash__()]+"/"+conn[i.__hash__()]+".wav"))
[/codice]
con questo codice cmq non funziona, ogni volta che ripete i.connect()
imposta la stessa funzione a tutti i pulsanti..
praticamente importo N funzioni a N pulsanti, ovviamente l'ultima vale per tutti...
« Ultima modifica: Maggio 21, 2013, 15:44 da pycasso »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.183
  • Punti reputazione: 9
    • Mostra profilo
Re: creazione lista dinamica di pulsanti
« Risposta #5 il: Maggio 21, 2013, 16:41 »
no, così dubito che ci arriverai... prima di tutto prova ad hashare direttamente il riferimento bottone, come ti ho fatto vedere. Dovrebbe funzionare. Costruisci il dizionario al contrario, tipo {bottone: stringa_di_testo}.
Nel callback, dovresti vedere nella documentazione di gtk come si fa risalire all'oggetto che ha emesso l'evento "click"... Nelle wx basta fare event.GetEventObject() per avere un riferimento all'oggetto... ma credo che per le gtk funzionerà in modo simile...
Una volta che hai l'oggetto, risali alla stringa che ti interessa attraverso il dizionario, come ti ho fatto vedere.

Offline pycasso

  • python erectus
  • ***
  • Post: 107
  • Punti reputazione: 0
    • Mostra profilo
    • viva la polpetta
[RISOLTO] Re: creazione lista dinamica di pulsanti
« Risposta #6 il: Maggio 21, 2013, 19:54 »
grazie di tutto :)
praticamente ho scoperto che sostituendo:
[codice=python]
button.connect("clicked",lambda *w: play())
[/codice]
con:
[codice=python]
button.connect("clicked",play)
[/codice]
il segnala passa alla funzione il pulsante cliccato quindi ho modificato la funzione play() in questo modo:
[codice=python]
def play(button):
   popen("play modules/"+my_buttons[button.__hash__()]+"/"+my_buttons[button.__hash__()]+".wav")
[/codice]

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.183
  • Punti reputazione: 9
    • Mostra profilo
Re: [RISOLTO] creazione lista dinamica di pulsanti
« Risposta #7 il: Maggio 21, 2013, 20:28 »
uhm, ok... credo comunque che le gtk mettano a disposizione un id univoco per ciascun widget, senza bisogno di passare dall'__hash__ di python..., ma il principio è quello, direi.