Thursday, February 13, 2014

Ancora su widget ed eventi

Prima di riprendere la riflessione sull'uso astrologico della programmazione in Python, vi presento un'altra piccola applicazione che mostra come si puo' creare un widget e distruggerlo in funzione degli eventi del mouse (ma potrebbero essere anche altri tipi di eventi).

Gli eventi sono generati di continuo, il sistema li produce da sè o li acquisisce dall'utente. Alcuni possono essere intercettati, come il movimento del mouse su un widget (mouseover) o la sua uscita dal widget. In ambedue i casi, come si vede nel programma allegato, tali eventi possono essere intercettati per la chiamata di funzioni di callback.

Il metodo tag_bind si applica alla canvas. Vengono passati come parametri il tipo di evento (Motion o Leave tra segni di minore e maggiore) e la funzione di callback che si desidera attivare. Nelle funzioni, quando il widget viene creato riceve un tag che lo contraddistingue (potrebbe essere applicato a più oggetti, volendo), quando il widget viene distrutto viene identificato con il proprio tag.

Nella finestra di cui avete una riproduzione qui a fianco, il widget è una stringa di testo, che compare, con diverso contenuto, quando si entra col mouse nell'area del widget scelto (cerchio o quadrato). Non appena si allontana il mouse, la stringa di testo, generata in occasione del primo evento, viene cancellata. La sintassi per la cancellazione del widget è, nel caso specifico:
self.canvas.delete(tag)
che di fatto rimuove il widget 'child' dell'applicazione 'parent' che è la canvas.

La manipolazione intenzionale dei widget è una delle tecniche di composizione grafica di cui avremo bisogno in futuro, quando inizieremo a scrivere l'applicazione per lo sviluppo e la composizione grafica dei temi astrologici.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import Tkinter

class MyApp:

  def __init__(self):
    
    self.root=Tkinter.Tk()
    self.root.title('Creare e cancellare i widget')

    self.frame=Tkinter.Frame()
    self.frame.pack()

    self.canvas = Tkinter.Canvas(self.frame, width=300, height = 300)
    self.canvas.pack()
    self.canvas.create_oval(25,25,75,75, fill="green", tag = 'cerchio')
    self.canvas.create_rectangle(100,100,150,150, fill='red', tag = 'quadrato')

    self.canvas.tag_bind('cerchio', '<Motion>',self.motion_in)
    self.canvas.tag_bind('cerchio','<Leave>', self.motion_out)
    self.canvas.tag_bind('quadrato','<Motion>',self.message)
    self.canvas.tag_bind('quadrato','<Leave>', self.message_destroy)

  def motion_in(self, event):
    self.canvas.create_text(200,200, text="Sei entrato nel cerchio", tag='mouse_str')
    
  def motion_out(self, event):
    self.canvas.delete('mouse_str')
    
  def message(self, event):
    self.canvas.create_text(200, 200, text="Sei entrato nel quadrato", tag='entrato')
    
  def message_destroy(self, event):
    self.canvas.delete('entrato')
    
  def mainloop(self):
    self.root.mainloop()

  
master = MyApp()
master.mainloop()  

No comments:

Post a Comment

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...