Appunti Post-it Python 2.x

Sommario
Avviare l'interprete:

- Aprire finestra DOS e  scrivere python
- oppure cliccare su icona python
- oppure cliccare su icona ide (idle / pywin)


Uscire da python:

CTRL+Z  e invio  oppure  exit() e invio


Avviare un programma dall'interprete:


execfile("nomefile")

- oppure cliccando su un file.py si avvia automaticamente interprete + programma, in questo caso quando il programma termina (o va in errore) si chiude automaticamente anche la console dell'interprete.


Operazioni di sistema sui files (moduli os e shutil)

Mostra directory corrente programma:

import os
os.getcwd()



Lista files directory corrente:

os.listdir("")

Viene prodotta una lista con i nomi di tutti i files e directory.
Listdir accetta una stringa con il percorso a cui riferirsi, stringa vuota=dir corrente.


Spostarsi in una directory specifica:

os.chdir("percorso")

Percorso accetta path relativi alla posizione attuale, i due punti portano alla dir superiore: os.chdir("..")


Cambiare nome a un file:

os.rename("nomevecchio","nomenuovo")


Cancellare un file:

os.remove("nomefile")


Verifica se un file esiste:

os.path.exists("nomefile")

Ritorna True se il file esiste, altrimenti False.


Verifica se un nome e' un file o una directory:

os.path.isfile("nome")
os.path.isdir("nome")


Ritornano True o False.


Crea / rimuove una directory:

os.mkdir("nomedir")
os.rmdir("nomedir")


Copia un file

import shutil
shutil.copyfile("nomefile", "nuovofile")



Avvia un programma esterno (windows)

os.system("notepad.exe")


Cancella il contenuto della console (windows)

os.system("CLS")



Modulo time (ora /data / tempo)

Calcolo tempo trascorso (in secondi):

import time
inizio = time.clock()
fine = time.clock()
trascorso = fine - inizio



Data e ora attuale:

Ottenere l'ora attuale nel formato HH:MM:

time.strftime( "%H:%M", time.localtime() )

Ottenere la data attuale nel formato GG-MM-AAAA:

time.strftime( "%d-%m-%Y", time.localtime() )



File di testo

Leggere una riga da un file di testo eliminando i line-feed:

f = file("testo.txt", "r")
riga = f.readline().rstrip("\n")


Leggere un intero file di testo eliminando i line-feed:

righe = map( lambda x: x.rstrip("\n"),  file("testo.txt", "r") )


Ciclare sulle righe di un file di testo eliminando i line-feed e chiamando una funzione esterna:

def funz(x):
    ...
    ...
map( funz, map( lambda x: x.rstrip("\n"), file("testo.txt", "r") ) )


Stampa a video un intero file .txt:

print file("testo.txt", "r").read()


Stampa su stampante un file di testo (windows):

import win32api
win32api.ShellExecute(0, "print", "pippo.txt", None, ".", 0)


Crea un file temporaneo

import tempfile
nomefile = tempfile.mktemp(".txt")




Comunicazione seriale RS232 (modulo serial)

Aprire porta seriale:
 
import serial
ser = serial.Serial("com1", 38400, 8, "N", 2, timeout=1)

- Di default i parametri sono settati 9600 8-N-1, la porta si apre nel momento in cui si istanzia l'oggetto.
- Se timeout è impostato a None (default) la lettura della seriale è bloccante, cioè se non c'è un
carattere nel buffer di ricezione la funzione read() rimane in attesa. Se è impostato a 0 la funzione read() non attende (se c'è un carattere lo riporta, se non c'è ritorna stringa nulla). Se è impostato a N attende al massimo N secondi, poi read() riporta stringa nulla.


Scrivere sulla seriale:

ser.write("stringa") # una stringa
ser.write(chr(0))    # un singolo carattere/byte
ser.write("\x00")    # carattere/byte espresso in esadecimale


Leggere dalla seriale:

c = ser.read(1)    # lettura di un carattere/byte
c = ser.read(100)  # lettura di una stringa di 100 caratteri/byte

- Se i caratteri letti si vogliono considerare come valori binari
usare la funzione ord()


Vuotare i buffer di input o output:


ser.flushInput()
ser.flushOutput()


Chiudere la porta:

ser.close()



Grafica (modulo Tkinter)

Aprire una finestra grafica 640x480

import Tkinter
form1 = Tkinter.Tk()
form1.title("Titolo della finestra")
form1.resizable(0, 0)
canvas1 = Tkinter.Canvas(form1,
    width=640,
    height=480,
    bg="white",
    highlightthickness=0  )
canvas1.pack()
form1.mainloop()

- Se non si mette 0 highlightthickness  l'area grafica (canvas) risulta circondata da un bordo extra di 2 px che entra nel computo delle coordinate: Il punto in alto a sinistra nell'area grafica utile sarebbe la coordinata 2,2 (x,y).
- L'area grafica utile e' grande come dichiarato in width e height.
- Ogni elemento grafico disegnato (righe, poligoni, rettangoli, ovali, archi, testi) e' un oggetto dotato di un identificatore interno al canvas e di proprieta' modificabili (posizione, colori ecc). Il canvas non e' un'area bitmap dove lavorare bit per bit.
- I colori predefiniti sono white, black, red, green, blue, yellow, cyan, magenta (vedere anche http://infohost.nmt.edu/tcc/help/pubs/tkinter/colors.html)


form1.resizable(0, 0)      #Rende non ridimensionabile la finestra
form1.overrideredirect(1)  #Toglie menu di sistema, titolo e bordi
form1.geometry("640x480")  #Dimensione finestra
form1.geometry("640x480+100+180") #Dimensione finestra e posizione x,y

#Finestra centrata
form1.geometry("%dx%d+%d+%d" % (WIDTH, HEIGHT,
     root.winfo_screenwidth() - WIDTH/2,
     root.winfo_screenheight() - HEIGHT/2 ) )



Tracciare una linea (uno o piu' segmenti): (riferimento esterno)

canvas1.create_line(x1, y1, x2, y2)

- L'ultimo pixel della linea non viene disegnato.
- Con il parametro arrow="" si puo' aggiungere una freccia alle estremita' della linea, arrow puo' essere "first", "last", "both".
- Il colore della riga e' nero di default, si puo' cambiare con il parametro fill="colore"
- Con dash=1 la linea diventa tratteggiata.
- Con width=  si imposta lo spessore della linea (default 1).
- Se si usa una variabile per identificare un oggetto grafico, questo puo' essere modificato a runtime:

identificatore = canvas1.create_line(2, 25, 101, 25, arrow="both", dash=1)
canvas1.itemconfigure(identificatore, fill="red")
canvas1.coords(identificatore, 2, 2, 101, 51)
 
Nota: il plottaggio di un singolo pixel si puo' simulare tracciando una riga lunga 2 pixel (di cui solo il primo viene disegnato)


Cancellare tutti gli oggetti dal canvas:

canvas1.delete("all")


Ottenere lista identificatori di tutti gli oggetti dal canvas:

Gli id sono numeri interi progressivi non necessariamente consecutivi.

lista_id = canvas1.find_all()


Esportare il canvas in formato postscript:

canvas1.postscript(colormode="color",
                   file="nomefile.ps", 
                   rotate=False, x=2, y=2,
                   width=100, height=50)



Visualizzatore postscript online




Grafica con PIL

- La libreria PIL permette di manipolare immagini fotografiche in diversi formati.
- Si puo' disegnare con i comandi grafici su un'immagine in memoria, che puo' essere salvata in diversi formati e visualizzata da Tkinter.

Crea un'immagine PIL 640x480

import Image
img = Image.new("RGB", (640, 480), "white")

Le coordinate partono da (0,0) in alto a sinistra e arrivano fino a (639,479) in basso a destra.


Carica un'immagine da file

img = Image.open(file="pippo.jpg")

- larghezza, altezza = img.size
- equivale a: larghezza = img.size[0];  altezza = img.size[1]


Leggere il colore di un pixel

- si ottiene una tupla di tre interi RGB

colore = img.getpixel( (x, y) )


Traccia una linea sull'immagine

import ImageDraw
D = ImageDraw.Draw(img)
D.line( (x1, y1, x2, y2), fill="green" )

- La linea viene disegnata dal primo all'ultimo pixel
- Specificando piu' coordinate si tracciano piu' segmanti uniti


Disegna un pixel

D.point( (x, y), fill="red" )


Disegna un rettangolo

D.rectangle( (x1,  y1, x2, y2), fill="green", outline="yellow" )

- se si vuole specificare larghezza e altezza:

D.rectangle( (x1, y1, x1+larghezza-1, y2+altezza-1) )

- se si omette outline il rettangolo e' completamente del colore fill
- se si omette anche fill il rettangolo e' trasparente con bordo bianco
- il bordo fa parte dell'area del rettangolo

- per cancellare l'immagine disegnando un rettangolo nero:

D.rectangle( (0, 0, img.size[0], img.size[1]), fill="black" )


Disegna un cerchio (in x,y di raggio r)

D.ellipse( (x-r, y-r, x+r, y+r), fill="yellow" )

- fill e outline funzionano come per rectangle
- un raggio di 1 crea un quadrato di 3x3 pixel


Ridimensiona l'immagine

img.resize( (larghezza, altezza), Image.ANTIALIAS )


Salva l'immagine su file

img.save("nomefile.jpg")
img.save("nomefile.gif")
img.save("nomefile.png")


Visualizza l'immagine in Tkinter

- ATTENZIONE: prima di creare l'oggetto immagine bisogna aver gia' creato la gui istanza di Tk

import ImageTk
form1 = Tkinter.Tk()
im = ImageTk.PhotoImage(img)
canvas1 = Tkinter.Canvas(form1, width=640, height=480)
canvas1.create_image(2, 2, image=im, anchor="nw")
canvas1.pack()
form1.mainloop()

- salvandosi l'identificatore dell'oggetto immagine del canvas, l'immagine contenuta puo' essere successivamente aggiornata:

identificatore = canvas1.create_image(2, 2, image=im, anchor="nw")
:
:
i
m = ImageTk.PhotoImage(img)
canvas1.itemconfig(identificatore, image=im)






Formattazione dell'output stringa

La sintassi in generale e':

     "stringa di formattazione" % (tupla di valori)

La stringa di formattazione e' una normale stringa che contiene pero' anche "destinazioni di conversione" che iniziano con % e finiscono con un codice che indica il tipo di dato da rappresentare. Per ogni destinazione deve esserci un elemento corrispondente nella tupla di valori.

s
stringa
i
intero
x
esadecimale
X
esa maiuscolo
e
float esponenziale
f
float

Tra % e il codice si possono mettere altre specifiche di formattazione, esempi:

Intero allineato a destra in campo di 5 caratteri: "%5i" % 123
Float in campo di 10 caratteri con 2 cifre dopo la virgola: "%10.2f" % 3.14159
Esadecimale in campo di 4 caratteri: "%4X" % 255
Esadecimale in campo di 4 caratteri con zeri a sinistra: "%04X" % 255



Tipi di dati

Numeri

Intero
299792   -12  0
Intero in esadecimale
0x1EF48  0Xfa  0x0
Float
3.14   -0.015  0.0   15.
Float esponenziale
6.67e-11  -5485e15


Caratteri e stringhe

- Stringhe tra doppi apici o tra apici singoli

"stringa"    'stringa'


- Modi per mettere apici all'interno di una stringa:

"stringa con un apice singolo ' interno"
'stringa con un doppio apice " interno'
'stringa con un apice singolo \' interno come seq di escape'
"stringa con un doppio apice \" interno come seq di escape"


- Alcuni caratteri speciali (sequenze di escape)
Sequenza
Carattere
\r
carriage return (CR=0x0D)
\n
line feed (LF=0x0A)
\t tabulatore
\\
\
\'
'
\"
"
\0
null (zero binario)
\x6A
carattere/byte codice 0x6A
chr(97)
carattere/byte codice 97


- Le stringhe si possono concatenare e ripetere

"buon" + "viaggio"
"ciao" * 4



- Le stringhe raw ignorano le sequenze di escape interne (utile per i percorsi dei files)

r'C:\nuovacartella'



Miniesempi

Scansione elementi di una sequenza (stringa, lista, tupla, file):

for x in seq:
    print x



Scansione elementi ottenendo anche l'indice i:

for i,x in enumerate(seq):
    print i,x



Dizionari come tabelle

t = {}
for y in range(10):
    for x in range(10):
        t[y,x] = (y+1) * (x+1)
        print t[y,x], "\t"
    print



Lambda per passare parametri

Dove e' prevista solo una funzione e' possibile usare una lambda per passare dei parametri alla funzone da chiamare.

map( lambda x: funz(x), range(100) )


Modi equivalenti tra loro:

def fun():
    print("into f1") 


a = fun
a() 

 
a = lambda : fun()
a() 


def a(): return fun()
a()


a = lambda : fun
a()() 


def a(): return fun
a()()






Ultimo aggiornamento 25/9/2011