Oppure

Loading
16/01/17 20:54
Poggi Marco
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:
require 'tk'

class App

	def initialize  
		@radice=TkRoot.new() do
			title "Esempio"
			width 230
			height 120
		end
		@btnComando=TkButton.new(@radice)do
			command 'miaFunzione'
			place('x' => 10, 'y' => 10)
		end
		@btnComando['text']='Comando'
		
		@textRisultato=TkText.new(@radice) 
		@textRisultato['width']=15
		@textRisultato['height']=3
		@textRisultato.place('x' => 10, 'y' => 45)
		
		@radice.mainloop()
		
	end
	
	def miaFunzione
		@textRisultato.insert 'end', 'Click !'
	end
	
end

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 16/01/17 20:55
aaa
16/01/17 22:25
pierotofy
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...


require 'tk'
 
class App
 
        def initialize  
                this = self

                @radice=TkRoot.new() do
                        title "Esempio"
                        width 230
                        height 120
                end
                @btnComando=TkButton.new(@radice)do
                        command proc { this.miaFunzione }
                        place('x' => 10, 'y' => 10)
                end
                @btnComando['text']='Comando'
               
                @textRisultato=TkText.new(@radice)
                @textRisultato['width']=15
                @textRisultato['height']=3
                @textRisultato.place('x' => 10, 'y' => 45)
               
                @radice.mainloop()
               
        end
       
        def miaFunzione
                @textRisultato.insert 'end', 'Click !'
        end
       
end
 
finestra=App.new


In pratica salvo l'istanza della classe (self) in una variabile (this), dopodiche' uso creo un oggetto Proc ruby-doc.org/core-2.2.0/… per salvare lo scope (rendere accessibile this quando command viene invocato da tk).
Il mio blog: piero.dev
16/01/17 22:49
Poggi Marco
Grazie ! :asd: Ho imparato qualcosa di nuovo in Ruby.
Ultima modifica effettuata da Poggi Marco 16/01/17 22:50
aaa