Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.64 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # ftk.py
  5.  
  6. import pygtk
  7. pygtk.require('2.0')
  8. import gtk, gobject
  9. # Digit eredita gtk.Entry ed aggiunge la gestione di una entry numerica.
  10. # la virgola decimale, i punti per le migliaia, il segno -
  11.  
  12. # inoltre aggiunge i metodi set_value(float) e get_value()  (ritorna un float)
  13. # per impostare o leggere il contenuto del widget.
  14.  
  15. # set e get_label per modoficare l'etichetta.
  16. # La possibilità di impostare la quantità di decimali (al momento dell'istanza,
  17. # di default impostato a 2 decimali) o attraverso il metodo set_decimal(int).
  18.  
  19. # Il metodo set_border_type(gtk.SHADOW_xx) per impostare il bordo del frame.
  20.  
  21. # set_signal_handler: è necessario passare l'handler se si connette 'changed'
  22. # per evitare disturbi dai segnali di cambiamento (changed) emessi dalla gtk.Entry
  23. # di origine durante durante l'elaborazione interna.
  24.  
  25. # set_minus_red, se impostato a True (default = True) mostra i dati inferiori a 0
  26. # con il colore rosso.
  27.  
  28. # set_minus_offset indica il numero sotto al quale la entry mostra il dato in rosso
  29. # (default = 0) se set_minus_red è impostato a True.
  30.  
  31. # importare ftk nel proprio script ed utilizzare ftk.digit al posto di gtk.Entry
  32. # es:
  33. # myDigit_Totale = ftk.digit('Totale', int)
  34. # poi per visualizzare l'oggetto, inserire nel proprio container non myDigit_Totale
  35. # ma myDigit_Totale.frame in quanto la entry viene inserita in un frame in odo da
  36. # avere la label di default, cl nome passato durante l'istanza
  37.  
  38. class Digit(gtk.Entry):
  39.     """ importare ftk nel proprio script ed utilizzare ftk.digit al posto di gtk.Entry
  40.        es:
  41.        myDigit_Totale = ftk.digit('Totale')
  42.        poi per visualizzare l'oggetto, inserire nel proprio container non myDigit_Totale
  43.        ma myDigit_Totale.frame in quanto la entry viene inserita in un frame in odo da
  44.        avere la label di default, cl nome passato durante l'istanza
  45.    """
  46.     #--------------------------------------------------------------------------------------------------------------------------
  47.     def set_signal_handler(self, handler):
  48.         self.set_data('handler', handler)
  49.         return
  50.    
  51.     #--------------------------------------------------------------------------------------------------------------------------
  52.     def get_handler(self):        
  53.         return self.get_data('handler')
  54.    
  55.     #--------------------------------------------------------------------------------------------------------------------------
  56.     def set_label(self, valore):
  57.         self.frame.set_label(str(valore))
  58.         return
  59.    
  60.     #--------------------------------------------------------------------------------------------------------------------------
  61.     def get_label(self):
  62.         return self.frame.get_label()
  63.        
  64.     #--------------------------------------------------------------------------------------------------------------------------
  65.     def set_value(self, valore):
  66.         self.set_text(str(valore).replace('.',self.virgola))
  67.         self.on_digit_focus_out(self,gtk.gdk.EventType(gtk.gdk.FOCUS_CHANGE))
  68.         return
  69.    
  70.     #--------------------------------------------------------------------------------------------------------------------------
  71.     def get_value(self):
  72.         valore = self.get_text().replace('.','')
  73.         valore = valore.replace(self.virgola,'.')
  74.         return float(valore)
  75.        
  76.     #--------------------------------------------------------------------------------------------------------------------------
  77.     def set_decimal(self, qt_dec):        
  78.         self.def_val = '0'
  79.         self.qt_dec = qt_dec
  80.         if qt_dec > 0:
  81.             self.def_val = '0,' + '0'*qt_dec            
  82.         self.on_digit_focus_out(self,gtk.gdk.EventType(gtk.gdk.FOCUS_CHANGE))
  83.         return
  84.    
  85.     #--------------------------------------------------------------------------------------------------------------------------
  86.     def get_decimal(self):
  87.         return self.qt_dec
  88.    
  89.     #--------------------------------------------------------------------------------------------------------------------------
  90.     def set_border_type(self, valore):
  91.         """ set_bordo(valore) valore = gtk.SHADOW_NONE, gtk.SHADOW_IN, gtk.SHADOW_OUT, gtk.SHADOW_ETCHED_IN, gtk.SHADOW_ETCHED_OUT) """
  92.         lista = [gtk.SHADOW_NONE, gtk.SHADOW_IN, gtk.SHADOW_OUT, gtk.SHADOW_ETCHED_IN, gtk.SHADOW_ETCHED_OUT]
  93.         if valore in lista:
  94.             self.frame.set_shadow_type(valore)
  95.         return    
  96.     #--------------------------------------------------------------------------------------------------------------------------
  97.     def get_border_type(self):
  98.         return self.frame.get_shadow_type()
  99.    
  100.     #--------------------------------------------------------------------------------------------------------------------------
  101.     def set_minus_red(self, bool=True):
  102.         self.minus_red = bool
  103.         return    
  104.     #--------------------------------------------------------------------------------------------------------------------------
  105.     def get_minus_red(self):
  106.         return self.minus_red
  107.    
  108.     #--------------------------------------------------------------------------------------------------------------------------
  109.     def set_minus_offset(self, valore=0):
  110.         self.color_offset = valore
  111.         return    
  112.     #--------------------------------------------------------------------------------------------------------------------------
  113.     def get_minus_offset(self):
  114.         return self.color_offset
  115.      
  116.     #--------------------------------------------------------------------------------------------------------------------------
  117.     def on_key_pess(self, widget, event):
  118.         # controlla la pressione dei tasti per accettare solo le cifre, la ',' e il '-'
  119.         # controlla inoltre la posizione del cursore per accettare o meno ',' e '-'
  120.         # controlla la quantità dei decimali
  121.        
  122.         cifre = [49,50,51,52,53,54,55,56,57,48,45,44,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465]
  123.         if event.keyval == 65454 or event.keyval == 46: event.keyval = 44
  124.         if event.keyval == 44 and self.qt_dec == 0: event.keyval = 0
  125.         if event.keyval == 65453: event.keyval = 45
  126.         if event.keyval == 45 and widget.get_position() > 0: event.keyval = 0
  127.         if event.keyval == 44 and widget.get_text().count(self.virgola) > 0: event.keyval = 0
  128.         if not event.keyval in(cifre): event.keyval = 0
  129.         pos_virg = widget.get_text().find(self.virgola)
  130.         if pos_virg <> -1 and widget.get_position() > pos_virg + self.qt_dec: event.keyval = 0        
  131.         return            
  132.    
  133.     #--------------------------------------------------------------------------------------------------------------------------
  134.     def w_set_text(self, stringa):
  135.         hand = self.get_data('handler')
  136.         self.handler_block(hand)
  137.         self.set_text(stringa)
  138.         self.handler_unblock(hand)
  139.         return
  140.    
  141.     #--------------------------------------------------------------------------------------------------------------------------
  142.     def w_insert_text(self, stringa, pos):
  143.         hand = self.get_data('handler')
  144.         self.handler_block(hand)
  145.         self.insert_text(stringa, pos)        
  146.         self.handler_unblock(hand)
  147.         return
  148.    
  149.     #--------------------------------------------------------------------------------------------------------------------------
  150.     def on_digit_focus_out(self, widget, event):        
  151.         # se si esce dalla entry vuota imposta lo 0 di default
  152.         bStr = str(widget.get_text())
  153.         if bStr == '' or bStr == '-' :
  154.             self.w_set_text(self.def_val)
  155.             return
  156.         if float(bStr.replace(self.virgola,'.')) == 0.0:
  157.             self.w_set_text(self.def_val)
  158.             return
  159.  
  160.         ## non va bene perchè mi mette cmq la notazione scentifica
  161.         ## quindi ho fatto la gestione degli '0' inutili
  162.         #n = '%g' % (float(bStr.replace(',','.')))
  163.         #bStr= str(n).replace('.',',')
  164.         #widget.set_text(bStr)        
  165.        
  166.         # cerca la ',' e ne memorizza la posizione.
  167.         # Se non c'è la virgola prende len(str) come posizione
  168.         # (serve per l'eliminazione deli '0' inutili ed per i separatori di migliaia)
  169.         pos_virg = widget.get_text().find(self.virgola)
  170.         if pos_virg == -1: pos_virg = len(widget.get_text())
  171.        
  172.         # controlla ed elimina gli '0' inutili a sinistra
  173.         zero,notzero,meno = 0,0,0
  174.         for i in range(pos_virg):
  175.             if bStr[i] =='-'                    : meno +=1  
  176.             if bStr[i] <>'-' and bStr[i] == '0' : zero +=1
  177.             if bStr[i] <>'-' and bStr[i] <> '0' :
  178.                 notzero +=1
  179.                 break        
  180.         if notzero == 0: zero -= 1
  181.         if meno == 1: zero += 1
  182.         d = bStr[:meno] + bStr[zero:]
  183.         self.w_set_text(d)
  184.         bStr = d
  185.         pos_virg = pos_virg-zero+meno
  186.        
  187.         #aggiunge '0' mancanti dopo la ','        
  188.         if len(bStr) <> pos_virg:
  189.             for i in range(pos_virg+1 + self.qt_dec - len(bStr) ):
  190.                 bStr += '0'
  191.         self.w_set_text(bStr)
  192.        
  193.         # iserisce i separatori per le migliaia
  194.         numero = float(widget.get_text().replace(self.virgola,'.'))
  195.         indice = []
  196.         if bStr[0] == '-':            
  197.             numero = numero * -1            
  198.         for i in range(3,303,3):            
  199.             if numero//10**i > 0:
  200.                 indice.append(i)
  201.                 if i == 300:
  202.                     self.w_set_text(self.def_val)
  203.                     indice = []
  204.                     break                    
  205.             else:
  206.                 break
  207.         for i in indice:
  208.             self.w_insert_text('.', pos_virg-i)    
  209.         #print round(numero, self.qt_dec)
  210.        
  211.         if self.minus_red == True:
  212.             a = widget.get_text().replace('.','')
  213.             a = a.replace(',','.')
  214.             if float(a) < self.color_offset:
  215.                 self.modify_text(gtk.STATE_NORMAL, gtk.gdk.Color('darkred'))
  216.             else:
  217.                 self.modify_text(gtk.STATE_NORMAL, gtk.gdk.Color('black'))
  218.         return
  219.    
  220.     #--------------------------------------------------------------------------------------------------------------------------            
  221.     def on_digit_focus_in(self, widget, event):
  222.        
  223.         if widget.get_text() == self.def_val:
  224.             self.w_set_text('')      
  225.         self.w_set_text(widget.get_text().replace('.',''))
  226.         return
  227.    
  228.     #--------------------------------------------------------------------------------------------------------------------------            
  229.     def on_digit_change(self, widget ):
  230.        
  231.         def zero(pos):
  232.             # inserisce lo '0' prima della virgola, e sposta il cursore a destra
  233.             self.w_insert_text('0', pos)
  234.             gobject.timeout_add(20, lambda t: t.set_position(pos+2), widget)
  235.             return
  236.        
  237.         bStr = widget.get_text()
  238.         slen = len(bStr)
  239.         if slen > 0:
  240.             if slen == 1 and bStr[slen-1] == self.virgola:
  241.                 zero(0)
  242.             if slen == 2 and bStr[slen-2] == '-' and bStr[slen-1] == self.virgola:
  243.                 zero(1)
  244.         return
  245.    
  246.     #--------------------------------------------------------------------------------------------------------------------------            
  247.     #--------------------------------------------------------------------------------------------------------------------------            
  248.     def __init__(self, nome='Label', qt_dec=2):
  249.         """ nome (str) è la label che viene visualizzata
  250.            qt_dec (int) le cifre dopo la virgola
  251.        """        
  252.         gtk.Entry.__init__(self)
  253.        
  254.         self.virgola = ','
  255.         self.qt_dec = qt_dec
  256.         self.def_val = '0,00'        
  257.         self.minus_red = True
  258.         self.color_offset = 0
  259.                
  260.         self.h_changed = self.connect_after('changed',self.on_digit_change)
  261.         self.h_focus_out = self.connect('focus-out-event', self.on_digit_focus_out)
  262.         self.h_focus_in = self.connect('focus-in-event', self.on_digit_focus_in)
  263.         self.h_key_press = self.connect('key-press-event', self.on_key_pess)
  264.        
  265.         self.frame = gtk.Frame()
  266.         self.frame.set_label(nome)
  267.         self.frame.set_shadow_type(gtk.SHADOW_NONE)
  268.         self.frame.add(self)
  269.         self.frame.show_all()
  270.        
  271.         self.set_signal_handler(self.h_changed)
  272.         self.set_decimal(qt_dec)  
  273.         self.w_set_text(self.def_val)
  274.  
  275. #################################################
  276.  
  277. #!/usr/bin/python
  278. # -*- coding: utf-8 -*-
  279.  
  280. # win.py
  281.  
  282. import pygtk
  283. pygtk.require('2.0')
  284. import gtk, gobject, ftk
  285.  
  286. class Main:
  287.    
  288.     def on_importo_changed(self, w):
  289.         print 'importo'
  290.        
  291.     def on_totale_changed(self, w):
  292.         print 'totale'
  293.    
  294.     def destroy(self, widget, data=None):
  295.         print "destroy signal occurred"
  296.         gtk.main_quit()
  297.    
  298.     def __init__(self):
  299.        
  300.         win=gtk.Window(gtk.WINDOW_TOPLEVEL)
  301.         win.connect("destroy", self.destroy)
  302.         fixed = gtk.Fixed()
  303.         win.add(fixed)
  304.        
  305.         importo =ftk.Digit('Importo')
  306.         totale  =ftk.Digit('Totale')
  307.        
  308.         h_im = importo.connect('changed', self.on_importo_changed)
  309.         h_to = totale.connect('changed', self.on_totale_changed)
  310.        
  311.         importo.set_signal_handler(h_im)
  312.         totale.set_signal_handler(h_to)
  313.        
  314.         fixed.put(importo.frame, 0,  0)
  315.         fixed.put(totale.frame , 0, 40)
  316.        
  317.         win.show_all()
  318.        
  319. a=Main()
  320. gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement