[Risolto][Python] Immagine scomparsa ... che fare?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

[Risolto][Python] Immagine scomparsa ... che fare?

Messaggio da raffaele63 »

Salve a tutti,
prima di esporre il mio problema, devo assolutamente ringraziare rai che mi ha dato una gran mano e per questo propongo quanto elaborato al fine di dare possibilità anche ad altri di utilizzare il codice Python di seguito e che si riferisce alla seguente discussione

Codice: Seleziona tutto

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-

    # qui creiamo le funzioni che poi useremo
    # così il codice è più ordinato e la manutenzione è più semplice


    def incolonna(lista):

        """Incolonna ben allineati gli elementi di lunghezza diversa di una tabella

    Prende come argomento una lista i cui elementi sono liste di stringhe

    La lista quindi rappresenta la tabella e ciascuna delle sue liste
    rappresenta un rigo della tabella
    NB: tutte le righe devono avere uguale numero di elementi, anche se vuoti.

    Restituisce `lista' con tutte le stringhe giustificate a sinistra
    aggiungendo spazi per uniformarle alla larghezza massima della propria colonna
        """
        # itera sulla dimensione delle liste (il numero di colonne)
        numCol = len(lista[0])
        appoggio = []
        for col in range(numCol):
            appoggio.append([])
            # itera su tutte le liste (il numero di righe)
            for riga in range(len(lista)):
                # crea una lista temporanea contenente una lista per ogni colonna
                appoggio[col].append(lista[riga][col])

        larghezze = []
        for y in range(numCol):
            max = 0
            for a in appoggio[y]: # itera su ogni elemento di ogni colonna
                if len(a) > max:
                    max = len(a)
            # crea una lista con le larghezze max di ogni colonna
            larghezze.append(max)

        # padding di ogni stringa alla larghezza max della propria colonna
        for riga in lista:
            for col in range(numCol):
                riga[col] = riga[col].ljust(larghezze[col])
        return lista



    def make_pdf_file(input_text, output_filename):

        """Crea un semplice pdf; il n° di pagine dipende dalla lunghezza del testo

    La pagina default è A4; le misure della pagina sono espresse in punti quindi: pagesize = (597.6, 842.4) dato che A4 in pollici è 8.3" * 11.7"
    Le coordinate di una pagina A4 con margini da 1", espresse in punti sono

    842.4 ________________________
         |                        |
    770.4|   __________________   |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
         |  |                  |  |
     72.0|  |__________________|  |
         |                        |
        0|________________________|
         0  72.0          525.6   597.6

    NB: dato che (0,0) sono le coordinate dell'angolo in basso a sinistra
    per mettere i contenuti dall'alto al basso (cioè come sempre)
    si deve progressivamente diminuire la coordinata verticale
        """
        from reportlab.pdfgen import canvas

        point = 1 # un punto, in altezza è 1/72 di pollice
        inch = 72
        fontSize = 12 * point # in A4 ci entrano 59 righe se fontSize=12
        font = "Courier" # altri font: Helvetica, etc.

        c = canvas.Canvas(output_filename)
        c.setFont(font, fontSize)
        margineSn = 1 * inch
        primoRigo = 10.7 * inch # posizione verticale del primo rigo
        rigo = primoRigo
        for line in input_text.split( '\n' ):
            if rigo <= inch: # siamo al margine inferiore
                c.showPage() # crea una nuova pagina
                c.setFont(font, fontSize)
                rigo = primoRigo
            c.drawString( margineSn, rigo, line )
            rigo -= fontSize # scendiamo di un rigo
        c.save()



    def toString(sequenza):
        "Prende una sequenza di liste di stringhe e restituisce una stringa"
        stringa = ''
        for lista in sequenza:
            stringa += '  '.join(lista)+'\n'
        return stringa


    # fine delle funzioni ------------------------------


    # metterai qui tutto il codice con cui estrai i dati dal database
    # e ammettiamo che i dati siano assegnati alla variabile rows con:
    #    rows = cursor.fetchall()


    # `rows' era una tupla di tuple: le tuple non sono modificabili
    # perciò la trasformiamo in una lista di liste in questo modo:
    tabella = map(list, rows)

    # così `incolonniamo' le stringhe contenute nelle liste di `tabella'
    tabella = incolonna(tabella)



    # in realtà `tabella' è pur sempre una lista di liste di stringhe
    # quindi qualsiasi cosa dobbiamo farne bisogna convertirla in stringa
    # e per quello usiamo la funzione toString()

    # TODO vedi tu cosa fare con le seguenti tre possibilità

    # prima possibilità di uso
    # per es. per stamparla a video:
    print(toString(tabella))

    # seconda possibilità di uso
    # per salvarla su file di testo:
    with open('/percorso/fileTXT', 'w') as f:
        f.write(toString(tabella))

    # terza possibilità di uso
    # per creare un pdf dalla tabellaprima
    make_pdf_file(toString(tabella), '/percorso/filePDF')

