Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Ruby - Comando da associare ad un'istanza di TkButton
Forum - Ruby - Comando da associare ad un'istanza di TkButton

Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:54
Lunedì, 16/01/2017
Sto creando in programma ad interfaccia grafica (GUI) con la classe Tk di ruby.
Ho un problema ad associare l'evento click del mouse ad un' istanza TkButton.

Ecco il codice:
Codice sorgente - presumibilmente Ruby

  1. require 'tk'
  2.  
  3. class App
  4.  
  5.         def initialize  
  6.                 @radice=TkRoot.new() do
  7.                         title "Esempio"
  8.                         width 230
  9.                         height 120
  10.                 end
  11.                 @btnComando=TkButton.new(@radice)do
  12.                         command 'miaFunzione'
  13.                         place('x' => 10, 'y' => 10)
  14.                 end
  15.                 @btnComando['text']='Comando'
  16.                
  17.                 @textRisultato=TkText.new(@radice)
  18.                 @textRisultato['width']=15
  19.                 @textRisultato['height']=3
  20.                 @textRisultato.place('x' => 10, 'y' => 45)
  21.                
  22.                 @radice.mainloop()
  23.                
  24.         end
  25.        
  26.         def miaFunzione
  27.                 @textRisultato.insert 'end', 'Click !'
  28.         end
  29.        
  30. end
  31.  
  32. finestra=App.new

La cosa che non riesco a capire è che non riesco a collegare una funzione interna alla classe a @btnComando

Ultima modifica effettuata da Poggi Marco il 16/01/2017 alle 21:55
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:25
Lunedì, 16/01/2017
Yay, finalmente una domanda sul Ruby :) :ot:

Solitamente direi che usare OOP in questo caso non e' necessario, la modularita' viene gia' raggiunta separando l'interfaccia in un modulo separato e dovresti definire i tuoi metodi nello scope globale del file (quindi semplicemente rimuovi la classe App), ma visto che con Ruby si puo' fare di tutto...

Codice sorgente - presumibilmente Ruby

  1. require 'tk'
  2.  
  3. class App
  4.  
  5.         def initialize  
  6.                 this = self
  7.  
  8.                 @radice=TkRoot.new() do
  9.                         title "Esempio"
  10.                         width 230
  11.                         height 120
  12.                 end
  13.                 @btnComando=TkButton.new(@radice)do
  14.                         command proc { this.miaFunzione }
  15.                         place('x' => 10, 'y' => 10)
  16.                 end
  17.                 @btnComando['text']='Comando'
  18.                
  19.                 @textRisultato=TkText.new(@radice)
  20.                 @textRisultato['width']=15
  21.                 @textRisultato['height']=3
  22.                 @textRisultato.place('x' => 10, 'y' => 45)
  23.                
  24.                 @radice.mainloop()
  25.                
  26.         end
  27.        
  28.         def miaFunzione
  29.                 @textRisultato.insert 'end', 'Click !'
  30.         end
  31.        
  32. end
  33.  
  34. finestra=App.new



In pratica salvo l'istanza della classe (self) in una variabile (this), dopodiche' uso creo un oggetto Proc https://ruby-doc.org/core-2.2.0/Proc.html per salvare lo scope (rendere accessibile this quando command viene invocato da tk).


Il mio blog: https://piero.dev
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:49
Lunedì, 16/01/2017
Grazie ! :asd: Ho imparato qualcosa di nuovo in Ruby.

Ultima modifica effettuata da Poggi Marco il 16/01/2017 alle 23:50
PM Quote