Skinnysite.net

... un modo di esprimersi.

Font Size

Cpanel

Funzione: getTollDate

Valutazione attuale:  / 0
ScarsoOttimo 

Utilizzando il programma GNU Cash durante la gestione del mio bilancio familiare, mi sono ritrovato a dover inserire tutte le spese relative ai pedaggi autostradali fatti durante i miei spostamenti ed è stato abbastanza facile per quanto riguarda il costo, ma per quanto riguarda la data del pedaggio, mi sono accorto essere scritta in un formato particolare. Infatti è così espressa: anno/numero del giorno. Per fare un esempio, la data "2008-06-05" è così riportata 8/157 che è veramente poco leggibile. Per questa ragione ho realizzato un script Python che risolvesse questo problema. In un primo momento ho fatto uno script per la shell, poi per ragioni di comodità ho pensato di modificalo per implementare un'interfaccia grafica (visibile sotto), più facile da usare soprattutto per mia moglie.

Immagine calcolo pedaggio autostradale

Qui sotto riporto il sorgente che è anche possibile scaricare QUI.
Il file che deve essere lanciato è getTolldate.py


 

# --Inizio file number_date.py-- 

## @package number_date
# Questo modulo ricava il semplice calcolo della data
import os
import sys
import datetime

## Documentazione della classe Number_date.
# La classe Number_date ha 2 attributi nei quali dovrebbero essera passati
# i valori che fanno riferimento all'anno e al giorno presenti sull'attestato
# di transito.
class Number_date:
## Il costruttore.
def __init__(self):
## attributo che rappresenta i giorni
self.d = 0
self.__nParams = 0
#Metto un numero massimo di giorni consentiti
self.__maxDays = 366
#Metto un numero massimo di anni consentiti
self.__maxYear = 2300
self.__today = datetime.date.today()
## attributo che rappresenta l'anno
self.y = 0

## Documentazione sulla funzione getParameters.
# Questa funzione è stata realizzata per analizzare gli argomenti
# passati allo script qualora venisse chiamato questo modulo dalla
# shell
def getParameters(self):
self.__nParams = len(sys.argv)
#Imposto la variabile che specifica l'esito dei controlli
self.b_stop = 1

if self.__nParams == 3:
self.d = sys.argv[1]
self.y = sys.argv[2]
self.b_stop = checkParam1(self.d)
self.b_stop = checkParam2(self.y)
elif self.__nParams == 2:
self.d = sys.argv[1]
self.y = self.__today.year
self.b_stop = checkParam1(self.d)
else:
if self.d == 0:
self.d = 1
if self.y == 0:
self.y = self.__today.year

return self.b_stop

#controllo il 2 parametro
## Documentazione sulla funzione checkParam2.
# @param y Rappresenta l'anno di riferimento.
def checkParam2(self, y):
if not isNumeric(y):
print "Inserisci un numero per l'anno"
self.b_stop = 0
else:
if int(y) > int(self.__maxYear) or int(y) < 0:
print "Anno inserito errato"
self.b_stop = 0
return self.b_stop

## Documentazione sulla funzione checkParam1.
# @param d Rappresenta il giorno di riferimento.
def checkParam1(self, d):
b_ko = 1

if not isNumeric(self.d):
# not numeric
print "Inserisci un numero per il giorno"
b_ko = 0
else:
if int(self.d) > int(self.__maxDays):
# numeric
print "Giorni inseriti errati"
b_ko = 0
return b_ko

## Documentazione sulla funzione isNumeric.
# @param number Verifica se l'argomento passato è un numero.
def isNumeric(self, number):
try:
i = int(number)
except ValueError:
outcome = 0
else:
outcome = 1
return outcome

## Documentazione sulla funzione writeResult.
# Restituisce il risultato dell'elaborazione
def writeResult(self):
outcome = ""
if self.getParameters() == 1:
if self.__nParams == 1:
if self.d == 0:
outcome = self.__today
else:
now = datetime.date(int("0" + str(self.y)), 1, 1)
outcome = now + datetime.timedelta(days=int("0" + str(self.d))-1)
#print outcome
else:
now = datetime.date(int(self.y), 1, 1)
outcome = now + datetime.timedelta(days=int(self.d)-1)
#print outcome
return outcome
#if getParameters() == 1:
# self.writeResult()
#raw_input()

