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.


Post - nuzzopippo

Pagine: [1] 2 3 ... 51
1
Ciao @GlennHK, Ti ringrazio del Tuo, gradito, parere, ne terrò gran conto

In merito allo spiegare l'uso dei virtualenv, hai piena ragione, non è che si sta li a spiegarlo ma la installazione di genropy è un po' particolare rispetto al solito, il framework non esiste in Pypi e git è tra i pre-requisiti richiesti per la sua installazione, che viene effettuata clonando il repository di genropy.
Diciamo che tale particolare mi rende "insicuro" circa la mia capacità di circoscrivere il tutto all'interno di un venv e che è stata uno dei motivi che mi hanno spinto a chiedere pareri prima ancora di tentare un approccio a tale framework.

Ovviamente, la mia scarsa conoscenza dello approccio a tecniche "web" è un altro importante motivo, tale circostanza mi impedisce di discernere tra i vari framework e/o librerie disponibili per selezionare ciò che potrebbe essere idoneo alle mie comunque limitate esigenze/capacità.

Mi incuriosisce la Tua negatività circa quello che nella docs viene indicato proprio come il primo punto di forza del pacchetto
Citazione
Single Page Applications, ovvero applicativi web complessi comparabili nell’esperienza d’uso a quelli desktop
Meglio che non mi esprimo su questa frase...

Certamente le riserve che si intravedono sarebbero istruttive ma, magari, potrebbero essere impegnative da esporsi, se fosse possibile una sintesi rapida (e non a Te impegnativa) su cui meditare la leggerei volentieri.

In ogni caso, grazie ancora. :)

2
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 :)

3
Benvenuto e regolamento / Re:print("ciao :-)")
« il: Aprile 22, 2023, 17:26 »
Ciao @andi75, ben venuto

Vedo dalla Tua presentazione e dall'altro Tuo post, che saresTi un acquisto decisamente istruttivo per il Forum, o almeno per me che certamente avrei molte cosette da scoprire.
Purtroppo, personalmente, non sono all'altezza di rispondere sulla latenza degli imports in python, problema di cui non mi son mai curato avendo un target prevalentemente desktop, tra gli altri utenti  del Forum ci sono certo esperienze all'altezza degli argomenti che Tu poni e che, purtroppo, si vedono sempre più di rado ... magari problematiche meno spicciole delle solite potrebbero stimolarli a tornare un po'.

In ogni caso, ancora ben venuto :)

4
Base / Re:codice per aprire un file libreoffice
« il: Aprile 19, 2023, 07:29 »
Ciao @giovanardo

I due avvisi su "Icon Theme" sono questione di configurazione della Tua installazione di libreoffice nel sistema (Linux?), in ogni caso dovresti avere un altro errore per file non trovato dato lo spazio presente nel nome del file, dovresti contenere il path-name tra apici stringa, qualcosa tipo
os.system('libreoffice %s' % '"/home/giova/Principale/Documenti/Celle Relative.ods"')


Detto questo, un paio di anni fa posi un quesito del genere, ne scaturì una discussione per me molto istruttiva, Ti invito a leggerla.

Ciao

5
Ciao @Eleonora, ben venuta

Sono nuova sia a python che al forum, quindi mi scuso in anticipo se sto sbagliando qualcosa.
beh, dataset e fogli elettronici non sono propriamente database, forse questa discussione starebbe stata meglio nella sezione "Calcolo scientifico", peccato veniale, comunque.

Ho letto ieri questo Tuo post ma non ho risposto, sperando che qualcuno degli utenti che utilizzano Pandas e networkx lo facesse, purtroppo così pare non sia, probabilmente per la eccessiva genericità del Tuo post.
Personalmente non mi interesso di calcolo scientifico (per miei limiti culturali) e non conosco le due librerie citate ma data la Tua indicazione di essere "nuova" anche su python mi fa ipotizzare che, forse, qualche aiutino potrei anche riuscire a darlo, sempre ammesso Tu ritenga possa esserTi utile.

Ammesso Tu ritenga Ti possa servire, una prima domanda è : sei riuscita ad ottenere un dataframe da un foglio elettronico? Questa parte dovrebbe essere piuttosto facile con pandas.read_excel.
In caso di risposta positiva, potresti fornire un esempio dei dati (offuscati quelli sensibili, ovviamente) da trattare e spiegare cosa Tu intenda con "Corrispondenze", ovvero, se non Ti sia riuscito di ottenere il dataframe, un esempio dei dati (sempre offuscati) da trattare (oltre cosa sia "Corrispondenza") in maniera da caricarli in un foglio elettronico e partire dall'inizio?
Ciò per poter provare a farmi le idee e, se mi riesce, iniziare darTi una mano, il resto si vedrà.

Per le "Lezioni private di python" : non credo che nessuno si cimenterebbe mai e che Ti servirebbero a qualcosa, per imparare a programmare ci vuole tempo (molto), impegno (moltissimo), tante tante letture di docs, tecniche e codice altrui, oltre che provarci infinite volte.

6
wxPython / Re:Frame chiamato più volte come Subframe().Show()
« il: Aprile 18, 2023, 16:13 »
Che io sappia, anche nell'ambito del framework wxPython una classe definita può essere instanziata più volte, salvo casi molto particolari, problemi potrebbero sorgere sul "come" la si instanzia, e su questo è difficile indovinare : potresti esemplificare con un breve codice ciò che fai?

7
Esercizi / Re:Creazione di una Classe
« il: Aprile 16, 2023, 07:41 »
Ciao @Daniontheweb, ben venuto

... mi sa che hai un bel po' da leggere per acquisire l'argomento, in quelle poche righe di codice hai concentrato un bel po' di problematiche, tanto di tipo concettuale quanto di implementazione.

In primo luogo, una classe definisce struttura dati e metodi di un oggetto, non può essere instanziata dal suo interno, come apparentemente hai fatto Tu (N.B. usa il comando "pythoncode" dell'editor dei post per formattare il codice), tale operazione deve essere fatta "dall'esterno"
in secondo luogo, una volta instanziata (dall'esterno) puoi accedere alle variabili di istanza, o di classe, "se" dette variabili sono state definite : i Tuoi "print" riferiscono ad elementi tipo "umano1.nome", etc, non definiti nella classe che, invece, definisce "self.__nome", "nome" e "__nome" sono duce "cose" diverse.
... poi c'é un altro "particolare", utilizzando il doppio underscore ("__") nella definizione di una variabile stai, di fatto, definendo una "variabile privata" della classe stessa, essa non sarà, di norma, direttamente accessibile, Te lo mostro
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
class Umano:
    def __init__(self, nome, eta, altezza):
        self.__nome = nome
        self.__eta = eta
        self.__altezza = altezza

       
umano1 = Umano('Angelo', 26, 1.86)
print(umano1.__nome)
Traceback (most recent call last):
  File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
    exec(code, self.locals)
  File "<pyshell#7>", line 1, in <module>
AttributeError: 'Umano' object has no attribute '__nome'

Le motivazioni di tale "inconoscibilità" per __nome sono riportate nel link che Ti ho posto sulle variabili private.
Per tanto, potrei accedere ad una variabile di istanza se essa è posta in forma ordinaria
class Umano:
    def __init__(self, nome, eta, altezza):
        self.nome = nome
        self.eta = eta
        self.altezza = altezza

       
umano1 = Umano('Angelo', 26, 1.86)
print(umano1.nome)
Angelo

ovvero definendo una proprietà della classe che agisca coerentemente
class Umano:
    def __init__(self, nome, eta, altezza):
        self.__nome = nome
        self.__eta = eta
        self.__altezza = altezza
    @property
    def nome(self):
        return self.__nome

   
umano1 = Umano('Angelo', 26, 1.86)
print(umano1.nome)
Angelo
print(umano1._Umano__nome)
Angelo


... le classi sono un pochino complesse, i capitoli relativi sul totorial in link, seppur numerosi non esauriscono l'argomento ma la loro lettura è un buon inizio.

Ciao :)

[Edit] : integrato l'ultimo esempio con l'utilizzo del "name mangling" (vedere il link) che non mi era venuto in mente di indicare in prima fase di stesura del post.

8
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

9
Tkinter / Re:Approccio corretto per una GUI.
« il: Marzo 28, 2023, 09:38 »
Oh ... beh!
... Per dire, il semplice tasto Exit attribuito al modulo Button_Gui, perché funzioni lo devo istanziare al file principale. Se invece a un tasto è legato anche una Entry/Combobox e relativa var, passatemi i termini, sta palla la devo far rimbalzare per poi richiamarla con  ''callable'' al tasto ...
Mi sembra di capire, correggimi se sbaglio, che Tu stacchi la logica di disegno della GUI dalla logica di funzionamento della stessa.

Personalmente, con il tempo, ho adottato criteri di approccio "diversi" dai Tuoi (oltre tutto variabili in base alla "consistenza" di ciò che mi propongo di fare) :
cerco, si, di staccare la logica dati dalla logica di visualizzazione, anche se per quanto ci abbia provato non mi è mai riuscito di implementare un pattern MVC degno di tale definizione, principalmente perché non mi riesce di staccare la parte "controller" dalla logica di gestione delle interfacce grafiche ... se guardi nello storico dei post troverai interventi su tali argomenti veramente interessanti fatti da utenti esperti, purtroppo un po' remoti nel tempo.
Ma concentro la logica di funzionamento di una finestra nella sua classe di definizione, tutte le funzionalità operative della finestra sono metodi della finestra stessa, di norma definisco i widget che ho necessità di manipolare quali variabili di istanza della classe "finestra" in cui vengono definiti, ciò mi evita le complicazioni tipo quella da Te indicata e mi permette di utilizzare le primitive dei singoli widget per il loro aggiornamento ... insomma, cerco di costruire delle classi-finestra funzionalmente auto-sufficienti.
Certo, se una finestra è "troppo" complessa non esito a definirmi delle classi di composizione di parti della finestra stessa, solitamente costituiti da un frame contenitore ed i vari widget necessari, dotando tanto dette classi quanto le finestre-madri di metodi per lo scambio dati, magari, se è il caso, prevedo dei metodi "speciali" di funzionamento per tali "oggetti".
Per altro, pur dipendendo fortemente dalle finalità, sovente anche per le parti di gestione dati uso implementare delle classi i cui metodi  provvedono alla manipolazione dati e comunicazione ad altri oggetti dei risultati (su quest'ultimo sto fortemente variando l'approccio proprio ora)

ParlarTi di MVC mi ha fatto venire in mente i Design pattern, anche se devo ammettere che sono per me fonte di frustrazione (per miei limiti culturali, temo) sono argomenti interessanti (ogni tanto cerco di affrontarne uno) e che, magari, potrebbero darti ottime dritte, giusto di recente sono stato aiutato in questo forum sul pattern "singleton" con il quale sto sperimentando alcune diversificazioni di approccio nelle comunicazioni tra oggetti, rispetto alle mie abituali implementazioni.

N.B. : intanto che scrivevo quanto sopra è stato inserito il post di @GlennHK (che ringrazio ancore delle dritte sul singleton) lascio invariato quanto sopra circa le mie "abitudini", anche se magari criticabili ;)

