sabato 12 gennaio 2013

Gestione degli eventi

Finora per la parte grafica con wx ho seguito abbastanza fedelmente il tutorial di ZetCode.

http://www.zetcode.com/wxpython/

Però dopo menu e toolbar il tutorial ha una pagina chiamata "Layout Management", gestione del layout che non dice, secondo me, nulla di nuovo. O meglio, è troppo specifico e sono cose che se proprio servono si vanno a vedere, ma solo se e quando diventano indispensabili. Un'altro motivo per saltarlo è che gli esempi dovrebbero essere non troppo lunghi, in modo da poterli esaminare senza investire troppo tempo. Almeno io quando vedo più di tot righe di codice tendo a scoraggiarmi.

Per cui saltiamo alla gestione degli eventi. Il primo esempio (ebbene sì, lo ricopio così com'è!) ci mostra un paio di cose: 1) come inserire un testo in una posizione predefinita; 2) come gestire un evento, in questo caso wx.EVT_MOVE, attivato quando spostiamo la finestra. A proposito (o meglio a sproposito): quando ho parlato della toolbar BB, senza barra del tiolo mi sono dimenticato di dire che tenendo premuto il tasto Alt riuscite a spostare la finestra come se agiste sulla barra del titolo (lo so che lo sapete, sono io che devo ricordarmelo).

In ogni caso l'esempio può essere di una qualche utilità: stabilire la posizione delle finestre, con pos o SetPosition(), come abbiamo visto negli esempi precedenti (per BB è alla riga 75). Ecco quindi il codice di move.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

class Example(wx.Frame):
           
    def __init__(self, *args, **kw):
        super(Example, self).__init__(*args, **kw) 
        
        self.InitUI()
        
        
    def InitUI(self):

        wx.StaticText(self, label='x:', pos=(10,10))
        wx.StaticText(self, label='y:', pos=(10,30))
        
        self.st1 = wx.StaticText(self, label='', pos=(30, 10))
        self.st2 = wx.StaticText(self, label='', pos=(30, 30))

        self.Bind(wx.EVT_MOVE, self.OnMove)

        self.SetSize((250, 180))
        self.SetTitle('Move event')
        self.Centre()
        self.Show(True)  

    def OnMove(self, e):
        
        x, y = e.GetPosition()
        self.st1.SetLabel(str(x))
        self.st2.SetLabel(str(y))


def main():
    
    ex = wx.App()
    Example(None)
    ex.MainLoop()    


if __name__ == '__main__':
    main()  
È possibile intercettare e gestire tantissimi eventi. Ho modificato l'ultimo esempio (key.py) in modo da poter visualizzarli (quasi) tutti, alcuni vengono intercettati dal sistema operativo. L'elenco completo degli eventi lo trovate qui
#!/usr/bin/python
# -*- coding: utf-8 -*-


import wx

class Example(wx.Frame):
           
    def __init__(self, *args, **kw):
        super(Example, self).__init__(*args, **kw) 
        
        self.InitUI()
                
    def InitUI(self):

        pnl = wx.Panel(self)
        pnl.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        pnl.SetFocus()

        self.SetSize((250, 180))
        self.SetTitle('Key event')
        self.Centre()
        self.Show(True)  

    def OnKeyDown(self, e):
        
        key = e.GetKeyCode()
        print key
        if key == wx.WXK_ESCAPE:
            
            ret  = wx.MessageBox('Are you sure to quit?', 'Question', 
                wx.YES_NO | wx.NO_DEFAULT, self)
                
            if ret == wx.YES:
                self.Close()               
        if key == wx.WXK_SPACE:
            x, y = self.GetPosition()
            if x > 800:
                x = 50
                y = 50
            self.SetPosition((x + 100, y + 100))
        if key == wx.WXK_RETURN:
            print "enter"    
def main():
    
    ex = wx.App()
    Example(None)
    ex.MainLoop()    


if __name__ == '__main__':
    main()  

Si sappia, Juhan è raffreddato! Non ha mandato neanche una foto! Vuol dire che per questa volta provvedo io. Così impara!! :)


L'indice di Mission Python lo trovate qui.

Alla prossima! :)

1 commento: