Home > python > Python: esercizio Rubrica

Python: esercizio Rubrica

Finalmente comincio a mettere in pratica un po’ di nozioni.
Ho pensato di creare una rubrica telefonica (originale come idea…),
utilizzando Shelve e wx per l’aspetto grafico.

Ovviamente essendo ancora in fase di studio, il programma va sicuramente
migliorato, però, per il mio livello, è già una soddisfazione, che funzioni.

Nota:
non ho inserito ancora nessuna eccezione e nemmeno il file browser che
mi faccia decidere il percorso del file rubrica.
Queste cose le metterò nella seconda versione.

Come esercizio ho utilizzato sia dei menu, che dei pulsanti forniti
di bitmap e di tooltips ed ovviamente classi, per prendere un po’
di confidenza con l’OOP.

Riassumendo, ho diviso il programma in 3 file:

core.py

contenente la prima interfaccia grafica, con menu e pulsanti.

AggiungiContatto.py

contenente l’interfaccia per l’aggiunta di un contatto in rubrica

VisualizzaContatto.py

contenente l’interfaccia per la consultazione dei contatti e la
loro eventuale eliminazione.

Il codice dei 3 file è:

core.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx
import shelve
from AggiungiContatto import *
from VisualizzaContatto import *

class rubFrame(wx.Frame):
    def __init__(self, parent, id):
        # Sezione BitMap
        bmpAdd = wx.Image("add.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        bmpView = wx.Image("view.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        bmpExit = wx.Image("exit.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()

        wx.Frame.__init__(self, parent, id, 'Rubrica', size=(300, 220))
        panel = wx.Panel(self)
        panel.SetBackgroundColour('Grey')
        statusBar = self.CreateStatusBar()
        # Sezione Menu
        menuBar = wx.MenuBar()
        menu = wx.Menu()
        mAdd=menu.Append(wx.NewId(), "&Add", "")
        mView = menu.Append(wx.NewId(), "&View", "")
        mExit =menu.Append(wx.NewId(), "&Exit", "")
        menuBar.Append(menu, "Contatti")
        menu2 = wx.Menu()
        mAbout = menu2.Append(wx.NewId(), "info", "")
        menuBar.Append(menu2, "?")
        self.SetMenuBar(menuBar)

        self.Bind(wx.EVT_MENU, self.OnExit, mExit)
        self.Bind(wx.EVT_MENU, self.OnAbout, mAbout)
        self.Bind(wx.EVT_MENU, self.OnAdd, mAdd)
        self.Bind(wx.EVT_MENU, self.OnView, mView)

        self.buttonAdd = wx.BitmapButton(panel, -1, bmpAdd, pos=(10, 20))
        self.buttonAdd.SetToolTipString("Aggiungi Contatto")
        self.Bind(wx.EVT_BUTTON, self.OnAdd, self.buttonAdd)

        self.buttonView = wx.BitmapButton(panel, -1, bmpView, pos=(10, 50))
        self.buttonView.SetToolTipString("Visualizza Contatti")
        self.Bind(wx.EVT_BUTTON, self.OnView, self.buttonView)

        self.buttonExit = wx.BitmapButton(panel, -1, bmpExit, pos=(10, 80))
        self.buttonExit.SetToolTipString("Chiudi")
        self.Bind(wx.EVT_BUTTON, self.OnExit, self.buttonExit)

    def OnAdd(self,event):
        adduser = FrameAggiungiContatto()
        adduser.Show()

    def OnView(self,event):
        vedi = Visualizza()
        vedi.Show()

    def OnExit(self,event):
        self.Destroy()

    def OnAbout(self,event):
        text = '''
    Rubrica
    versione 1.0
    autore: Andrea BANCHELLI
    anno: 2010'''
        dialog = wx.MessageDialog ( self, text, 'about...', style = wx.OK )
        if dialog.ShowModal() == wx.ID_OK: dialog.Destroy()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = rubFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

AggiungiContatto.py

#!/usr/bin/python

import wx
import shelve

class FrameAggiungiContatto(wx.Frame):
    def __init__(self):
        self.rubrica = shelve.open('\\tmp\\rubrica.dat')
        wx.Frame.__init__(self, None, -1, 'Aggiungi Contatto', size=(300, 300))
        self.panel = wx.Panel(self, -1)

        font = wx.Font(12, wx.DECORATIVE,wx.ITALIC, wx.NORMAL)

        nameLabel = wx.StaticText(self.panel, -1, "Nome:", pos=(50,10), size=(100,20), style=wx.ALIGN_CENTER)
        nameLabel.SetBackgroundColour("Yellow")
        nameLabel.SetFont(font)
        self.nameText = wx.TextCtrl(self.panel, -1, "Nome Contatto", pos=(80,10), size=(175, 20))
        self.nameText.SetInsertionPoint(0)
        SurnameLabel = wx.StaticText(self.panel, -1, "Cognome:", pos=(50,40), size=(100,20), style=wx.ALIGN_CENTER)
        SurnameLabel.SetBackgroundColour("Yellow")
        SurnameLabel.SetFont(font)
        self.SurnameText = wx.TextCtrl(self.panel, -1, "Cognome Contatto", size=(175, 20))
        cellLabel = wx.StaticText(self.panel, -1, "Cell:", pos=(50,70), size=(100,20), style=wx.ALIGN_CENTER)
        cellLabel.SetBackgroundColour("Yellow")
        cellLabel.SetFont(font)
        self.cellText = wx.TextCtrl(self.panel, -1, "Cell. Contatto", size=(175, 20))
        mailLabel = wx.StaticText(self.panel, -1, "mail:", pos=(50,100), size=(100,20), style=wx.ALIGN_CENTER)
        mailLabel.SetBackgroundColour("Yellow")
        mailLabel.SetFont(font)
        self.mailText = wx.TextCtrl(self.panel, -1, "mail Contatto", size=(175, 20))
        sizer = wx.FlexGridSizer(cols=2, hgap=10, vgap=10)
        sizer.AddMany([nameLabel, self.nameText, SurnameLabel, self.SurnameText,\
                       cellLabel, self.cellText, mailLabel, self.mailText])
        self.panel.SetSizer(sizer)
        button = wx.Button(self.panel, -1, "Salva Contatto", pos=(100, 150))
        self.Bind(wx.EVT_BUTTON, self.OnSave, button)
        button2 = wx.Button(self.panel, -1, "Exit", pos=(100, 200))
        self.Bind(wx.EVT_BUTTON, self.OnExit, button2)
        button.SetDefault()

    def OnSave(self, event):
        contatto = {'name': str(self.nameText.GetValue()) , 'cognome': str(self.SurnameText.GetValue()),\
                    'cell': str(self.cellText.GetValue()), 'mail': str(self.mailText.GetValue())}
        self.rubrica[str(self.SurnameText.GetValue())] = contatto
        print "parametri salvati:\n"
        print "="*20
        print "%s" %self.SurnameText.GetValue()
        print "="*20
        print "Nome -->    %s" %self.nameText.GetValue()
        print "Cognome --> %s" %self.SurnameText.GetValue()
        print "Cell -->    %s" %self.cellText.GetValue()
        print "Cognome --> %s" %self.mailText.GetValue()

    def OnExit(self, event):
        self.rubrica.close()
        self.Close()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    adduser = FrameAggiungiContatto()
    adduser.Show()
    app.MainLoop()

ed infine
VisualizzaContatto.py

#!/usr/bin/python

import os
import wx
import sys
import shelve
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin

class Visualizza(wx.Frame):

    def __init__(self):
        self.rubrica = shelve.open('\\tmp\\rubrica.dat')
        self.lista = []
        for key in self.rubrica:
            #print key
            self.lista.append(key)

        wx.Frame.__init__(self, None, -1, 'Visualizza Contatti',size = (400, 400))
        self.CreateStatusBar()
        panel = wx.Panel(self, -1)
        leftPanel = wx.Panel(panel, -1)
        rightPanel = wx.Panel(panel, -1)
        label = wx.StaticText(leftPanel, -1, 'Scegli Contatto:' )
        self.textDati = wx.StaticText(rightPanel, -1, 'Dati:' )
        self.textCognome = wx.StaticText(rightPanel, -1, 'Cognome' )
        self.textNome = wx.StaticText(rightPanel, -1, 'nome' )
        self.textCell = wx.StaticText(rightPanel, -1, 'cell.' )
        self.textMail = wx.StaticText(rightPanel, -1, 'mail' )

        vboxright = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vboxleft = wx.BoxSizer(wx.VERTICAL)

        self.box = wx.CheckListBox(leftPanel, 200, size = ( 250, 300 ),
                                 choices = self.lista, style = wx.LB_HSCROLL )
        self.evt1 = wx.EVT_CHECKLISTBOX(leftPanel, 200, self.VisualizzaValori)

        self.button2 = wx.Button(leftPanel, 2, 'Chiudi')
        leftPanel.Bind(wx.EVT_BUTTON, self.Exit, self.button2, id=2)

        self.button3 = wx.Button(rightPanel, 2, 'Cancella Contatto')
        rightPanel.Bind(wx.EVT_BUTTON, self.DelUser, self.button3, id=3)

        vboxleft.Add(label, 0, wx.TOP, 5)
        vboxleft.Add(self.box)
        vboxleft.Add(self.button2)

        leftPanel.SetSizer(vboxleft)

        vboxright.Add((-1, 20))
        vboxright.Add(self.textDati, 0, wx.TOP, 5)
        vboxright.Add((-1, 20))
        vboxright.Add(self.textCognome)
        vboxright.Add((-1, 20))
        vboxright.Add(self.textNome)
        vboxright.Add((-1, 20))
        vboxright.Add(self.textCell)
        vboxright.Add((-1, 20))
        vboxright.Add(self.textMail)
        vboxright.Add((-1, 20))
        vboxright.Add(self.button3)

        rightPanel.SetSizer(vboxright)

        hbox.Add(leftPanel, 0, wx.EXPAND | wx.RIGHT, 5)
        hbox.Add(rightPanel, 1, wx.EXPAND)
        hbox.Add((3, -1))

        panel.SetSizer(hbox)

        self.Centre()
        self.Show(True)
        self.button3.Show(False)

    def VisualizzaValori(self, event):
        if self.box.IsChecked(event.GetSelection()):
            self.button3.Show(True)
            message = ' ....scelto.'
            self.keycontatto = self.box.GetString(event.GetSelection())
            #print "scelto contatto --> %s" %self.keycontatto
            self.SetStatusText(self.box.GetString(event.GetSelection()) + message)
            self.nome = self.box.GetString(event.GetSelection())
            nome = self.rubrica[str(self.keycontatto)]['name']
            cognome = self.rubrica[str(self.keycontatto)]['cognome']
            cell = self.rubrica[str(self.keycontatto)]['cell']
            mail = self.rubrica[str(self.keycontatto)]['mail']
            print nome, cognome, cell, mail

            self.textCognome.SetLabel(str(cognome))
            self.textNome.SetLabel(str(nome))
            self.textCell.SetLabel(str(cell))
            self.textMail.SetLabel(str(mail))

        else:
            self.button3.Show(False)
            message = ' ....scartato.'
            self.SetStatusText(self.box.GetString(event.GetSelection()) + message)
            self.textCognome.SetLabel('------')
            self.textNome.SetLabel('------')
            self.textCell.SetLabel('------')
            self.textMail.SetLabel('------')

    def DelUser(self, event):
        dialog = wx.MessageDialog(None, "Vuoi veramente eliminare il contatto?",
                                'MessageBox',wx.YES_NO | wx.ICON_EXCLAMATION)
        if dialog.ShowModal() == wx.ID_NO:
            print "Contatto non cancellato!"
            exit
        else:
            print "...cancello %s" %self.keycontatto
            del self.rubrica[str(self.keycontatto)]
            print self.keycontatto, "...cancellato!"
        dialog.Destroy()

    def Exit(self, event):
        self.rubrica.close()
        self.Close()

if __name__ == "__main__":
    app = wx.PySimpleApp()
    vedi = Visualizza()
    app.MainLoop()

Lanciando il file core.py otterremo:


CLiccando il pulsante “aggiungi Contatto” o scegliendo il menu
Contatti – ADD, apparirà la successiva interfaccia:

Cliccando invece sul pulsante “visualizza contatto” o scegliendo
il menu COntatti – VIEW apparirà:

Cliccando sui contatti disponibili nella CHECKLISTBOX, apparirà a
destra anche un pulsante per la cancellazione del contatto cliccato
(con tanto di conferma).

AUTOCRITICA:

Non è elegantissimo aprire la rubrica all’interno dei due programmi
AggiungiCOntatto e VisualizzaCOntatto

Al prossimo giro, tenterò di migliorarne l’aspetto, magari mettendo una
toolbar al posto dei pulsanti o al posto degli stessi menu.
Uno sfondo… e così via.

versione migliorata

Categorie:python Tag:,
  1. Non c'è ancora nessun commento.
  1. maggio 21, 2011 alle 11:03 am

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: