sabato 19 gennaio 2013

Widgets - prima parte

Widget è la contrazione di window's object: da due parole ne tiri fuori una con risparmio di lettere e viene anche più facile a scriverla. Ma quella "g" al posto della "j"? Eh, così è più bello, no?

wx.Button, il pulsante (bu.py):

#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx


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

        pnl = wx.Panel(self)
        cbtn = wx.Button(pnl, label='Close', pos=(20, 30))

        cbtn.Bind(wx.EVT_BUTTON, self.OnClose)

        self.SetSize((250, 200))
        self.SetTitle('wx.Button')
        self.Centre()
        self.Show(True)          
        
    def OnClose(self, e):
        self.Close(True)                  
        
def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()   
wx.ToggleButton, l'interruttore (tb.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

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

        pnl = wx.Panel(self)
        self.col = wx.Colour(0, 0, 0)

        rtb = wx.ToggleButton(pnl, label='click', pos=(20, 25))

        self.cpnl  = wx.Panel(pnl, pos=(150, 20), size=(110, 110))
        self.cpnl.SetBackgroundColour(self.col)

        rtb.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleB)

        self.SetSize((300, 200))
        self.SetTitle('Toggle buttons')
        self.Centre()
        self.Show(True)     

    def ToggleB(self, e):
        obj = e.GetEventObject()
        isPressed = obj.GetValue()
        
        if isPressed:
            self.col.Set(255, 0, 0)
        else:
            self.col.Set(0, 0, 255)
            
        self.cpnl.SetBackgroundColour(self.col)

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

if __name__ == '__main__':
    main()    
Ho semplificato lo script di ZetCode, metteno un solo pulsante.

wx.StaticLine, visualizza una linea, verticale o orizzontale e wx.StaticText, per una scritta (sl.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

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

        pnl = wx.Panel(self)

        font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)
        heading = wx.StaticText(self, label='The Central Europe', pos=(130, 15))
        heading.SetFont(font)

        wx.StaticLine(self, pos=(25, 50), size=(300, 1))

        wx.StaticText(self, label='Slovakia', pos=(25, 80))
        wx.StaticText(self, label='Hungary', pos=(25, 100))
        wx.StaticText(self, label='Poland', pos=(25, 120))
        wx.StaticText(self, label='Czech Republic', pos=(25, 140))
        wx.StaticText(self, label='Germany', pos=(25, 160))
        wx.StaticText(self, label='Slovenia', pos=(25, 180))
        wx.StaticText(self, label='Austria', pos=(25, 200))
        wx.StaticText(self, label='Switzerland', pos=(25, 220))

        wx.StaticText(self, label='5 445 000', pos=(250, 80))
        wx.StaticText(self, label='10 014 000', pos=(250, 100))
        wx.StaticText(self, label='38 186 000', pos=(250, 120))
        wx.StaticText(self, label='10 562 000', pos=(250, 140))
        wx.StaticText(self, label='81 799 000', pos=(250, 160))
        wx.StaticText(self, label='2 050 000', pos=(250, 180))
        wx.StaticText(self, label='8 414 000', pos=(250, 200))
        wx.StaticText(self, label='7 866 000', pos=(250, 220))

        wx.StaticLine(self, pos=(25, 260), size=(300,1))

        tsum = wx.StaticText(self, label='164 336 000', pos=(240, 280))
        sum_font = tsum.GetFont()
        sum_font.SetWeight(wx.BOLD)
        tsum.SetFont(sum_font)

        btn = wx.Button(self, label='Close', pos=(140, 310))

        btn.Bind(wx.EVT_BUTTON, self.OnClose)        
        
        self.SetSize((360, 380))
        self.SetTitle('wx.StaticLine')
        self.Centre()
        self.Show(True)      
        
    def OnClose(self, e):
        self.Close(True)    
                      
def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()   
La linea verticale non sono riuscito a disegnarla, con style = wx.LI_VERTICAL (che poi vale 8) non disegna.

wx.StaticBox, usato per raggruppare widgets, questi devono essere creati prima e essere dello stesso livello (fratelli) della box (sb.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

class Example(wx.Frame):
           
    def __init__(self, *args, **kw):
        global male, marr, age
        
        super(Example, self).__init__(*args, **kw) 
        
        pnl = wx.Panel(self)
        
        wx.StaticBox(pnl, label='Personal Info', pos=(5, 5), size=(240, 170))
        male = wx.CheckBox(pnl, label='Male', pos=(15, 30))
        marr = wx.CheckBox(pnl, label='Married', pos=(15, 55))
        wx.StaticText(pnl, label='Age', pos=(15, 95))
        age = wx.SpinCtrl(pnl, value='1', pos=(55, 90), size=(60, -1), min=1, max=120)
        
        btn = wx.Button(pnl, label='Ok', pos=(90, 185), size=(60, -1))

        btn.Bind(wx.EVT_BUTTON, self.OnClose)

        self.SetSize((270, 250))
        self.SetTitle('Static box')
        self.Centre()
        self.Show(True)          
        
    def OnClose(self, e):
        global male, marr, age
        
        print male.GetValue(), marr.GetValue(), age.GetValue()
        self.Close(True)    
        
def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()   
OK, per oggi basta così, prossimamente altri, quelli che trovate su ZetCode.

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

Juhan

Indice di "Mission Python" qui.

Alla prossima!

Nessun commento:

Posta un commento