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)
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")
:
:
im = 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