Ciao

10
Tkinter / Re:Approccio corretto per una GUI.
« il: Marzo 27, 2023, 08:15 »
Difficile definire un "Approccio corretto" ad un argomento complesso come le GUI, principalmente per uno come me tutt'ora in fase evolutiva di un approccio empirico derivato sbattendoci la testa.
Certo gli utenti esperti sapranno, bontà loro, darTi indicazioni sulle best practice relative all'argomento.

... da parte mia, ammesso abbia capito bene la Tua esposizione, vedo male il sub-classamento dei singoli widget come da Te prospettato, a mio parere creeresti una miriade di moduli espandendo di molto la quantità di codice necessario e complicando lo scambio dati tra i componenti di una singola finestra.
Personalmente, ritengo sia più opportuno definire le finestre ed i controlli in esse contenuti nella forma più compatta possibile ed utilizzando di norma i metodi forniti dai singoli widget nella forma più diretta che si riesce, lasciando il sub-classamento ai casi in cui si vogliano definire delle proprietà/metodi "particolari" aggiuntive e/o non previste ... giusto a mero esempio, funzionalità e proprietà del Tuo codice possono essere impostate così:
#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import tkinter as tk

class AppWin(tk.Tk):

    def __init__(self) -> None:
        super().__init__()
        self.title('Esempio Alternativo')
        self.resizable(True, False)
        self._populate()
        self.update()
        self.minsize(self.winfo_reqwidth(), self.winfo_reqheight())

    def _populate(self) -> None:
        self.entry_word = tk.Entry(self, relief='flat')
        self.entry_word.grid(row=0, column=0, padx=5, pady=5,sticky='ew')
        btn = tk.Button(self, text='Paste Word', relief='flat',
                        bg='#737373', command=self.clipb_paste)
        btn.grid(row=0, column=1, padx=5, pady=5,sticky='ew')
        self.grid_columnconfigure(0, weight=1)

    def clipb_paste(self) -> None:
        txt = self.clipboard_get()
        self.entry_word.delete(0, tk.END)
        self.entry_word.insert(tk.END, txt)


if __name__ == '__main__':
    app = AppWin()
    app.mainloop()

Uniche differenze con il Tuo codice sono che ho utilizzato il gestore di geometria "grid" invece del "place", ritenendo più "pratico" sfruttarne le proprietà "elastiche" per il dimensionamento dei componenti invece che definire puntualmente le dimensioni manualmente.

Sono dell'opinione che un codice quanto più chiaro e compatto si riesca ad implementare (con particolare accento sulla chiarezza) aiuti nella manutenzione dello stesso, certo finestre complesse possono produrre codifiche da centinaia, se non migliaia, di righe ma se ne viene a capo con una codifica "ordinata e metodica" ... comunque, torno a ripetere, si tratta di opinione personale, se ne può parlare.

Ciao

11
Benvenuto e regolamento / Re:Salve
« il: Marzo 27, 2023, 07:36 »
Ciao @MoMy, ben venuto

