Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Topics - nuzzopippo

Pagine: [1] 2 3
1
Altro / Genropy : qualcuno lo conosce? Se si, cosa ne pensate?
« il: Maggio 21, 2023, 10:16 »
Saluti a Voi

Gironzolando fra le varie docs di python mi sono casualmente imbattuto in riferimenti al framework genropy che, come recita nella sua stessa documentazione
Citazione
Genropy è un framework open source per lo sviluppo rapido di Single Page Applications, ovvero applicativi web complessi comparabili nell’esperienza d’uso a quelli desktop
Caratteristiche che un po' mi attirano, dato che il mio target prevalente sono le applicazioni desktop ma sono consapevole che prima o poi dovrò misurarmi con un po' di programmazione web-based su server locale, non fosse altro per costruire piccole utility casalinghe a cui accedere da computer, cellulari, etc.

Leggendo la docs relativa alla installazione, vedo che essa è esemplificata a livello di sistema e prevede l'installazione di GIT ... faccende che non mi garbano, in primis perché cerco di non sporcare il s.o. preferendo, quindi, l'uso dei venv, il secondo luogo perché non gradisco l'idea di impelagarmi in cose tipo "git", non interessandomi per niente.

Forse, documentandomi potrei scoprire se si può utilizzare il framework in un venv locale ma prima ancora mi sorge la domanda se, per il tipo di utilizzi prevedibili (scadenziari, gestione c/c, gestione mediateca, etc) valga la pena di approfondire su detto framework oppure considerare altri, tipo Flask o django, etc ... voi cosa ne pensate?

N.B. : la domanda sorge dalla consapevolezza che facendo una scelta un'annetto di studio dovrei dedicarcelo prima di produrre qualcosa di decente, mi piacerebbe un consiglio da chi sa qualcosa più di me in materia.

Grazie dell'attenzione, ciao :)

2
Tkinter / Un Combobox "Interattivo"
« il: Aprile 03, 2023, 09:07 »
Signori, i miei saluti.

Premetto che il presente post non è una richiesta di supporto; dato che vedo molte new-entry approcciarsi a tkinter e che ho appena "realizzato" un giocattolo per tale ambiente che sembra funzionare benino ed in qualche caso potrebbe essere utile ho deciso di renderlo disponibile ad eventuali interessati.
Naturalmente, eventuali critiche, suggerimenti migliorativi e/o feedback, p.e. sulla funzionalità nel s.o. windows sul quale quanto segue "penso" funzioni ma non è stato testato, saranno graditi ma non sono motivo di questo post.
Veniamo al sodo.

Problematica affrontata
La necessità di dover presentare e selezionare un singolo elemento in una finestra grafica ed in un ridotto spazio una lista di circa 1500 stringhe mi ha fatto optare per l'utilizzo di un ttk.Combobox.
Non me ne ero reso conto in passato, per i ridotti set di dati normalmente utilizzati con tale controllo, ma il ttk.Combobox fornisce unicamente metodologie "visuali" per la navigazione tra i dati e non possiede funzioni di autocompletamento dell'immissione utente, presenti in altri framework, ho deciso, quindi, di sub-classare il ttk.Combobox ed implementare una sorta di auto-completamento che ricerchi ed esponga il primo dato che inizi con un eventuale input dell'utente e si aggiorni interattivamente alla pressione di un tasto.

Da tener presente
* il codice che seguirà utilizza notazioni che compaiono dalla versione 3.10 di python, se si utilizzano versioni antecedenti eliminare i type-hints e sostituire i costrutti match-case con una successione di if/elif;
* ho previsto di acquisire come "input utente" solo numeri e caratteri ordinari ed accentati, omettendo di accogliere caratteri speciali o altro, in caso di particolari necessità si integri la variabile di classe "key_accepted" includendo gli ulteriori caratteri necessari nella stringa ad essa assegnata;
* nella intercettazione della tastiera ho utilizzato i soli valori "keysym", ciò per astrarre dagli effetivi valori dei tasti assegnati nei vari sistemi operativi, ciò "credo" che "dovrebbe" rendere il codice funzionale nei vari s.o. ma non è testato.

