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')
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()
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.