#myAutoDate = number_date()
#myAutoDate.d = 55
#myAutoDate.y = 2010
#myAutoDate.writeResult()
# --Fine file number_date.py--


# --Inizio file getTollDate.py--
## @package number_date
# Questo modulo gestisce l'interazione con le librerie gtk
import sys
import number_date

try:
import pygtk
#tell pyGTK, if possible, that we want GTKv2
pygtk.require("2.0")
except:
#Some distributions come with GTK2, but not pyGTK
pass

try:
import gtk
import gtk.glade
except:
print "You need to install pyGTK or GTKv2 ",
print "or set your PYTHONPATH correctly."
print "try: export PYTHONPATH=",
print "/usr/local/lib/python2.2/site-packages/"
sys.exit(1)

#now we have both gtk and gtk.glade imported
#Also, we know we are running GTK v

## Documentazione della classe getTollDateGui.
# La classe Number_date ha 2 attributi nei quali dovrebbero essera passati
# i valori che fanno riferimento all'anno e al giorno presenti sull'attestato
# di transito.
class getTollDateGui:
def __init__(self):
self.__pathname = os.path.dirname(sys.argv[0])
self.__gladefile=os.path.abspath(self.__pathname) + "/number_date.glade"
windowname="winGetDate"
self.wTree=gtk.glade.XML (self.__gladefile,windowname)


# we only have two callbacks to register, but
# you could register any number, or use a
# special class that automatically
# registers all callbacks. If you wanted to pass
# an argument, you would use a tuple like this:
# dic = { "on button1_clicked" : \
#(self.button1_clicked, arg1,arg2) , ...

#dic = { "on_button1_clicked" : \
# self.button1_clicked,
# "on_serverinfo_destroy" : \
# (gtk.mainquit) }

#self.wTree.signal_autoconnect (dic)
dic = {
"on_btnCalcola_clicked" : self.btnCalcola_clicked,
"on_btnAnnulla_clicked" : self.btnAnnulla_clicked,
"on_winGetDate_hide" : self.winGetDate_hide,
"on_btnHelp_clicked" : self.btnHelp_clicked,
"on_btnEsci_clicked" : self.btnEsci_clicked,
"on_serverinfo_destroy" : (gtk.mainquit)
}
self.wTree.signal_autoconnect (dic)
return

#CALLBACKS
## Documentazione sulla funzione btnCalcola_clicked.
# Chiama la classe Number_date del modulo number_date e ne visualizza
# il risultato
def btnCalcola_clicked(self,widget):
myAutoDate = number_date.Number_date()
myAutoDate.d = int("0" + self.wTree.get_widget("txtGiorno").get_text())
myAutoDate.y = int("0" + self.wTree.get_widget("txtAnno").get_text())
self.wTree.get_widget("txtData").set_text(str(myAutoDate.writeResult()))

print myAutoDate.writeResult()

## Documentazione sulla funzione btnAnnulla_clicked.
# Ripulisce i dati inseriti nelle caselle di testo e i risultati precedenti
def btnAnnulla_clicked(self,widget):
self.wTree.get_widget("txtAnno").set_text("")
self.wTree.get_widget("txtGiorno").set_text("")
self.wTree.get_widget("txtData").set_text("")

## Documentazione sulla funzione btnHelp_clicked.
# Visualizza una finestra di informazioni
def btnHelp_clicked(self, widget):
windowname="guiInfo"
self.window = gtk.glade.XML (self.__gladefile,windowname)
#self.window.show()

## Documentazione sulla funzione winGetDate_hide.
# Chiude l'applicazione
def winGetDate_hide(self, widget):
sys.exit(1)

## Documentazione sulla funzione btnEsci_clicked.
# Chiude l'applicazione
def btnEsci_clicked(self, widget):
sys.exit(1)

# we start the app like this...
app=getTollDateGui()
gtk.main()
# --Fine file getTollDate.py--

 

Sei qui: Home Code Snippets Python Funzione: getTollDate