Corso Python
Requisiti:
- Computer con Linux
- Conoscenze minime di inglese
- Conoscenza Git opzionale
Indice
Risorse di riferimento:
- Libro consigliato: Imparare a programmare con Python. Dai 13 anni in su
- Manuale PyQt in Italiano di 12 pagine
- https://www.learnpyqt.com/
- Esercizi pratici
- Risorse in italiano:
- Avanzato per data science https://github.com/astrastefania/corso-engim-ifts
- Fare un gioco di corse con Pygame
- Corso in inglese sia libro che video
- Corso online interattivo
- Come fare un bot Telegram facilmente in python
- Script già pronti per imparare passo passo Python
Legenda
- Il testo con sfondo grigio sono comandi oppure codice
- Vanno copiati e incollati a seconda del contesto
- Sul sito GitHub per scaricare il codice si può usare il pulsante Download Now e successivamente cliccare su Zip
- Nel codice ad esempio
# Del testo qui
sono commenti e si possono ignorare, servono solo come nota per ricordarci cosa fa quel codice. Il codice può essere copiato e incollato oppure scritto tutto a mano. - A ogni blocco di codice verrà chiesto ai partecipanti cosa fa il codice e dopo verrà spiegato
Primo incontro
- Installazione Python 3, librerie QT e Spyder
apt install python3 python3-pyqt5 qttools5-dev-tools pyqt5-dev-tools spyder python3-spyder*
- Proviamo Spyder con https://github.com/spyder-ide/spyder/wiki/How-to-run-PyQt-applications-within-Spyder
python --help
sul terminale- Provare a lanciare questo programma
#!/usr/bin/env python
import sys
from PyQt5 import QtGui, QtWidgets
from PyQt5.QtCore import Qt
class MainWindow(QtWidgets.QLabel):
def __init__(self):
super().__init__()
pixmap = QtGui.QPixmap(400, 300)
pixmap.fill(Qt.white) # cosa succede se modifichi qui?
self.setPixmap(pixmap)
self.iamdrawing = False
self.painter = QtGui.QPainter(self.pixmap())
p = self.painter.pen()
p.setWidth(4) # cosa succede se modifichi qui?
p.setColor(QtGui.QColor('#ff0000')) # cosa succede se modifichi qui?
self.painter.setPen(p)
def mousePressEvent(self, e):
self.iamdrawing = True
def mouseReleaseEvent(self, e):
self.iamdrawing = False
def mouseMoveEvent(self, e):
if self.iamdrawing:
self.painter.drawPoint(e.x(), e.y())
self.update()
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
- Vedremo come lanciare degli script python da terminale
- Prova della demo del gioco Snake https://github.com/Mte90/pyqt_snake
- App PyQT vuota di esempio https://github.com/Mte90/PyQT-Boilerplate
- Proviamo Qt Designer per disegnare una finestra e lanciare un programma
- https://develop.kde.org/docs/getting-started/python/pyqt-app/
- Altre giochi demo da scaricare/studiare/provare
Secondo incontro
- Facciamo un Hello world: https://www.ssaurel.com/blog/70-years-of-hello-world-with-50-programming-languages/
- Le Variabili (tipo intero e stringa) e condizioni
- I cicli
- Cosa sono le variabili nei linguaggi di programmazione https://www.programmareinpython.it/video-corso-python-base/variabili-e-stringhe/
Proviamo un hello world in Python
print('hello world')
Verifica se il numero inserito è pari
Ref: https://www.meccanismocomplesso.org/lessons-lezioni-di-python-il-costrutto-condizionale-if/
s = input("Inserisci un valore:") # Prima fase
a = int(s) # Seconda fase
if a%2 == 0: # Terza fase
print("Hai inserito un numero pari")
else:
print("Hai inserito un numero dispari")
Stesso codice in altri linguaggi per comparazione (differenze e similitudini)
-- PHP --
$s = input("Inserisci un valore:");
$a = intval($s);
if ($a/2 == 0) {
echo("Hai inserito un numero pari");
} else {
echo("Hai inserito un numero dispari");
}
-- JavaScript --
s = prompt("Inserisci un valore:");
a = Math.parseInt(s);
if (a%2 == 0) {
console.log("Hai inserito un numero pari");
} else {
console.log("Hai inserito un numero dispari");
}
-- Bash --
echo "Il valore è $1"
expr "$1" + 0;
if [ "$1"%2 -eq 0 ]; then
echo "Hai inserito un numero pari";
else
echo "Hai inserito un numero dispari";
fi
-- C++ --
int main() {
int num;
printf("Inserisci un numero\n");
scanf("%d", &num);
if (num%2 == 0) {
printf("%d è un numero pari.\n", num);
else
printf("%d è un numero dispari.\n", num);
}
}
-- Rust --
fn main() {
let num = input("Inserisci un numero: ")
.unwrap()
.parse::<i32>()
.expect("Mi aspetto un numero!");
let divisore:i32 = 2;
if num % divisore == 0 {
println!("`{}` è un numero pari.", num);
} else {
println!("`{}` è un numero dispari.", num);
}
}
Versione con cicli
s = input("Inserisci un valore:")
contatore = 0
while contatore <= s: #for numero in range(contatore):
print(contatore)
contatore = contatore + 1
if contatore%2 == 0:
print(str(contatore) + " è un numero pari")
else:
print(str(contatore) + " è un numero dispari")
Disegneremo una interfaccia con QT Designer e la lanceremo nel nostro programma utilizzando come base https://github.com/Mte90/PyQT-Boilerplate.
Scaricare il file zip ed estrarlo. Lanciare Progettazione Qt5 o QtDesigner, scegliete Main Window come tipo di finestra, inserite 1 Push Button, 2 Label, 2 SpinBox.
Posizionate il file dentro la cartella del boilerplate e lanciate il file pyqt5-app-ui.py
premendo il tasto play verde di Spyder.
Il compito per casa è aggiungere la moltiplicazione e divisione (la divisione richiede un controllo se i valori sono 0, perché solo Chuck Norris può dividere per zero).
Codice della calcolatrice: https://drive.google.com/open?id=1cYSqqneifJk8k3mfkrFm6YcSNzWxFPar
Terzo Incontro
- Cosa sono gli array/matrici/vettori – https://www.programmareinpython.it/video-corso-python-base/14-liste-e-tuple/
- Spiegazione basilare di programmazione ad oggetti molto rapida
- Scaricare il gioco Snake https://github.com/Mte90/pyqt_snake che studieremo insieme per capire come funziona sfruttando le lezioni precedenti
Per divertimento:
- Pong in Python e Qt – https://github.com/GrishaVar/PyQt5-Games/blob/master/pong.py
Quarto Incontro
Abbiamo due opzioni:
- Come generare dei grafici e pdf da fogli di calcolo, come progetto di studio useremo il resoconto di ILS
- Leggere il green pass tramite la webcam del pc e informare l’utente
- https://github.com/panzi/verify-ehc
- https://github.com/zorbaproject/greenpass-turnstile – versione avanzata incompleta che legge anche la tessera sanitaria pensata per i tornelli e raspberry
Se abbiamo tempo vedremo come fare un binario di uno script python:
apt-get install python3-pip
pip install pyinstaller
- Cos’è https://www.pyinstaller.org/
pyinstaller calcolatrice.py
Quarto Incontro (Raspberry)
- Flashare su un Raspberry Pi, Raspbian con interfaccia grafica
- Installare Python sul Raspberry Pi – Fatto
apt-get install python3-rpi.gpio python3-pyqt5
- Collegare i vari cavi con la breadboard ed un pulsante
- Useremo dei monitor oppure ci collegheremo in remoto
- Modificheremo il gioco Snake https://github.com/Mte90/pyqt_snake sul Raspberry Pi per usare i pulsanti fisici visti all’incontro precedente.
- https://github.com/Mte90/pyqt_snake/blob/master/pyqt_snake_raspberry.py versione per il raspberry
Video in funzione: https://www.instagram.com/p/B525FUUI_8U/
Riferimento Pulsante: https://raspberrypihq.com/use-a-push-button-with-raspberry-pi-gpio/
Riferimento Led: https://raspberrypihq.com/making-a-led-blink-using-the-raspberry-pi-and-python/
Chiudere il programma con un pulsante
import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BOARD) # Use physical pin numbering
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Set pin 10 to be an input pin and set initial value to be pulled low (off)
while True: # Run forever
if GPIO.input(10) == GPIO.HIGH:
print("Button was pushed!")
exit()
Azioni multiple con i pulsanti
import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
def button_callback_10(channel):
print("Button 10 was pushed!")
def button_callback_11(channel):
print("Button 11 was pushed!")
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BOARD) # Use physical pin numbering
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Set pin 10 to be an input pin and set initial value to be pulled low (off)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Set pin 11 to be an input pin and set initial value to be pulled low (off)
GPIO.add_event_detect(10, GPIO.RISING,callback=button_callback_10) # Setup event on pin 10 rising edge
GPIO.add_event_detect(11, GPIO.RISING,callback=button_callback_11) # Setup event on pin 11 rising edge
message = input("Press enter to quit\n\n") # Run until someone presses enter
GPIO.cleanup() # Clean up
Led lampeggiante
import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
from time import sleep # Import the sleep function from the time module
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BOARD) # Use physical pin numbering
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW) # Set pin 8 to be an output pin and set initial value to low (off)
while True: # Run forever
GPIO.output(8, GPIO.HIGH) # Turn on
sleep(1) # Sleep for 1 second
GPIO.output(8, GPIO.LOW) # Turn off
sleep(1) # Sleep for 1 second
Per ogni informazione
Contattateci tramite Telegram, Facebook o Instagram!