Funzionamento visuale del widget
Supposto si parta da una casella di immissione vuota, man mano che l'utente premerà un tasto il cui keysym ricada nella stringa di accettazione vedrà comparire il primo valore che inizia con la seguenza di tasti premuta, tale seguenza avrà il colore di sfondo ordinario mentre il resto del valore avrà i colori del testo selezionato, la pressione di un tasto che dia luogo ad una seguenza senza riscontro verrà ignorata.
La pressione di "Invio", principale o da tastierino numerico, darà luogo alla selezione del valore corrente con generazione di un evento di selezione.
La pressione del tasto "Esc" od un click del tasto sinistro del mouse annullerà in processo, lasciando l'ultimo valore intercettato quale corrente nel Combobox; per altro vengono anche gestiti i tasti freccia, sinistra e destra, ed il backspace.

Funzionamento programmatico del widget
L'implementazione si basa sui metodi di selezione testo delle tk.Entry (di cui il ttk.Combobox è sub-classe) ed utilizza una doppia intercettazione degli eventi di tastiera. Tale doppia intercettazzione è motivata dalla circostanza che i tasti di navigazione "verticale" (frecce su, giù, pagsu, paggiù) vengono intercettate e gestite dall'area di presentazione dati e non disponibili alla Entry costituente la casella di immissione del combobox, tali tasti di navigazione "verticale" vengono intercettati con un binding sull'evento "<KeyPress>" il cui callback ("self._on_keypress") intercetta la sola pressione della freccia in basso ("Down") che interpreta quale volontà di effettuare una navigazione visiva tra i dati e, quindi, annullerà la progressione di input dell'utente.

Più articolata è la gestione dell'evento "<KeyRelease>" di rilascio di un tasto, nel cui callback ("self._on_key") intercettati e memorizzati in una lista ("self._user_val") i tasti con keysym ricadente nei valori ammessi oltre che di "BackSpace", "Left" e "Right" che intervengono sull'input dell'utente, l'intercettazione di tutti detti tasti invoca il metodo di classe "_intercept()" che provvede a valutare il complesso dell'immissione utente, reperire il primo dato soddisfacente la ricerca (o scartare l'ultimo inserimento) e rappresentarlo nella entry con la dovuta evidenziazione, in fine viente interrotto il propagarsi dell'evento (istruzioni "return break").
Vengono altresì gestiti, nel callback self._on_key, il tasto "Escape" che, semplicemente annulla l'operazione lasciando com'è un eventuale dato presente nella entry, oltre che i tasti Invio ("KP_Enter" e "Return") che, se presente dell'input utente, invocano il metodo di classe "self._complete", che provvede a seleziona il valore trovato ed a generare un evento di selezione "<<ComboboxSelected>>", tutti e tre questi tasti lasciano procedere il propagarsi dell'evento.

In ultimo viene anche intercettata la pressione del tasto sinistro del mouse "<Button-1>" sul controllo, il cui callback ("self._on_mouse") si limita a prendere atto della volontà di navigazione visuale, annullando una eventuale immissione dell'utente.

Il codice :
#-*- coding: utf-8 -*-

import tkinter as tk
from tkinter import ttk


class InteractiveCombobox(ttk.Combobox):
    '''Una combobox per intercettare e completare l'input utente'''
    key_accepted = 'qwertyuiopasdfghjklzxcvbnmàèéìòù1234567890'
    def __init__(self, parent, *args, **kwargs) -> None:
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self._user_val = []
        self.bind('<KeyPress>', self._on_keypress)
        self.bind('<KeyRelease>', self._on_key)
        self.bind('<Button-1>', self._on_mouse)
   
    def _on_keypress(self, evt: callable) -> None:
        if evt.keysym == 'Down':
            self._user_val = []
            self.icursor(0)
            self.select_range(tk.INSERT, tk.INSERT)
       
    def _on_key(self, evt: callable) -> None:
        if not self['values']: return
        match evt.keysym:
            case 'BackSpace':
                if len(self._user_val):
                    self._user_val = self._user_val[:-1]
                    self.icursor(0)
                self._intercept()
                return 'break'
            case 'Left':
                if len(self._user_val):
                    self._user_val = self._user_val[:-1]
                self._intercept()
                return 'break'
            case 'Right':
                value = self.get()
                if len(value) > len(self._user_val):
                    self._user_val.append(value[len(self._user_val)])
                self._intercept()
                return 'break'
            case 'Escape':
                self._user_val = []
                self.icursor(0)
                self.select_range(0, tk.END)
            case 'KP_Enter':
                if len(self._user_val):
                    self._complete()
            case 'Return':
                if len(self._user_val):
                    self._complete()
            case _:
                if evt.keysym.lower() in self.key_accepted:
                    self._user_val.append(evt.keysym.lower())
                    self._intercept()
                    return 'break'
   
    def _on_mouse(self, evt: callable) -> None:
        self._user_val = []

    def _complete(self) -> None:
        tok = ''.join(self._user_val)
        data = self['values']
        index = 0
        if tok:
            for i in range(len(data)):
                if data[i].lower().startswith(tok):
                    index = i
                    self._user_val = []
                    self.icursor(0)
                    self.select_range(0, tk.END)
                    break
            self.current(index)
            self.event_generate('<<ComboboxSelected>>')
   
    def _intercept(self) -> None:
        self.delete(len(self._user_val), tk.END)
        tok = ''.join(self._user_val)
        if not tok:
            self.select_range(tk.INSERT, tk.INSERT)
            return
        data = self['values']
        index = 0
        is_match = False
        for i in range(len(data)):
            if data[i].lower().startswith(tok):
                index = i
                is_match = True
                break
        if is_match:
            self.current(index)
            self.select_range(len(self._user_val), tk.END)
        else:
            self.delete(len(self._user_val)-1, tk.END)
            self._user_val = self._user_val[:-1]


Nel caso si voglia visualizzare senza provare, ho scritto un appunto per mia futura memoria corredato di immagini.

Ciao

3
Base / Interpretare encoding caratteri libreria freetype
« il: Febbraio 11, 2023, 08:27 »
I miei saluti

Da qualche giorno sto giocando con i fonts con l'intento iniziale di estrarre i fonts incamerati in un pdf (cosa che mi è riuscita) per poi riutilizzarli per aggiungere del testo nel pdf stesso ... nel corso del discorso stanno diventando interessanti i fonts di per se.

Per affrontare il discorso "Font" ho cominciato a pasticciare con la libreria freetype con la quale mi è riuscito di selezionare, estrarre e rappresentare (in finestre tkinter) i glifi dei caratteri contenuti nei vari charset definiti in un font ma ho forti dubbi sul come approcciare efficacemente riguardo l'aspetto "codifica" dei caratteri.

La libreria Freetype mette a disposizione dei metodi da cui è possibile estrarre la piattaforma di riferimento
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
import freetype
plat = getattr(freetype, 'TT_Platforms')
for key in plat.keys():
    print(key)

   
TT_PLATFORM_APPLE_UNICODE
TT_PLATFORM_MACINTOSH
TT_PLATFORM_ISO
TT_PLATFORM_MICROSOFT
TT_PLATFORM_CUSTOM
TT_PLATFORM_ADOBE

dalla quale è possibile risalire alle codifiche dei caratteri rappresentati in una charmap, esempio per casi Microsoft/Apple
ms_enc = getattr(freetype, 'TT_MS_IDS')
for key in ms_enc.keys():
    print(key)

   
TT_MS_ID_SYMBOL_CS
TT_MS_ID_UNICODE_CS
TT_MS_ID_SJIS
TT_MS_ID_GB2312
TT_MS_ID_BIG_5
TT_MS_ID_WANSUNG
TT_MS_ID_JOHAB
TT_MS_ID_UCS_4
app_enc = getattr(freetype, 'TT_APPLE_IDS')
for key in app_enc.keys():
    print(key)

   
TT_APPLE_ID_DEFAULT
TT_APPLE_ID_UNICODE_1_1
TT_APPLE_ID_ISO_10646
TT_APPLE_ID_UNICODE_2_0
TT_APPLE_ID_UNICODE_32
TT_APPLE_ID_VARIANT_SELECTOR

le codifiche Mac e Microsoft hanno anche delle codifiche riferenti a diverse centinaia di linguaggi ... e qui mi ci sto piantando.

Vuoi per mia ignoranza (l'inglese mi mette Ko), vuoi perché non pongo le "domande giuste" nelle ricerche, non mi sta riuscendo di escogitare una valutazione dei valori di carattere (numeri interi) associati ai glifi, il grosso delle ricerche che riesco ad escogitare mi riporta alla libreria freetype, della quale ho già esaminato i sorgenti python (gli esempi in C non li comprendo) senza alcuna lampadina che si accenda :(

Qualcuno saprebbe darmi qualche suggerimento/dritta circa l'approccio da tenere e docs da consultare?

Grazie della attenzione.

4
I miei saluti.
Forse è una domanda "noiosa" quella che sto per porre, ma si tratta di concetti sui quali mi sembra di arrancare troppo.

Da qualche giorno mi sto "sbattendo" sull'idea di creare delle classi "singleton" con un insieme di proprietà che rimangano "statiche" tra le varie istanze che vengono fatte.
A parte la banale definizione di una classe ed alla sua istanza all'interno di un modulo (da richiamare per l'uso) sin ora mi è riuscito di combinare qualcosa di utile solo ricorrendo alle variabili di classe, tipo l'esempio sotto (che sembra funzionante)
from __future__ import annotations
from typing import Any
from functools import wraps

import datetime
import os

def singleton(o_cls):
    orig_new = o_cls.__new__
    instance = None

    @wraps(o_cls.__new__)
    def __new__(cls, *args, **kwargs):
        nonlocal instance
        if instance is None:
            instance = orig_new(cls, *args, **kwargs)
        return instance
    o_cls.__new__ = __new__
    return o_cls


@singleton
class LogsWriter:
    ''' Scrive dei messaggi nel corrente file di log '''
    '''_instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(LogsWriter, cls).__new__(cls)
        return cls._instance'''
    _logname = ''
       
    def __init__(self) -> None:
        self.log_dir = ''
   
    def set_log_dir(self, logs_dir: str) -> None:
        if not os.path.exists(logs_dir) or not os.path.isdir(logs_dir):
            raise ValueError('Directory non valida')
        self.log_dir = logs_dir
        self._define()

    def _define(self) -> None:
        date = datetime.datetime.now()
        year = date.year
        name = f'Projects_{year}.log'
        f_name = os.path.join(self.log_dir, name)
        self._logname = f_name
   
    def make_log(self, msg: str) -> None:
        date = datetime.datetime.now()
        m = date.strftime('%Y-%m-%d_%H:%M:%S') + '- ' + msg + '\n'
        with open(self._logname, 'a') as f:
            f.write(m)

loger = LogsWriter()

perdendosi, naturalmente, le eventuali variabili di istanza tra una invocazione e l'altra ... ora vorrei implementare qualcosa di più articolato (e magari fatto meglio) quale singleton ma a parte la banalità generalizzata degli esempi che trovo in rete (forse non faccio le ricerche "giuste") od anche perché border-line per me alcuni concetti, tipo le meta-classi, sto girando in tondo.

Qualcuno saprebbe darmi qualche dritta interessante da consultare?

5
Base / hashing di una classe custom : suggerimenti?
« il: Settembre 16, 2022, 16:34 »
Sto realizzando delle procedure di studio/test miranti a derivare metodi per estrarre tabelle e righe "di codice" da un documento pdf.
Le operazioni di che trattasi si basano su di una matrice di caratteri "formattati" e corredati delle coordinate che ogni singolo carattere di testo presente in una pagina del pdf esaminato e, nello specifico della valutazione delle righe "di codice" ho deciso di definire come tali tutte le singole righe (aggregate per coordinate e rotazione) presentino le stesse caratteristiche di font ed occupazione uguali per tutti i caratteri.
Per la valutazione dei font ho implementato una classe di descrizione, che associo poi ad altri oggetti, che per le varie esigenze ho dotato dei metodi dunder "__eq__" ed "__hash__", che è così formata :
class DescrFont:
    def __init__(self, data):
        self.subset = ''
        self.font = ''
        self.size = 0
        self.points_size = 0
        self.style = ''
        self._parse(data)

    def _parse(self, data):
        self.size = data[1]
        self.points_size = self.size * 72 / 96
        tmp = data[0].split('+')
        if len(tmp) > 1:
            self.subset = tmp[0]
            tmp = tmp[1]
        else:
            tmp = tmp[0]
        tmp = tmp.split('-')
        self.font = tmp[0]
        if len(tmp) > 1:
            self.style = tmp[1]

    def __eq__(self, obj):
        if not isinstance(obj, DescrFont): return NotImplemented
        if obj.subset != self.subset: return False
        if obj.font != self.font: return False
        if obj.size != self.size: return False
        if obj.points_size != self.points_size: return False
        if obj.style != self.style: return False
        return True

    def __hash__(self):
        return hash(' '.join([self.subset,
                         self.font,
                         str(self.size),
                         '(' + str(round(self.points_size)) + ')',
                         self.style]))

    def __str__(self):
        return ' '.join([self.subset,
                         self.font,
                         str(self.size),
                         '(' + str(round(self.points_size)) + ')',
                         self.style])

Ho ritenuto, per lo hashing, che la stringa di descrizione del font sia una determinante valida e sufficiente, ed in effetti nei test sin ora effettuati, con utilizzi di comparazione diretta ovvero per generazione dati tramite comprehensions, la classe sembra funzionare bene però mi rendo conto di aver ben poco chiari tal genere di aspetti e mi viene la domanda:

Una implementazione del genere è ben fatta, oppure vi sono particolari che non ho presenti?

Ovviamente, mi rendo conto che una definizione di classe avulsa dal suo contesto di utilizzo può dar adito a perplessità, se si ritiene occorra nulla in contrario, ve lo ho risparmiato perché al momento sono circa 380 righe ed è ancora in evoluzione.
La domanda è fatta più che altro con l'aspettativa del suggerimento su accortezze da tenersi e/o indicazione di documenti validi in materia da studiarsi.

Grazie dell'attenzione, ciao :)

6
Base / User-guide di applicazioni : quali strumenti?
« il: Febbraio 27, 2022, 10:37 »
I miei saluti.

Quando realizzo una qualche applicazione di genere desktop, una cosa che in genere "penso" e non realizzo mai è una guida all'uso della applicazione per l'utente finale, ciò essenzialmente perché non dispongo/conosco strumenti adeguati allo scopo ... intendiamoci, so delle doc-string ma non è quello il "target" che mi pongo bensì il generico utente cui bisogna spiegare passo passo, e magari con disegnini, come utilizzare l'applicazione che ha di fronte.

Dato che non ho niente di significativo da fare mi son da poco messo a realizzare un "qualcosa" che mi aiuti a definire un tal genere di strumento (per redigere un sistema di guida) ma mi è venuto il dubbio che, come spesso mi accade, stia facendo la solita scoperta dell'acqua calda ed esistano già strumenti idonei in circolazione.
So che molti di quelli che passano di qui ne sanno molto più di me, qualcuno di voi sa qualcosa in merito?

Grazie dell'attenzione, ciao.

7
XML e linguaggi derivati / modulo XML, come andar tranquilli?
« il: Dicembre 20, 2021, 12:43 »
I miei saluti.

Sto implementando un giocattolo che, tra le altre cose, "dovrebbe" andarsi a leggere/scrivere playlist di file multimediali, tra i vari formati possibili vi sono anche delle codifiche xml, tutto sommato anche abbastanza comode ma vedo nella docs il seguente warning :

Citazione
Warning The XML modules are not secure against erroneous or maliciously constructed data. If you need to parse untrusted or unauthenticated data see the XML vulnerabilities and The defusedxml Package sections.

Nell'immediato la faccenda non mi da particolari pensieri, dato che il giocattolo è finalizzato ad un uso locale, e neanche mi preoccupa molto per eventuali future espansioni, valutare direttamente il testo non è la fine del mondo, mi chiedo, però, se vi sono moduli python più "robusti" di quello nella libreria standard o se almeno vi siano tutorials sugli accorgimenti da tener presenti, giusto per non re-inventare l'acqua calda.

Con la mia scarsa conoscenza dell'inglese, purtroppo, è una faticaccia raccapezzarsi. Qualcuno saprebbe darmi indicazioni sull'argomento?

Grazie dell'attenzione :)

8
Salve

Sto implementando, per mio uso, un player/organizer audio/video con capacità di ricerca ricorsiva di tal genere di files multimediali.
Per il riconoscimento, al momento, ho implementato i processi tramite "magic" che però, in fase di test si sta rivelando insoddisfacente, infatti a volte invece di riconoscere un file audio per quello che è risponde con un generico
>>> for f in f_audio:
...     print(f, ' - ', magic.from_file(f, mime=True))
...
CD1-01.mp3  -  application/octet-stream
CD1-02.mp3  -  application/octet-stream
CD1-03.mp3  -  application/octet-stream
CD1-04.mp3  -  application/octet-stream

mentre invece sono effettivamente files audio
(vlc_v) NzP:~$ file ./*
./CD1-01.mp3: Audio file with ID3 version 2.3.0
./CD1-02.mp3: Audio file with ID3 version 2.3.0
./CD1-03.mp3: Audio file with ID3 version 2.3.0
./CD1-04.mp3: Audio file with ID3 version 2.3.0

Ovviamente, la faccenda mi complica la vita.

Conoscete qualche libreria più adeguata all'obiettivo (riconoscimento tipi mime) o debbo, ohimè, rassegnarmi a valutare le estensioni?

N.B. - lo so che chi cerca trova ma tra trovare, tradurre e provare rischio di invecchiare su una ca...ta.
..

[/pythoncode]

9
Base / Pattern MVC : dubbi concettuali
« il: Settembre 27, 2021, 08:48 »
I miei saluti.

Ho realizzato l'idea venutami in questo post, "cercando" di adottare un semplice approccio tramite i pattern MVC ed observer, applicazione creata e funzionante, ha superato tutti i test che mi son venuti in mente di fare.

Nell'implementazione adottata il "Model" è un semplice oggetto "Micio" con tre proprietà : nome, immagine (filename) e descrizione ed un paio di metodi per fornire i suoi dati in formato csv oppure scriverli direttamente in un file fornito dal Controller.

La View è una interfaccia grafica tkinter che non ha contatto diretto con il model, non conosce nemmeno l'oggetto "Micio", si limita ad istanziare un oggetto "Gattario" (che sarebbe il controller) ed inviare dei messaggi (Richieste) tramite la funzione "pub" di un modulo pypubsub oltre, naturalmente, a registrare e revocare la registrazione di alcuni oggetti e metodi quali observer.

Il controller (Gattario) NON comunica direttamente con l'interfaccia grafica (tranne in un singolo caso), si limita ad intercettare delle "Richieste" pubblicate con un suo metodo sottoscritto quale observer e decodificare il messaggio inviato tramite un protocollo stabilito ad-och. Per altro il controller definisce una struttura di directory di supporto all'applicazione per lo storage dei dati ed il caching dei file-immagine, in modo che siano comunque disponibili anche se provenienti da supporti rimovibili.
Inoltre ed è questo il mio punto dubbio principale, il controller carica direttamente i dati leggendosi il file csv e memorizzando i "Micetti" in una lista ... mi chiedo se questa lista, concettualmente, dovesse far parte del "Model" o meno.

... oddio, non è che poi sia sicurissimo della correttezza formale di insieme ;) qualche parere sarebbe gradito.

Grazie dell'attenzione.

10
I miei saluti

Sto sperimentando delle GUI, in wxpython, nelle quali alcuni controlli vengono ridefiniti dinamicamente sulla base di dati ricevuti, in particolare per uno slider, così inizializzato
        self.sl_columns = wx.Slider(p_col_tools,
                                    style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS)
        self.sl_columns.SetToolTip('Imposta punto iniziale nuova colonna')

viene ridefinito l'intervallo dei valori e stabilita la frequenza dei  "tik" sulla base della massima dimensione di riga di un testo ricevuto, come nel codice sottostante
    def _def_max_len(self):
        text = self.t_text.Value
        rows = text.split('\n')
        maximo = 0
        for r in rows:
            if len(r) > maximo: maximo = len(r)
        if maximo > self.maximo:
            self.maximo = maximo
            self.sl_columns.SetRange(1, self.maximo)
            self.sl_columns.SetTickFreq(self.maximo//10)
        # aggiunge spazi ad ogni riga per raggiungere il massimo
...

l'istuzione "self.sl_columns.SetTickFreq(self.maximo//10)" fa ricevere, nel terminale, numerosi warning's come nello stralcio sotto:
(textutility.py:13055): Gtk-WARNING **: 08:08:38.633: Drawing a gadget with negative dimensions. Did you forget to allocate a size? (node indicator owner GtkScale)

(textutility.py:13055): Gtk-WARNING **: 08:08:38.633: Drawing a gadget with negative dimensions. Did you forget to allocate a size? (node mark owner GtkScale)

al momento del "ridisegno" lo slider è disabilitato.

In genere, anche se non sempre, quando ricevo dei Gtk-WARNING, indagando trovo delle improprietà/imprecisioni nel mio codice che, una volta corrette, risolvono ma nel caso in specie sto girando a tondo e non trovo dove "toppo" ... Qualcuno si è trovato dinanzi il problema e saprebbe dare suggerimenti?

Specifiche di sistema :
(p38c_v) NzP:~$ python --version
Python 3.8.10
>>> wx.version()
'4.1.0 gtk3 (phoenix) wxWidgets 3.1.4'
>>>


Grazie dell'attenzione :)

11
Base / Python & Windows : Con quali tools partire?
« il: Agosto 26, 2021, 12:04 »
I miei saluti

Dopo che per decenni ho accuratamente evitato di utilizzare i sistemi operativi Microsoft, e tutto ciò ad essi connesso, mi son deciso ad acquistare una licenza W10 Home al solo fine di provare un po' come funziona python in tale sistema, sono agli inizi ma approfondirò.

Non ho riscontrato problemi di sorta nei primi approcci di base, con un interprete python, notepad++ e powershell si va abbastanza bene, sorgono però delle "complicazioni" se provo ad utilizzare delle librerie riferenti a programmi open-source di utilità anche se questi ultimi "avrebbero" delle versioni per windows, giusto p.e. per usare wand ho installato imagemagick in windows, funziona ma nel codice python vengono richieste le librerie wingc, img2pdf richiede poppler nel sistema per installare il quale o si va con i build-tool C della microsoft (un paio di giga) o con anaconda+conda (tre giga) e così via ... raccapricciante!!!

Insomma, mi sa che andando "a naso" nel breve mi ritrovo una di quelle schermate blu (le fa ancora, win?) che a suo tempo mi hanno fatto fuggire via, fermo restando che "vorrei" utilizzare l'open-source a me familiare in windows potreste darmi qualche dritta su cosa andare a vedere per fare una configurazione adatta allo scopo e non troppo "esosa/complessa/instabile"?.

Grazie dell'attenzione :)

12
Base / [Risolto] windows : verificare integrità file
« il: Agosto 10, 2021, 10:45 »
Mi trovo nella condizione di dover passare a dei colleghi non esattamente competenti l'onere di preparare copia di alcuni dati estremamente importanti da inviarsi poi all'esterno, una volta passate "le consegne" io non potrò mai più dare una mano.
I dati sono binari e pesano alcune centinaia di megabyte, vengono creati da un programma che ho creato io  diversi decenni fa che opera in ambiente windows XP, i detti colleghi non sono all'altezza di navigare in un file-system.

Per "facilitare" le operazioni degli "eredi" sto pensando di creare una applicazione tkinter in ambiente python 3.4.1 32 bit che provveda alla copia dei files, la cui origine pre-imposterò e mi sorge il dubbio di "come" verificare la correttezza dei file copiati, in ambiente linux che di solito utilizzo verificherei la checksum ma in windows ... non ho la più pallida idea di come procedere.

Ovvio che "cercherò" ma gradirei qualche indicazione/dritta su come procedere.

Grazie dell'attenzione :)

13
Tkinter / binding e widget state : una perplessità
« il: Maggio 26, 2021, 10:18 »
I miei saluti.

Per mero esercizio sto sviluppando (in doppia versione tkinter/wxPython) una piccola applicazione mirata ad effettuare alcune "operazioni" con i pdf.

Ho definito una classe per una particolare finestra destinata a salvare/manipolare del testo estratto da un pdf, direttamente o tramite ocr, che può sussistere in due stati differenti "text" o "csv" il cui valore viene fornito quale parametro ed è memorizzato in una variabile di istanza, il secondo "stato" sussiste in una nuova istanza della classe effettuata da una finestra di stessa classe tramite un button che in condizione "csv" è disabilitato.

Il pulsante è impostato per agire tramite clic del pulsante sinistro del mouse ovvero pressione del return su tastiera o tastierino numerico nella sottostante modalità :
        # bindings
        self.bt_edit.bind('<Button-1>', self._on_edit)
        self.bt_edit.bind('<Return>', self._on_edit)
        self.bt_edit.bind('<KP_Enter>', self._on_edit)
...
    def _on_edit(self, evt):
        if self.csv_win == None or not self.csv_win.winfo_exists():
            self.csv_win = TextUtility(self, type='csv')
        self.edit = True
        self._def_max_len()
        self._evaluate_context()

Mi sono accorto che malgrado il pulsante sia disabilitato gli eventi definiti hanno comunque luogo ed una finestra in stato "csv" crea una nuova finestra nello stesso stato facendo clic sul widget disabilitato.
Pur avendo trovato facilmente varie soluzioni, l'evento anomalo non avviene se:
1 - definisco "command=self._on_edit" alla creazione del pulsante;
2 - verificando preventivamente lo stato nel callback;
3 - effettuando lo unbinding nel caso lo stato sia "csv"
        #if self.type == 'csv':
        #    self.bt_edit.unbind('<Button-1>')
        #    self.bt_edit.unbind('<Return>')
        #    self.bt_edit.unbind('<KP_Enter>')


quanto sopra mi ha sbalordito, dato che ritenevo un pulsante in condizione "disabled" non reattivo, e sto cercando di capire il "perché" accada da un paio di giorni ma non mi è riuscito di venirne a capo ... qualcuno saprebbe darmi una indicazione su dove andare a guardare?

Grazie dell'attenzione.

14
Base / Curses : è possibile sub-classare una window?
« il: Febbraio 12, 2021, 11:53 »
I miei saluti

Intrigato da un precedente post sulle carte da gioco ho cominciato ad interessarmi alla libreria curses.

Ho realizzato un semplice programma di test fornendo una pseudo interfaccia grafica ai processi di questo post, il programma funziona come progettato ma, tra le varie problematiche viste, non mi è riuscito di "trovare" un oggetto curses.Window da sub-classare, dovendo ripiegare a far essere le finestre dati di classi per la gestione, tipicamente :
class MenuBar:
    def __init__(self, win):
        self.win = win
        self.len = self.win.getmaxyx()[1]
...


Ora, è possibile che effettivamente non esistano oggetti curses.windows da poter sub-classare, così come è possibile che vi siano ed io sia stato inefficace nelle mie ricerche ... qualcuno ha conoscenze in merito per potermi illuminare?

Grazie dell'attenzione, ciao :)

15
Base / Controllo istanze di una applicazione, qualche consiglio?
« il: Novembre 06, 2020, 16:27 »
I miei saluti

Sto raccogliendo "frammenti" di notizie per cercare di progettare una applicazione a scopo di esercizio.
Tale applicazione vorrebbe essere una chat point-to-point in lan locale. Particolare, ovvio, di tale applicazione è che deve avere un socket in ascolto su una determinata porta, che provveda ad accettare eventuali richieste di connessione e provveda ad instanziare un pool di oggetti dedicati alla comunicazione e gestione del relativo protocollo
 ... tale socket di ascolto lo prevedo attivabile/disattivabile dalla interfaccia utente e deve essere unico a livello di applicazione. Tale caratteristica di unicità "credo" di aversa risolta dopo un po' di ricerche (e con molte, zoppicanti, consultazioni del data-model di python) tramite una implementazione del pattern singleton, di seguito esposta in generico esempio, per eventuali interessati e magari per eventuali critiche, se opportune
>>> class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

>>> class Foo(metaclass=Singleton):
def __init__(self):
self._x = 0
def increment(self):
self._x +=1
def value(self):
return self._x


>>> foo_one = Foo()
>>> foo_two = Foo()
>>> print('foo_one ha valore %d, foo_two ha valore %d' % (foo_one.value(), foo_two.value()))
foo_one ha valore 0, foo_two ha valore 0
>>> foo_two.increment()
>>> print('foo_one ha valore %d, foo_two ha valore %d' % (foo_one.value(), foo_two.value()))
foo_one ha valore 1, foo_two ha valore 1
>>> foo_one == foo_two
True
>>>

Credo che un modello del genere dovrebbe andare bene circa l'unicità per l'oggetto di ascolto

... ma, qui mi pongo un altro problema, motivo di questo post, l'unicità del fantomatico oggetto è motivata, essenzialmente, dal lasciare libera la porta di comunicazione che prevedo di utilizzare a tal fine, la verifica che la porta sia occupata o meno è inibita dalla volontà di lasciare in mano all'utente se essere on-line o meno. Potrebbe anche tenere aperta l'applicazione e non voler essere in ascolto ma comunque vedere chi ascolta e comunicare (è così che lo voglio implementare).

Mi sorge, di conseguenza, la necessitò di verificare se è già aperta una istanza della applicazione, essendo possibilissimo lanciare diverse istanze contemporaneamente che non si "conoscono" tra loro ma che potrebbero, eventualmente, entrare in conflitto tentando di accedere alla stessa porta.
Allo stato, non avendo trovato niente di meglio, sarei indirizzato a controllare la faccenda tramite un file di lock scritto da qualche parte, cosa non difficile ma, data la più volte constatata presenza in python di "strumenti" da me non conosciuti, mi chiedo se è previsto qualcosa in merito, che magari non mi è riuscito di trovare, o delle metodologie "canoniche" per il controllo di istanze multiple per una applicazione python.

Grazie per l'attenzione.

Ciao :)

Pagine: [1] 2 3