Le "piccole utility bash"  ci accomunano, le ho usate parecchio in ambito lavorativo ed a mia volta sono un user linux, praticamente "puro", ho una versione di windows ma se la lancio 1-2 volte all'anno è già molto.

Ci leggiamo

12
Benvenuto e regolamento / Re:Ciao a tutti
« il: Marzo 25, 2023, 08:31 »
Ciao @Vale88 ben venuto

Non preoccuparti per le domande, qui si è tutti per imparare l'uno dall'altro e vedrai che con un po' di pazienza ed olio di gomito si arriva presto a crearsi piccole utilità

:)

13
Database / Re:MODIFICARE FOGLIO DI CALCOLO CON PYTHON
« il: Marzo 21, 2023, 18:43 »
Ritengo la Tua una ottima decisione, è sempre e comunque bene avere una conoscenza generale della base prima di affrontare veri e propri "progetti", si risparmia tempo in seguito.

Se e quando riterrai di farlo, resta, comunque, valida la mia offerta di affrontare insieme uno scenario di manipolazione di files di LibreOffice Calc, per le motivazioni già espresse.

Ciao :)

14
Database / Re:MODIFICARE FOGLIO DI CALCOLO CON PYTHON
« il: Marzo 13, 2023, 09:51 »
Cia @David

... Qualcuno conosce un modulo per fare una cosa del genere? Poi posso studiarmelo in autonomia, vorrei solo sapere che si può fare

Ovviamente, per fare si può fare, non è detto sia facile però, parlando di files "*.ods"

Riguardo alle Librerie da Te citate
So che esistono dei moduli per importare fogli ods in dataset pandas  (pandas-ods-reader) ma non mi risulta nulla per il processo inverso.

Riguardo "openpyxl", è una libreria ben documentata e di non difficile uso, se cerchi nello storico troverai diversi post affrontati problematiche con tale modulo. Esso, però, è centrato sui files Excel, potresti sfruttare il fatto che libreoffice legge e produce abbastanza bene tal genere di files per utilizzare tale modulo per le Tue necessità operando su una copia del Tuo foglio esportata in tale formato.

Volendo proprio e soltanto trattare files "*.ods" con odfpython credo si possa fare ma non ho esperienza diretta di tale specifica faccenda, personalmente ho utilizzato tale libreria anni fa per compilare dei template "*.odt" per un problema lavorativo, ho scritto un appunto in merito, ma so per certo che la documentazione della libreria è pessima (leggi l'appunto x motivazioni) e difficoltosa da usare, forse un aiuto potrebbe venire dalla API, nel caso Tu sia risoluto ad affrontare l'argomento Ti suggerirei di scaricare il documento e leggere il titolo "7.2 Creating the table as a spreadsheet" per cominciare, non sarà una passeggiata ma dovresti riuscirci.

Per altro, esiste il modulo "odslib" che non ho mai utilizzato, forse potrebbe essere utile.

Se intendi affrontare i file *.ods e ne hai voglia, fai sapere, da linuxaro vivo con dispetto la carenza di documentazione del mondo open-source mentre per il mondo closed ve ne è, quindi, si potrebbe anche vedere assieme uno scenario ben definito da affrontare, disposto a misurarmi ;)

Ciao

[Edit] dimenticavo PyUno, a quanto ne so è tutt'ora valido ma a quanto ci ho capito è più che altro puntato a script interni all'ambiente OpenOffice/LibreOffice, richiedendo un "server" installato per il suo funzionamento, da quanto capito da varie discussione sul forum di Ubuntu neanche PyUno è amichevole, difficile da affrontare.

15
Progetti e script / Re:Dilemma su script basilare
« il: Marzo 10, 2023, 19:23 »
Esistono varie criticità, nel Tuo script.

La principale è che inserendo range(x,y) in una lista avrai una lista di un solo elemento che sarà un oggetto, Te lo mostro:
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.
H_F1 = [range(8,20)]
H_F1
[range(8, 20)]
type(H_F1[0])
<class 'range'>
len(H_F1)
1

dovresti iterare su range ed aggiungere gli oggetti emessi alla lista oppure usare una list comprehensin, esempi :
h_f1 = []  #primo caso
for h in range(8, 20):
    h_f1.append(h)

   
h_f1
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
h_f1_bis = [x for x in range(8, 20)]  # con list comprehension
h_f1_bis
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

ops ... dovevo mettere "21" forse? ;)

Il secondo fattore critico è nella istruzione :
H = input("Inserire ora del giorno")

la funzione builtin input restituisce una stringa, "H" deve essere un intero per corrispondere ad una ora, se non sari come farlo, leggi la funzione "int()" nella stessa pagina di docs dove c'è "input()"

Ciao

Pagine: [1] 2 3 ... 51