ho un problema del quale non riesco venirne a capo:
Uso Python 2.7 con Tkinter
ho creato uno script per contenere un logo, che ora vi posto:

Codice: Seleziona tutto

from Tkinter import *
  
root = Tk()
root.geometry('130x130+10+10')

frame =Frame(root,bg="#000fff000", relief ='sunken', border = 3)
frame.grid(row=8, column=8, sticky=NW)

# creo un oggetto PhotoImage caricandola da disco  
ogg_foto = PhotoImage(file="/home/lucy/fish_rapala.gif")

# creo un canvas delle stesse dimensioni dell'immagine  
cv = Canvas(frame,width=120, height=120, bg='white')  
cv.grid(sticky =NSEW)  
  
# creo un'immagine nel canvas passandogli l'oggetto PhotoImage di prima  
cv.create_image(60, 70, image=ogg_foto)  

# creo una scritta, la posiziono sfalsata di 15 px  
cv.create_text(15, 15, text="APSD Sunese", fill="green", anchor='nw')

#  
root.mainloop()
l'ho provato e funziona l'immagine è centrata, insomma tutto a posto.
Come avrete osservato vi è una finestra con al suo interno una frame e a sua volta il canvas che contiene l'immagine e la scritta.
Ho applicato il medesimo concetto e l'ho inserito nel mio programma che è alla fase finale (forse).
Bene non funziona, cioè appare la finestra come sopra descritto ma l'immagine è sparita, succede sia se inserisco il canvas nella finestra principale sia se uso una nuova finestra indipendente che si apre assieme alla principale.
Siccome mi è stato consigliato di non risparmiare sulla descrizione del codice vi posto come è fatto:

Codice: Seleziona tutto

class AppProva2:
    def __init__(self, Gerarca=0):#<---------------------------------inizio, crea il quadro generale
        
        self.miogerarca= Gerarca#

        self.Finestra_logo()

        self.FinPrinc = Tk()#<-----------------------------------------------------quadro principale
        
        finmenu = Menu (self.FinPrinc)
        finmen1 = Menu (finmenu, tearoff = 0)
        finmenu.add_cascade (label = 'FILE', menu = finmen1)
        finmen1.add_command (label ='Esci', command = self.FinPrinc.destroy)

        prova = Menu (finmenu, tearoff = 0)
        finmenu.add_cascade (label = 'MENU', menu = prova)

        prova1 = Menu (prova, tearoff = 0)
        prova.add_cascade (label = 'Apri', menu = prova1)
        prova1.add_command (label = 'Quadro Generale', command = self.QuadroGenerale)
        prova1.add_command (label = 'Società e squadre', command = self.classe_societa)
        prova1.add_command (label = 'Punteggi squadra',command = self.classe_punteggio)
        prova1.add_command (label = 'Postazione concorrenti',command = self.classe_settori)

        prova2 = Menu (prova, tearoff = 0)
        prova.add_cascade (label = '€-$-£', menu = prova2)
        prova2.add_command (label = 'Conteggio generale', command = self.bilanci)
        prova2.add_command (label = 'Chiude Conteggio', command = self.closebil)

        self.FinPrinc.title ('Finestra Principale')
        self.FinPrinc.config (padx = 20, pady = 10, bg = '#d7feee')
        self.FinPrinc.config (menu = finmenu)

        self.CentraFinPrinc()

    def CentraFinPrinc(self):
        w = self.FinPrinc.winfo_screenwidth()
        h = self.FinPrinc.winfo_screenheight()
        rw = self.FinPrinc.winfo_width()
        rh = self.FinPrinc.winfo_height()
        self.FinPrinc.geometry('725x500+170+100'.format(rw, rh, (w-rw)//2, (h-rh)//2))

    def Finestra_logo(self):
        
        self.FinLogo = Tk()

        self.FinLogo.geometry('130x130+10+10')

        frame =Frame(self.FinLogo,bg="#000fff000", relief ='sunken', border = 3)
        frame.grid(row=8, column=8, sticky=NW)

        # creo un oggetto PhotoImage caricandola da disco  
        ogg_foto = PhotoImage(file="/home/lucy/fish_rapala.gif")

        # creo un canvas delle stesse dimensioni dell'immagine  
        cv = Canvas(frame,width=120, height=120, bg='white')  
        cv.grid(sticky =NSEW)
          
        # creo un'immagine nel canvas passandogli l'oggetto PhotoImage di prima  
        cv.create_image(60, 70, image=ogg_foto)  
        # creo una scritta, la posiziono sfalsata di 15 px  
        cv.create_text(15, 15, text="APSD Sunese", fill="green", anchor='nw') [........]

app = AppProva2()
app.FinPrinc.mainloop()



sicuramente si tratterà di una mia sbadataggine, ma non ci metto gli occhi addosso.
Grazie a tutti.
Ultima modifica di raffaele63 il domenica 19 giugno 2016, 17:53, modificato 2 volte in totale.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Python] Immagine scomparsa ... che fare?

Messaggio da crap0101 »

non ho provato il codice (che andrebbe indentato correttamente, forse è solo un problema di tag qui sul forum, magari modifica la formattazione), btw il problema penso sia nella funzione Finestra_logo in cui utilizzi la variabile *locale* `ogg_foto` per creare l'oggetto PhotoImage, oggetto che verrà molto probabilmente _distrutto_ all'uscita della funzione.
Tra l'altro con i PhotoImage è buona norma salvare un riferimento come attributo dell'oggetto in cui lo utilizzi, proprio per evitare che venga perso per strada.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Immagine scomparsa ... che fare?

Messaggio da Claudio_F »

raffaele63 ha scritto:sicuramente si tratterà di una mia sbadataggine
Ni, nel senso che si tratta effettivamente di un comportamento "anomalo" di tk effbot.org/tkinterbook/photoimage.htm (nota a fondo pagina e soluzione monkey patch).

Nel caso in questione, essendo felicemente strutturato come classe, è sufficiente assegnare l'istanza di PhotoImage a una variabile di istanza:

Codice: Seleziona tutto

self.ogg_foto = PhotoImage(file="/home/lucy/fish_rapala.gif")
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto][Python] Immagine scomparsa ... che fare?

Messaggio da raffaele63 »

Salve e grazie ad entrambi,
effettivamente si tratta proprio della mancanza di assegnazione (un semplice self.) che non ho messo perché se inserivo un rettangolo, una linea o una scritta nel canvas (senza alcun self.), non sorgevano problemi e quindi non ho ragionato sotto l'aspetto di assegnazione come indicato da Claudio_F (e pensare che avevo anche letto, ma superficialmente, quanto indicato nel link).

Per quanto riguarda la modalità d inserimento del codice nei post, ho fatto esattamente allo stesso modo nei tre inserimenti: due sono riusciti il terzo no (facendo l'anteprima ho notato che qualcosa non andava ed ho provato più volte a sistemare, ma non ci sono riuscito).

Grazie ancora e buon week-end
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Risolto][Python] Immagine scomparsa ... che fare?

Messaggio da Claudio_F »

raffaele63 ha scritto:Per quanto riguarda la modalità d inserimento del codice nei post, ho fatto esattamente allo stesso modo nei tre inserimenti: due sono riusciti il terzo no
Al tag di chiusura [/code] del terzo blocco manca il backslash.
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto][Python] Immagine scomparsa ... che fare?

Messaggio da raffaele63 »

Deve essere una mia particolarità, :D mi sfuggono le piccole cose ( /, self., ecc.)
Meno male che qualcuno più attento di me mi da una mano! Grazie.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti