Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- # ftk.py
- import pygtk
- pygtk.require('2.0')
- import gtk, gobject
- # Digit eredita gtk.Entry ed aggiunge la gestione di una entry numerica.
- # la virgola decimale, i punti per le migliaia, il segno -
- # inoltre aggiunge i metodi set_value(float) e get_value() (ritorna un float)
- # per impostare o leggere il contenuto del widget.
- # set e get_label per modoficare l'etichetta.
- # La possibilità di impostare la quantità di decimali (al momento dell'istanza,
- # di default impostato a 2 decimali) o attraverso il metodo set_decimal(int).
- # Il metodo set_border_type(gtk.SHADOW_xx) per impostare il bordo del frame.
- # set_signal_handler: è necessario passare l'handler se si connette 'changed'
- # per evitare disturbi dai segnali di cambiamento (changed) emessi dalla gtk.Entry
- # di origine durante durante l'elaborazione interna.
- # set_minus_red, se impostato a True (default = True) mostra i dati inferiori a 0
- # con il colore rosso.
- # set_minus_offset indica il numero sotto al quale la entry mostra il dato in rosso
- # (default = 0) se set_minus_red è impostato a True.
- # importare ftk nel proprio script ed utilizzare ftk.digit al posto di gtk.Entry
- # es:
- # myDigit_Totale = ftk.digit('Totale', int)
- # poi per visualizzare l'oggetto, inserire nel proprio container non myDigit_Totale
- # ma myDigit_Totale.frame in quanto la entry viene inserita in un frame in odo da
- # avere la label di default, cl nome passato durante l'istanza
- class Digit(gtk.Entry):
- """ importare ftk nel proprio script ed utilizzare ftk.digit al posto di gtk.Entry
- es:
- myDigit_Totale = ftk.digit('Totale')
- poi per visualizzare l'oggetto, inserire nel proprio container non myDigit_Totale
- ma myDigit_Totale.frame in quanto la entry viene inserita in un frame in odo da
- avere la label di default, cl nome passato durante l'istanza
- """
- #--------------------------------------------------------------------------------------------------------------------------
- def set_signal_handler(self, handler):
- self.set_data('handler', handler)
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_handler(self):
- return self.get_data('handler')
- #--------------------------------------------------------------------------------------------------------------------------
- def set_label(self, valore):
- self.frame.set_label(str(valore))
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_label(self):
- return self.frame.get_label()
- #--------------------------------------------------------------------------------------------------------------------------
- def set_value(self, valore):
- self.set_text(str(valore).replace('.',self.virgola))
- self.on_digit_focus_out(self,gtk.gdk.EventType(gtk.gdk.FOCUS_CHANGE))
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_value(self):
- valore = self.get_text().replace('.','')
- valore = valore.replace(self.virgola,'.')
- return float(valore)
- #--------------------------------------------------------------------------------------------------------------------------
- def set_decimal(self, qt_dec):
- self.def_val = '0'
- self.qt_dec = qt_dec
- if qt_dec > 0:
- self.def_val = '0,' + '0'*qt_dec
- self.on_digit_focus_out(self,gtk.gdk.EventType(gtk.gdk.FOCUS_CHANGE))
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_decimal(self):
- return self.qt_dec
- #--------------------------------------------------------------------------------------------------------------------------
- def set_border_type(self, valore):
- """ set_bordo(valore) valore = gtk.SHADOW_NONE, gtk.SHADOW_IN, gtk.SHADOW_OUT, gtk.SHADOW_ETCHED_IN, gtk.SHADOW_ETCHED_OUT) """
- lista = [gtk.SHADOW_NONE, gtk.SHADOW_IN, gtk.SHADOW_OUT, gtk.SHADOW_ETCHED_IN, gtk.SHADOW_ETCHED_OUT]
- if valore in lista:
- self.frame.set_shadow_type(valore)
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_border_type(self):
- return self.frame.get_shadow_type()
- #--------------------------------------------------------------------------------------------------------------------------
- def set_minus_red(self, bool=True):
- self.minus_red = bool
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_minus_red(self):
- return self.minus_red
- #--------------------------------------------------------------------------------------------------------------------------
- def set_minus_offset(self, valore=0):
- self.color_offset = valore
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def get_minus_offset(self):
- return self.color_offset
- #--------------------------------------------------------------------------------------------------------------------------
- def on_key_pess(self, widget, event):
- # controlla la pressione dei tasti per accettare solo le cifre, la ',' e il '-'
- # controlla inoltre la posizione del cursore per accettare o meno ',' e '-'
- # controlla la quantità dei decimali
- cifre = [49,50,51,52,53,54,55,56,57,48,45,44,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465]
- if event.keyval == 65454 or event.keyval == 46: event.keyval = 44
- if event.keyval == 44 and self.qt_dec == 0: event.keyval = 0
- if event.keyval == 65453: event.keyval = 45
- if event.keyval == 45 and widget.get_position() > 0: event.keyval = 0
- if event.keyval == 44 and widget.get_text().count(self.virgola) > 0: event.keyval = 0
- if not event.keyval in(cifre): event.keyval = 0
- pos_virg = widget.get_text().find(self.virgola)
- if pos_virg <> -1 and widget.get_position() > pos_virg + self.qt_dec: event.keyval = 0
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def w_set_text(self, stringa):
- hand = self.get_data('handler')
- self.handler_block(hand)
- self.set_text(stringa)
- self.handler_unblock(hand)
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def w_insert_text(self, stringa, pos):
- hand = self.get_data('handler')
- self.handler_block(hand)
- self.insert_text(stringa, pos)
- self.handler_unblock(hand)
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def on_digit_focus_out(self, widget, event):
- # se si esce dalla entry vuota imposta lo 0 di default
- bStr = str(widget.get_text())
- if bStr == '' or bStr == '-' :
- self.w_set_text(self.def_val)
- return
- if float(bStr.replace(self.virgola,'.')) == 0.0:
- self.w_set_text(self.def_val)
- return
- ## non va bene perchè mi mette cmq la notazione scentifica
- ## quindi ho fatto la gestione degli '0' inutili
- #n = '%g' % (float(bStr.replace(',','.')))
- #bStr= str(n).replace('.',',')
- #widget.set_text(bStr)
- # cerca la ',' e ne memorizza la posizione.
- # Se non c'è la virgola prende len(str) come posizione
- # (serve per l'eliminazione deli '0' inutili ed per i separatori di migliaia)
- pos_virg = widget.get_text().find(self.virgola)
- if pos_virg == -1: pos_virg = len(widget.get_text())
- # controlla ed elimina gli '0' inutili a sinistra
- zero,notzero,meno = 0,0,0
- for i in range(pos_virg):
- if bStr[i] =='-' : meno +=1
- if bStr[i] <>'-' and bStr[i] == '0' : zero +=1
- if bStr[i] <>'-' and bStr[i] <> '0' :
- notzero +=1
- break
- if notzero == 0: zero -= 1
- if meno == 1: zero += 1
- d = bStr[:meno] + bStr[zero:]
- self.w_set_text(d)
- bStr = d
- pos_virg = pos_virg-zero+meno
- #aggiunge '0' mancanti dopo la ','
- if len(bStr) <> pos_virg:
- for i in range(pos_virg+1 + self.qt_dec - len(bStr) ):
- bStr += '0'
- self.w_set_text(bStr)
- # iserisce i separatori per le migliaia
- numero = float(widget.get_text().replace(self.virgola,'.'))
- indice = []
- if bStr[0] == '-':
- numero = numero * -1
- for i in range(3,303,3):
- if numero//10**i > 0:
- indice.append(i)
- if i == 300:
- self.w_set_text(self.def_val)
- indice = []
- break
- else:
- break
- for i in indice:
- self.w_insert_text('.', pos_virg-i)
- #print round(numero, self.qt_dec)
- if self.minus_red == True:
- a = widget.get_text().replace('.','')
- a = a.replace(',','.')
- if float(a) < self.color_offset:
- self.modify_text(gtk.STATE_NORMAL, gtk.gdk.Color('darkred'))
- else:
- self.modify_text(gtk.STATE_NORMAL, gtk.gdk.Color('black'))
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def on_digit_focus_in(self, widget, event):
- if widget.get_text() == self.def_val:
- self.w_set_text('')
- self.w_set_text(widget.get_text().replace('.',''))
- return
- #--------------------------------------------------------------------------------------------------------------------------
- def on_digit_change(self, widget ):
- def zero(pos):
- # inserisce lo '0' prima della virgola, e sposta il cursore a destra
- self.w_insert_text('0', pos)
- gobject.timeout_add(20, lambda t: t.set_position(pos+2), widget)
- return
- bStr = widget.get_text()
- slen = len(bStr)
- if slen > 0:
- if slen == 1 and bStr[slen-1] == self.virgola:
- zero(0)
- if slen == 2 and bStr[slen-2] == '-' and bStr[slen-1] == self.virgola:
- zero(1)
- return
- #--------------------------------------------------------------------------------------------------------------------------
- #--------------------------------------------------------------------------------------------------------------------------
- def __init__(self, nome='Label', qt_dec=2):
- """ nome (str) è la label che viene visualizzata
- qt_dec (int) le cifre dopo la virgola
- """
- gtk.Entry.__init__(self)
- self.virgola = ','
- self.qt_dec = qt_dec
- self.def_val = '0,00'
- self.minus_red = True
- self.color_offset = 0
- self.h_changed = self.connect_after('changed',self.on_digit_change)
- self.h_focus_out = self.connect('focus-out-event', self.on_digit_focus_out)
- self.h_focus_in = self.connect('focus-in-event', self.on_digit_focus_in)
- self.h_key_press = self.connect('key-press-event', self.on_key_pess)
- self.frame = gtk.Frame()
- self.frame.set_label(nome)
- self.frame.set_shadow_type(gtk.SHADOW_NONE)
- self.frame.add(self)
- self.frame.show_all()
- self.set_signal_handler(self.h_changed)
- self.set_decimal(qt_dec)
- self.w_set_text(self.def_val)
- #################################################
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- # win.py
- import pygtk
- pygtk.require('2.0')
- import gtk, gobject, ftk
- class Main:
- def on_importo_changed(self, w):
- print 'importo'
- def on_totale_changed(self, w):
- print 'totale'
- def destroy(self, widget, data=None):
- print "destroy signal occurred"
- gtk.main_quit()
- def __init__(self):
- win=gtk.Window(gtk.WINDOW_TOPLEVEL)
- win.connect("destroy", self.destroy)
- fixed = gtk.Fixed()
- win.add(fixed)
- importo =ftk.Digit('Importo')
- totale =ftk.Digit('Totale')
- h_im = importo.connect('changed', self.on_importo_changed)
- h_to = totale.connect('changed', self.on_totale_changed)
- importo.set_signal_handler(h_im)
- totale.set_signal_handler(h_to)
- fixed.put(importo.frame, 0, 0)
- fixed.put(totale.frame , 0, 40)
- win.show_all()
- a=Main()
- gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement