Corso Python

Requisiti:

  • Computer con Linux
  • Conoscenze minime di inglese
  • Conoscenza Git opzionale

Indice

Risorse di riferimento:

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

#!/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_()

Secondo incontro

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

Per divertimento:

Quarto Incontro

Abbiamo due opzioni:

Se abbiamo tempo vedremo come fare un binario di uno script python:

Quarto Incontro (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!