Ho cominciato a programmare circa dieci anni fa, in terza superiore, e da allora qualche giovedì sicuramente è passato.
In questi anni ho sperimentato diversi linguaggi di programmazione: alcuni li ho odiati con ogni fibra del mio corpo, altri sono diventati gli strumenti con cui oggi porto a casa la pagnotta. Tra tutti, però, il linguaggio con cui ho avuto il rapporto più intenso — un misto di amore e odio — è stato Python.
Python è stato il terzo linguaggio che ho imparato a scuola, dopo C e Shell Script. All’inizio è stato fondamentale per approfondire il mondo della programmazione, in particolare quello della programmazione orientata agli oggetti (OOP).
Col tempo però, soprattutto dopo la scuola, il suo ruolo nella mia vita è andato via via affievolendosi. Ho iniziato a rendermi conto che molti degli script che scrivevo in Python potevano essere risolti in modo più diretto con una manciata di comandi Shell.
Oggi, complice un momento di decluttering digitale e un pizzico di nostalgia per i miei primi anni da smanettone, ho deciso di fare un po’ d’ordine e condividere qui una lista riassuntiva di vecchi script Python che ho ritrovato sul mio PC.
01. Piccoli progetti da cui inziare (livello base)
All’epoca era passato un bel po’ di tempo dalla fine delle superiori alla creazione del mio primo file .py sul computer. E, dato che la mia memoria funziona a fasi alterne — nel senso che a volte fa schifo e altre fa ancora peggio — avevo deciso di seguire qualche tutorial trovato su Instagram durante il lockdown, convinto che così avrei potuto riprendere un po’ la mano (Potete pure mandarmi a cagare per questa stronzata, lo accetto).
Questi sono alcuni degli script che avevo provato a scrivere in quel periodo.
⏰ 1. Sveglia in Python (Alarm Clock)
Un esempio semplice ma funzionale. Il programma chiede l’orario della sveglia e la confronta ogni secondo con l’orario attuale. Quando coincidono, suona.
from datetime import datetime
from playsound import playsound
alarm_time = input("Enter the time of alarm to be set:HH:MM:SS\n")
alarm_hour = alarm_time[0:2]
alarm_minute = alarm_time[3:5]
alarm_seconds = alarm_time[6:8]
alarm_period = alarm_time[9:11].upper()
print("Setting up alarm...")
while True:
now = datetime.now()
current_hour = now.strftime("%I")
current_minute = now.strftime("%M")
current_seconds = now.strftime("%S")
current_period = now.strftime("%p")
if(alarm_period == current_period):
if(alarm_hour == current_hour):
if(alarm_minute == current_minute):
if(alarm_seconds == current_seconds):
print("Wake Up!")
playsound('audio.mp3')
break
🔍 2. Binary Search
Un classico esempio di algoritmo di ricerca. L’utente inserisce un numero e il programma cerca quel valore all’interno di una lista ordinata.
lst = [1,2,3,4,5,6,7,8,9,10]
lst.sort()
first = 0
last = len(lst) - 1
mid = (first + last) // 2
item = int(input("enter the number to be search: "))
found = False
while(first <= last and not found):
mid = (first + last) // 2
if lst[mid] == item:
print("found at location {mid}")
else:
if item < lst[mid]:
last = mid - 1
else:
first = mid + 1
if found = False:
print("Number not found")
🎲 3. Simulatore di Dadi
Un programma minimalista che simula il lancio di un dado.
import random
while True:
print(''' 1. roll the dice 2.exit''')
user = int(input("What you want to do\n"))
if user == 1:
number = random.randint(1,6)
print(number)
else:
break
🔢 4. Indovina il numero
Il computer genera un numero tra 1 e 10. Hai 3 tentativi per indovinarlo
import random
number = random.randint(1,10)
for i in range(0,3):
user = int(input("guess the number"))
if user == number:
print("Hurray!!\nyou guesed the number right it's {number}")
break
if user != number:
print("Your guess is incorrect the number is {number}")
🔐 5. Generatore di Password
Crea una password casuale di lunghezza a scelta, combinando lettere, numeri e simboli.
import random
passlen = int(input("enter the length of password: "))
s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&()?"
p = "".join(random.sample(s,passlen))
print(p)
📅 6. Visualizza un calendario mensile
Questo piccolo script ti permette di generare e stampare a schermo il calendario di un mese specifico, semplicemente inserendo anno e mese da tastiera.
import calendar
yy = int(input("Insert year: ")) # year
mm = int(input("Insert month: ")) # month
print(calendar.month(yy, mm)) # display the calendar
✊✋✌️ 7. Sasso, Carta, Forbici
Un grande classico trasformato in uno script Python interattivo. L’utente gioca contro il computer, che sceglie casualmente tra “sasso”, “carta” e “forbici”.
import random
game_list = ['Sasso','Carta','Forbice']
computer = c = 0
command = p = 0
print("Score: Computer" + str(c) + " Player " + str(p))
#the loop
run = True
while run:
computer_choice = random.choice(game_list)
command = input("Sasso, Carta, Forbice o Esci: ")
if command == computer_choice:
print("Tie")
elif command == "Sasso":
if computer_choice == "Forbice":
print("Ha vinto il player!")
p += 1
else:
print("Ha vinto il computer!")
c += 1
elif command == "Carta":
if computer_choice == "Sasso":
print("Ha vinto il player!")
p += 1
else:
print("Ha vinto il computer!")
c += 1
elif command == "Forbice":
if computer_choice == "Carta":
print("Ha vinto il player!")
p += 1
else:
print("Ha vinto il computer!")
c += 1
elif command == "Esci":
break
else:
print("Comand sbagliato!")
print("Player: " + command)
print("Computer: " + computer_choice)
print("")
print("Score: Computer " + str(c) + " Player " + str(p))
print("")
02. Altri progetti (livello intermedio)
Finito di scrivere i primi sei script, come si può intuire, mi sono ritrovato a chiedermi se tutto questo avesse davvero senso (spoiler: sni).
Ma, visto che ero già in ballo — e tanto in quel periodo non è che ci fosse molto altro da fare — ho deciso di continuare.
Parliamo dell’autunno-inverno 2020: pieno lockdown, giornate tutte uguali, e la voglia di mettermi alla prova con qualcosa che, almeno sulla carta, doveva essere un po’ più complesso.
📸 1. Downloader di immagini profilo Instagram (con GUI)
Un’app semplice ma d’effetto: digiti il nome utente Instagram e clicchi su “Download” — il programma scarica automaticamente la foto profilo del profilo indicato.
import instaloader
from PIL import ImageTk, Image
import tkinter as tk
from tkinter import messagebox
win = tk.Tk()
win.title('Instagram Image Downloader')
def imgDownload():
ig = instaloader.Instaloader()
profile = entry.get()
ig.download_profile(profile, profile_pic_only = True)
messagebox.showinfo("Status","Image Downloaded Successfully")
img = Image.open("ig.png")
img = img.resize((200, 200), Image.ANTIALIAS)
resized_img = ImageTk.PhotoImage(img)
title = tk.Label(win, text="Instagram Image Downloader",font=("Times",20,"bold"))
title.grid(row=0,column=0,columnspan=5,padx=30,pady=10)
image = tk.Label(win,image=resized_img)
image.grid(row=2,column=0,columnspan=5,pady=20)
label1 = tk.Label(win,text="Enter Username: ",font=("Arial",10))
label1.grid(row=3,column=0)
entry = tk.Entry(win,width=40)
entry.grid(row=3,column=1,columnspan=3)
btn = tk.Button(win,text="Download",command=imgDownload)
btn.grid(row=4,column=0,columnspan=5,pady=10)
win.mainloop()
📥 2. Downloader di video YouTube con Python
Uno script semplice per scaricare video da YouTube direttamente tramite terminale. Inserisci il link del video e lui fa il resto.
from tkinter import *
import pathlib
from pytube import YouTube
# pip install pytube3
from tkinter import messagebox, filedialog
def Widgets():
link_label = Label(root,text="YouTube link :",bg="#E8D579",width=20)
link_label.grid(row=1,colum=0,pady=5,padx=5)
linkText = Entry(root,width=55,textVariable = video_Link)
linkText.grid(row=1,colum=1,pady=5,padx=5,columnspan=2)
destination_label = Label(root,text="Destination :",bg="#E8D579",width=20)
destination_label.grid(row=2,column=0,pady=5,padx=5)
browse_B = Button(root,text="Browse",command=Browse,width=10,bg="#05E8E0")
browse_B.grid(row=2,column=2,pady=1,padx=1)
Download_B = Button(root,text="Download",command=Download,width=20,bg="#05E8E0")
Download_B.grid(row=3,column=1,pady=3,padx=3)
# destination folder to save the video
def Browse():
download_Directory = filedialog.askdirector(initialdir=pathlib.Path.cwd())
# Displaying the directory in the directory
#textbox
download_Path.set(download_Directory)
def Download():
#getting user-input Youtube Link
YouTube_link = video_Link.get()
download_Folder = download_Path.get()
# Creating objext of YouTube()
getVideo = YouTube(YouTUbe_link)
# Getting alla the available streams of the youtube video and selecting the first
videoStream = getVideo.streams.first()
# Downloading the video to destination
videoStream.downloas(download_Folder)
# Displaying the message
messagebox.showinfo("SUCCESSFULLY","DOWNLOADED AND SAVED IN\n" + download_Folder)
root = Tk()
root.geometry("400x110")
root.resizable(0,0)
root.title("YouTube Video Downloader")
root.config(background = "#000000")
# Creating the tkinter Variables
video_Link = StringVar()
download_Path = StringVar()
# Calling the Widgets() function
Widgets()
root.mainloop()
Ecco… questo forse è uno degli script di cui vado più fiero e che, effettivamente, mi è tornato utile.
🎧 3. Dividere file audio con Python
Hai un file audio troppo lungo e vuoi tagliarlo in parti più piccole? Con pydub bastano poche righe di codice per farlo.
from pydub import AudioSegment
from pydub.utils import make_chunks
my_audio = AudioSegment.from_file("audio.wav", "wav")
chunk_length_ms = 780000 # pydub calculates in millisecond
chunks = make_chunks(my_audio, chunk_length_ms) # Make chunks of one sec
for i, chunk in enumerate(chunks):
chunk_name = "audio_split_{0}.wav".format(i)
print("exporting", chunk_name)
chunk.export(chunk_name, format="wav")
🎵 4. Music Player con interfaccia grafica
Un piccolo lettore musicale fatto in casa. Può riprodurre file .mp3, ha un’interfaccia semplice e serve a prendere confidenza con pygame.mixer e tkinter.
import pygame
from pygame import mixer
from tkinter import *
import os
def playsong():
currentsong=playlist.get(ACTIVE)
print(currentsong)
mixer.music.load(currentsong)
songstatus.set("Playing")
mixer.music.play()
def pausesong():
songstatus.set("Paused")
mixer.music.pause()
def stopsong():
songstatus.set("Stopped")
mixer.music.stop()
def resumesong():
songstatus.set("Resuming")
mixer.music.unpause()
root=Tk()
root.title('ProjectGurukul Music player project')
mixer.init()
songstatus=StringVar()
songstatus.set("choosing")
#playlist---------------
playlist=Listbox(root,selectmode=SINGLE,bg="DodgerBlue2",fg="white",font=('arial',15),width=40)
playlist.grid(columnspan=5)
os.chdir(r'C:\Users\BOSS\Desktop\MyPlaylist')
songs=os.listdir()
for s in songs:
playlist.insert(END,s)
playbtn=Button(root,text="play",command=playsong)
playbtn.config(font=('arial',20),bg="DodgerBlue2",fg="white",padx=7,pady=7)
playbtn.grid(row=1,column=0)
pausebtn=Button(root,text="Pause",command=pausesong)
pausebtn.config(font=('arial',20),bg="DodgerBlue2",fg="white",padx=7,pady=7)
pausebtn.grid(row=1,column=1)
stopbtn=Button(root,text="Stop",command=stopsong)
stopbtn.config(font=('arial',20),bg="DodgerBlue2",fg="white",padx=7,pady=7)
stopbtn.grid(row=1,column=2)
Resumebtn=Button(root,text="Resume",command=resumesong)
Resumebtn.config(font=('arial',20),bg="DodgerBlue2",fg="white",padx=7,pady=7)
Resumebtn.grid(row=1,column=3)
mainloop()
🖼️ 5. Convertitore da PNG a JPG
Hai una cartella piena di immagini .png e ti serve convertirle in .jpg? Con questo script puoi farlo in pochi secondi, direttamente da terminale.
import tkinter as tk
from tkinter import filedialog
from PIL import image
root = tk.Tk()
canvas1 = tk.Canvas(root,width=300,height=250,bg='azure3',relief='raised')
canvas1.pack()
label1 = tk.Label(root,text='File Conversion Tool',bg='azure3')
label1.config(font=('helvetica',20))
canvas1.create_windows(150,60,window=label1)
def getPNG():
global im1
import_file_path = filedialog.askopenfilename()
im1 = Image.open(import_file_path)
browseButton_PNG = tk.Button(text=" IMPORT PNG FILE ",command=getPNG,bg='royalblue',fg='white',font=('helvetica',12,'bold'))
camvas1.create_window(150,130,window=browseButton_PNG)
def convertToJPG():
global im1
export_file_path = filedialog.asksaveasfilename(defaultextension='.jpg')
im1.save(export_file_path)
saveAsButton_JPG = tk.Button(text='Convert PNG to JPG',command=convertToJPG,bg='royalblue',fg='white',font=('helvetica',12,'bold'))
canvas1.create_windows(150,180,window=saveAsButton_JPG)
root.mainloop()
📝 6. Notepad in Python (con GUI)
Un progetto più strutturato, con una GUI realizzata interamente in tkinter. È un editor di testo basilare — supporta apertura, salvataggio, modifica di file .txt, ed è un ottimo esercizio per imparare a gestire finestre, menu e interazioni utente.
import tkinter
import os
from tkinter import *
from tkinter.messagebox import *
from tkinter.filedialog import *
class Notepad:
__root = Tk()
__thisWidth = 300
__thisHeight = 300
__thisTextArea = Text(__root)
__thisMenuBar = Menu(__root)
__thisFileMenu = Menu(__thisMenuBar, tearoff=0)
__thisEditMenu = Menu(__thisMenuBar, tearoff=0)
__thisHelpMenu = Menu(__thisMenuBar, tearoff=0)
__thisScrollBar = Scrollbar(__thisTextArea)
__file = None
def __init__(self,**kwargs):
try:
self.__root.wm_iconbitmap("Notepad.ico")
except:
pass
try:
self.__thisWidth = kwargs['width']
except KeyError:
pass
try:
self.__thisHeight = kwargs['height']
except KeyError:
pass
# Set the window text
self.__root.title("Untitled - Notepad")
# Center the window
screenWidth = self.__root.winfo_screenwidth()
screenHeight = self.__root.winfo_screenheight()
# For left-alling
left = (screenWidth / 2) - (self.__thisWidth / 2)
# For right-allign
top = (screenHeight / 2) - (self.__thisHeight /2)
# For top and bottom
self.__root.geometry('%dx%d+%d+%d' % (self.__thisWidth,left, top))
# To make the textarea auto resizable
self.__root.grid_rowconfigure(0, weight=1)
self.__root.grid_columnconfigure(0, weight=1)
# Add controls (widget)
self.__thisTextArea.grid(sticky = N + E + S + W)
# To open new file
self.__thisFileMenu.add_command(label="New",command=self.__newFile)
# To open a already existing file
self.__thisFileMenu.add_command(label="Open",command=self.__openFile)
# To save current file
self.__thisFileMenu.add_command(label="Save",command=self.__saveFile)
# To create a line in the dialog
self.__thisFileMenu.add_separator()
self.__thisFileMenu.add_command(label="Exit",command=self.__quitApplication)
self.__thisMenuBar.add_cascade(label="File",menu=self.__thisFileMenu)
# To give a feature of cut
self.__thisEditMenu.add_command(label="Cut",command=self.__cut)
# to give a feature of copy
self.__thisEditMenu.add_command(label="Copy",command=self.__copy)
# To give a feature of paste
self.__thisEditMenu.add_command(label="Paste",command=self.__paste)
# To give a feature of editing
self.__thisMenuBar.add_cascade(label="Edit",menu=self.__thisEditMenu)
# To create a feature of description of the notepad
self.__thisHelpMenu.add_command(label="About Notepad",command=self.__showAbout)
self.__thisMenuBar.add_cascade(label="Help",menu=self.__thisHelpMenu)
self.__root.config(menu=self.__thisMenuBar)
self.__thisScrollBar.pack(side=RIGHT,fill=Y)
# Scrollbar will adjust automatically according to the content
self.__thisScrollBar.config(command=self.__thisTextArea.yview)
self.__thisTextArea.config(yscrollcommand=self.__thisScrollBar.set)
def __quitApplication(self):
self.__root.destroy()
# exit()
def __showAbout(self):
showinfo("Notepad","Mrinal Verma")
def __openFile(self):
self.__file = askopenfilename(defaultextension=".txt",filetypes=[("All Files","*.*"),("Text Documents","*.txt")])
if self.__file == "":
# no file to open
self.__file = None
else:
# Try to open the file
# set the window title
self.__root.title(os.path.basename(self.__file) + " - Notepad")
self.__thisTextArea.delete(1.0,END)
file = open(self.__file,"r")
self.__thisTextArea.insert(1.0,file.read())
file.close()
def __newFile(self):
self.__root.title("Untitled - Notepad")
self.__file = None
self.__thisTextArea.delete(1.0,END)
def __saveFile(self):
if self.__file == None:
# Save as new file
self.__file = asksaveasfilename(initialfile='Untitled.txt',defaultextension=".txt",filetypes=[("All Files","*.*"),("Text Documents","*.txt")])
if self.__file == "":
self.__file = None
else:
# Try to save the file
file = open(self.__file,"w")
file.write(self.__thisTextArea.get(1.0,END))
file.close()
# Change the window title
self.__root.title(os.path.basename(self.__file) + " - Notepad")
else:
file = open(self.__file,"w")
file.write(self.__thisTextArea.get(1.0,END))
file.close()
def __cut(self):
self.__thisTextArea.event_generate("<<Cut>>")
def __copy(self):
self.__thisTextArea.event_generate("<<Copy>>")
def __paste(self):
self.__thisTextArea.event_generate("<<Paste>>")
def run(self):
# Run main application
self.__root.mainloop()
# Run main application
notepad = Notepad(width=600,height=400)
notepad.run()
🗣️ 6. Text to Speech
Un semplice Text to Speech in Python
# Import the required module for text
# to speech conversion
from gtts import gTTS
# This module is imported so that we can
# play the converted audio
import os
# The text that you want to convert to audio
mytext = 'Welcome to geeksforgeeks!'
# Language in which you want to convert
language = 'en'
# Passing the text and language to the engine,
# here we have marked slow=False. Which tells
# the module that the converted audio should
# have a high speed
myobj = gTTS(text=mytext, lang=language, slow=False)
# Saving the converted audio in a mp3 file named
# welcome
myobj.save("welcome.mp3")
# Playing the converted file
os.system("mpg321 welcome.mp3")
⚽ Creare un campo da calcio in Python
Preso spunto da quest’articolo che ho trovato interessante.
🕹️ Flappy Bird
Per questo ho seguito questo tutorial trovato su Youtube una sera.
Un fatto divertente su questo progetto è che, finito il gioco, ho provato a creare la versione .exe del file Python, fallendo miseramente.
🌐 Django
Avrei voluto scrivere tante cose a riguardo, ma voglio riassumere tutto con una domanda: “Ma perche?”
Faccio veramente fatica a comprendere e capire che posso usare python per lo sviluppo web, è una cosa che non ha senso.
Ho provato a fare una semplice landing, ma ho fatto una fatica a comprendere dove modificare e scrivere i componenti che ad un certo punto mi sono stufato ed ho mollato.
comprendo molto di più quelli che usano framework di Javascript che Django. Per me non ha un minimo di senso.
3. Progetti utili
Arriviamo ora alla parte più importante di questa pagina, ovvero quando Pyhton mi è effettivamente tornato utile.
Perchè sì, sovente Python l’ho usato per robe vagamente futili, ci sono stati 4 progetti che, alla fine dei conti, mi sono tornati utili.
Dato che i primi due erano in passatto articoli, saranno più corposi e lunghi degli altri. Metto i titoli apposta
3.1. Come fare un Website Blocker con Python (16 agosto 2022)
Liberati dei siti che non sopporti grazie a Python
Come creare un Website Blocker (un’applicazione che può essere usata per bloccare l’apertura di certi siti web) con Python e dargli anche una veste grafica grazie a tkinter. Questo è un programma molto utile per gli studenti che vogliono concentrarsi sugli studi e non vogliono altre distrazioni come i social media.
Premessa
Prima di partire col progetto, bisogna abilitare i permessi di scrittura del file host, per questo, andare nel percorso “C:\Windows\System32\drivers” e cambiare i permessi al file hosts.
Parte 1: creiamo la grafica
Come prima cosa, creiamo il layout grafico del nostro progetto, così per avere una base da cui partire. Importiamo le librerie Python Tkinter (per creare layout grafici) e PIL (che aggiunge il supporto per l’apertura, la manipolazione e il salvataggio di diversi formati di file immagine), poi salviamoci dentro 2 variabili la posizione del file hosts (C:\Windows\System32\drivers\etc\hosts) dando il permesso di scrittura e l’indirizzo Ip locale (127.0.0.1).
from tkinter import *
from PIL import Image, ImageTk
hosts_path = r"C:\Windows\System32\drivers\etc\hosts"
redirect_IP = "127.0.0.1" # localhost's IP Address
Ora, sovente sono abituato a utilizzare classi e oggetti dell’OOP (programmazione ad oggetti) quando realizzo progetti con tkinter, e anche in questo caso ho scritto il codice seguendo questa mia abitudine, ma è opzionale come cosa.
Creiamo la Classe Blocker, inizializzando gli attributi per creare tramite tkinter il “rettangolo” del programma, l’array in cui verranno inseriti i link da bloccare e i vari bottoni a lato con cui bloccare/sbloccare i siti.
class Blocker:
def __init__(self):
# Create Window
self.root = Tk()
self.root.title('Python Website Blocker')
self.root.geometry("500x350")
self.root.configure(background='white')
self.root.resizable(False, False)
self.root.wm_iconphoto(False, ImageTk.PhotoImage(Image.open('img/favicon.png')))
self.larghezza = self.root.winfo_screenwidth()
self.site_to_block = []
# Create Frame and Button
self.frame1 = Frame(self.root, width=250, height=self.root.winfo_screenheight(), background='white')
self.frame2 = Frame(self.root, width=250, height=self.root.winfo_screenheight(), background='white')
self.frame1.grid(row=0, column=0, rowspan=2)
self.frame2.grid(row=1, column=1, rowspan=2)
# Create Image Column
self.image = ImageTk.PhotoImage(file="img/img.png")
self.label1 = Label(self.frame1, image=self.image, width=250, height=300, padx=5, background='white', pady=20)
self.label1.grid(row=1, column=1)
# Create Button
self.button1 = Button(self.frame2, text="Blocca Social", width=30, height=5, command=self.blockSocial)
self.button1.grid(row=0, column=0, padx=15, pady=15)
self.button3 = Button(self.frame2, text="Blocca Tutto", width=30, height=5, command=self.blockAll)
self.button3.grid(row=2, column=0, padx=15, pady=15)
Ora creiamo una funzione start, in modo che all’esecuzione del programma venga creata la finestra con i parametri settati in precedenza
def start(self):
self.root.mainloop()
Parte 2: creiamo la funzioni
Come avrai notato, i tre bottoni permettono di bloccare tre tipi di siti: social networrk, siti porno, le due opzioni precedenti. Quindi ora la nostra attenzione deve concentrarsi su 3 importanti funzioni: blocca social, blocca porno, blocca tutto. Le 2 funzioni blocca social e blocca porno hanno al loro interno un array che contiene dei link (i siti da bloccare) e un controllo che modifica la scritta dei due bottoni da blocca * a sblocca * e, a seconda se il titolo del bottone a un testo o l’altro, vengono chiamate le funzioni per bloccare e sbloccare i siti. la funzione blocca tutto richiama le due funzioni citate prima
def blockSocial(self):
site = ['www.instagram.com', 'instagram.com', 'tiktok.com', 'www.tiktok.com', 'twitter.com']
self.site_to_block.extend(site)
if self.button1['text'] == "Blocca Social":
self.button1.configure(text="Sblocca Social")
self.block_websites()
else:
self.button1.configure(text="Blocca Social")
self.unblock_website()
def blockAll(self):
if self.button3['text'] == "Blocca Tutto":
self.blockSocial()
self.button1.configure(text="Sblocca Social")
self.button3.configure(text="Sblocca Tutto")
self.block_websites()
else:
self.blockSocial()
self.blockPorn()
self.button1.configure(text="Blocca Social")
self.button3.configure(text="Blocca Tutto")
self.unblock_website()
Per finire, creiamo le due funzioni che creano il cuore di questo programma, le funzioni blockwebsites e unblockwebsites. La funzione blockwebsites, tramite l’array con i siti e dei for, scrive sul file host l’url del sito, mentre unblockwebsite li toglie.
self.unblock_website()
def block_websites(self):
result = []
for i in self.site_to_block:
if i not in result:
result.append(i)
with open(hosts_path, 'r+') as hostfile:
hosts_content = hostfile.read()
for site in self.site_to_block: # for site in sites_to_block:
if site not in hosts_content:
hostfile.write(redirect_IP + ' ' + site + '\n')
def unblock_website(self):
with open(hosts_path, 'r+') as hostfile:
lines = hostfile.readlines()
hostfile.seek(0)
for line in lines:
if not any(site in line for site in self.site_to_block):
hostfile.write(line)
hostfile.truncate()
Per terminare, creiamo un oggetto Blocker e chiamiamo la funzione start.
app = Blocker()
app.start()
Codice Completo
from tkinter import *
from PIL import Image, ImageTk
hosts_path = r"C:\Windows\System32\drivers\etc\hosts"
redirect_IP = "127.0.0.1" # localhost's IP Address
class Blocker:
def __init__(self):
# Create Window
self.root = Tk()
self.root.title('Python Website Blocker')
self.root.geometry("500x350")
self.root.configure(background='white')
self.root.resizable(False, False)
self.root.wm_iconphoto(False, ImageTk.PhotoImage(Image.open('img/favicon.png')))
self.larghezza = self.root.winfo_screenwidth()
self.site_to_block = []
# Create Frame and Button
self.frame1 = Frame(self.root, width=250, height=self.root.winfo_screenheight(), background='white')
self.frame2 = Frame(self.root, width=250, height=self.root.winfo_screenheight(), background='white')
self.frame1.grid(row=0, column=0, rowspan=2)
self.frame2.grid(row=1, column=1, rowspan=2)
# Create Image Column
self.image = ImageTk.PhotoImage(file="img/img.png")
self.label1 = Label(self.frame1, image=self.image, width=250, height=300, padx=5, background='white', pady=20)
self.label1.grid(row=1, column=1)
# Create Button
self.button1 = Button(self.frame2, text="Blocca Social", width=30, height=5, command=self.blockSocial)
self.button1.grid(row=0, column=0, padx=15, pady=15)
self.button3 = Button(self.frame2, text="Blocca Tutto", width=30, height=5, command=self.blockAll)
self.button3.grid(row=2, column=0, padx=15, pady=15)
def start(self):
self.root.mainloop()
def blockSocial(self):
site = ['www.instagram.com', 'instagram.com', 'tiktok.com', 'www.tiktok.com', 'twitter.com']
self.site_to_block.extend(site)
if self.button1['text'] == "Blocca Social":
self.button1.configure(text="Sblocca Social")
self.block_websites()
else:
self.button1.configure(text="Blocca Social")
self.unblock_website()
def blockAll(self):
if self.button3['text'] == "Blocca Tutto":
self.blockSocial()
self.blockPorn()
self.button1.configure(text="Sblocca Social")
self.button3.configure(text="Sblocca Tutto")
self.block_websites()
else:
self.blockSocial()
self.blockPorn()
self.button1.configure(text="Blocca Social")
self.button3.configure(text="Blocca Tutto")
self.unblock_website()
def block_websites(self):
result = []
for i in self.site_to_block:
if i not in result:
result.append(i)
with open(hosts_path, 'r+') as hostfile:
hosts_content = hostfile.read()
for site in self.site_to_block: # for site in sites_to_block:
if site not in hosts_content:
hostfile.write(redirect_IP + ' ' + site + '\n')
def unblock_website(self):
with open(hosts_path, 'r+') as hostfile:
lines = hostfile.readlines()
hostfile.seek(0)
for line in lines:
if not any(site in line for site in self.site_to_block):
hostfile.write(line)
hostfile.truncate()
app = Blocker()
app.start()
E questo è tutto. Ora hai il tuo website blocker personale!
3.2. Creare un intero podcast artificialmente (20 dicembre 2023)
Anche detto: “mega sega mentale fatta dopo aver letto un Toot”
Ieri, mentre cazzeggiavo nella timeline locale, mi sono imbattuto in questo post di cesco che, per una persona a cui piace sperimentare scrivendo righe di codice, non dirà niente di nuovo… a me invece sta cosa ha fatto scoreggiare il cervello.
Ok, lo so che può suonare strano agli smanettoni dell’IA, ma guardiamo un attimo cosa c’è:
Riciclando del vecchio codice che avevo scritto e aggiungendo qualcosa di nuovo, in 5 min e
38 righe di codice ho messo in piedi uno script in python che:
– Scarica un articolo da una famosa testata giornalistica
– Lo riassume in breve
– Fa il TTS trasformandolo in un articolo letto da una voce sintetizzata. Che sulla carta non è pensata per
la lingua italiana, ma che comunque fa già un lavoro sorprendentemente buono.
Ho letto tutto questo mentre stavo ascoltando l’audio che c’è in allegato a questo toot e piano piano, nella mia testa, è cominciato un coro, all’inizio non coordinato e abbastanza stonato, che piano piano ha cominciato ad unirsi in un unica e potente frase: “Questo è un podcast”.
Perchè sì, togliendo l’effetto della voce, che ci fa capire che è fatta con un IA, tutto quello che ho sentito poteva essere tranquillamente un intermezzo di un podcast che mi ascolto al mattino mentre vado a lavorare, sì senza musiche ed effetti sonori di sottofondo, però l’essenza è quella.
Ed è lì che mi viene illuminazione…
passare le ultime 4 ore della mia vita a verificare (lo so che è già stato verificato tutto quasi un milione di volte, ma ho l’ossessione di reinventare la ruota) questo mio pensiero e, dato che si parlava di AI, sfruttare l’AI di Bing.
1. Bing AI mi darà una mano?
Devo essere sincero, fino a qualche giorno fa, non avevo mai provato l’AI di Bing, e non perchè avevo della diffidenza a rigurardo (cof. cof. Microsft cof. cof.), ma semplicemente perché non avendo Edge installato, dato che uso Fedora come OS principale, non mi era mai capitato di provarlo.
Ma negli ultimi giorni, causa un regalo da fare ad un amico, ho voluto prendere un portatile che ho qua a casa, usato dalla mia famiglia, e provare a creare qualcosa con Bing Image Creator… inutile dire che tempo 5 minuti sono finito col passare le mie ore a creare cagate su cagate per vedere quanto assurdi possono essere i comandi che puoi dare.
Ma tolto sta parentesi, non avevo provato ad usarlo per scrivere del codice quindi, dato che il chiodo fisso del giorno è fare questo cosa, mi sono messo lì, con due portatili accanto, a creare sto script con Bing AI.
Sincero, mi ha aiutato molto. Sì, alcune cose alla fine sono andato a cercarmele qua, ma per il resto mi ha dato un enorme mano in alcuni punti.
Da persona che si è sempre ostinata nel fare da se senza bisogno di AI, vorrei prendermi a sberle visto che ho capito solo ora che queste cose mi sarebbero stati utili quando programmavo più assiduamente, in modo da non fare delle supercazzole di 100 righe che si potevano riassumere in 25…
ma tolto questo…
2. Si crea lo scirpt
Partiamo da una cosa, che non ho mai preso seriamente in considerazione ma perchè python tolto l’uso scolastico non l’ho usato più di tanto (lo so, sono una brutta persona), ovvero il file requirments.txt.
Perchè non lo prendo in considerazione…. perchè sono solito usare il comando pip… vabbè
requirments.txt
beautifulsoup4==4.10.0
openai==0.27.0
e per installare questi pacchetti utilizzare il comando pip install -r requirments.txt.
Tolto sta parentesi imbarazzante, lo script si divide in 4 passaggi:
- Scaricare il contenuto dell’articolo
- Estrarre il testo dall’inzio
- Generare l’audio TSS
- Salvare l’audio in un file MP3
e, all’interno dello script, ho utilizzato due pacchetti in particolare, quelli installati prima, beautifulsoup (un pacchetto per il web scraping) e openAI (che penso non abbia bisogno di presentazioni).
il loro ruolo si può riassumere sostanzialmente nel scaricare da internet l’articolo interessato grazie a beautifulsoup e con openai convertirlo in audio. Tolto il fatto che ho dovuto creare un account openai per sto esperimento e so che me ne pentirò fortemente (del tipo che finisco questo articolo e lo cancello), il problema si è rivelato nel ricavare l’articolo.
Il primo articolo che ho utilizzato, non aveva una struttura adatta a questo tipo di esperimento e, cercando nella mia lista di link interessanti, non riuscivo a trovare niente che andasse bene, dato che ogni sito ha una struttura diversa dall’altro. Per fortuna ho scoperto che Rollign Stone si presta benissimo a quello che devo fare, quindi sono riuscito a salvarmi così.
Senza troppi giri di parole, dato che non mi so spiegare, ecco qua lo script finito:
script.py
import openai
from bs4 import BeautifulSoup
import requests
# Url dell'articolo
url_articolo = "https://www.rollingstone.it/cultura/gaming/un-programmatore-misterioso-ha-fatto-mario-64-per-pc/515650/"
# Scarica il contenuto dell'articolo
response = requests.get(url_articolo)
soup = BeautifulSoup(response.content, 'html.parser')
article_content = soup.find("div",class_="l-article-content")
# Estrai il testo dall'inzio
article_text = article_content.get_text()
# Genera laudio TSS
response = openai.OpenAI(api_key="ciuppaNonLascioIlMio").audio.speech.create(
model="tts-1",
voice="alloy",
input=article_text
)
# Salva l'audio in un file MP3
response.stream_to_file("articolo_mario64.mp3")
print("Contenuto scaricato con successo!")
Qua c’è il risultato finale
3. pensieri mei
Dopo tutta sta pappardella totalmente inutile, ma che ho fatto con il solo intento di provare a riscrivere codice in python e di usare Bing AI, arriviamo a quello che la mia mente a processato.
Ascoltando l’audio che mi è uscito a fine esperimento non riesco a non pensare che questo non possa essere una bozza audio che un qualsiasi editor di un podcast che tratta notizie riceve in fase di montaggio… le pause, la parlantina, tutto… si capisce che sì, è fatto con un IA, ma nell’effettivo non è neanche fastidiosa come quella di gTTS (comunemente chiamata la voce di Trenitalia), ma anzi si ascolta anche volentieri.
Tempo fa mi ricordo che girava la voce “Eh facile fare podcast, ti metti davanti ad un microfono e spari cazate finchè non ti stufi”… beh qua siamo andati oltre.
Prendiamo ad esempio Rolling Stone. Vuole fare un podcast dove vengono raccontati gli articoli scritti del giorno, come fa? Sì può investire in doppiatori e speaker di qualità che raccontano le notizie… oppure può usare un mini script come questo, cambiare la voce ad ogni notizia ed il gioco e fatto.
Con queste 30 righe di codice, copiando gli articoli online, potrei o potresti creare un podcast giornalieri, anche di un ora, dove vengono raccontate le notizie di attualità. Non devi più sbatterti a parlare ed incepparti al microfono, basta che scrivi quello che vuoi dire e openAi fa il resto per te, poi un pò di tagli e di musica e tac, ecco una puntata pronta per essere pubblicata.
Il podcast, almeno per me, è sempre stato una prova. Per quanto leggevo articoli online, io ho iniziato il mio primissimo podcast con l’obbiettivo di parlare più lentamente e di riuscire a leggere ad alta voce senza impappinarmi.
Non erano pensieri e testi miei ok lo ammetto, ma lo dicevo all’inzio di ogni puntata che questo era un esercizio per me, ero io che mi mettevo alla prova nel parlare, nel leggere, nel sentire e nel registrare la mia voce.
Facendo così togliamo tutto questo. Togliamo il senso di sincerità che i podcaster, almeno quelli più piccoli, mettono all’interno di ogni episodio che registrano; togliamo il senso mettersi alla prova nel lavorare un audio e nel farlo uscire come vuoi te; togliamo l’anima e la voce umana dai podcast e li facciamo diventare (almeno per me) come i telegiornali, freddi e senza anima, il rumore di fondo che alla lunga ti infastidisce e che un giorno o l’altro lo spegnerai per sempre.
3.3. Timer per allenarsi
Il terzo è stato un timer personalizzato creato per allenarmi a casa durante il secondo lockdown. Il timer è stato creato per rimettermi in forma e, tra tutti quelli inseriti in quest’articolo, penso che sia il progetto a cui tengo di più, dato che è stato scritto non per sfizio ma per rispondere effettivamente ad una mia esigenza.
Il timer si basa su quest’immagine:

e come audio, avevo tre miei vocali dove dicevo “Inzio”, “Pausa” e “Circuito finito”.
from PIL import ImageTk, Image
from tkinter import Label
from playsound import playsound
import tkinter as tk
import time
win = tk.Tk()
win.title('Circuito Brucia Calorie | Allenamento')
win.geometry("550x650")
def timerAllenati():
timer = 20
while timer:
time.sleep(1)
timer -= 1
playsound("src/audio/Pause.mp3")
def pausa():
timer = 10
while timer:
time.sleep(1)
timer -= 1
playsound("src/audio/Start.mp3")
def allenamentoCalorie():
i = 0
pausa()
while i < 24:
timerAllenati()
pausa()
i = i + 1
playsound("src/audio/Finish.mp3")
# Main
title = Label(win, text="Circuito Brucia Calorie | Allenamento", font=("Times", 20, "bold"))
title.grid(row=1, column=2, columnspan=5, padx=30, pady=10)
img = Image.open("src/img/img.jpg")
img = img.resize((500, 500), Image.ANTIALIAS)
resized_img = ImageTk.PhotoImage(img)
image = tk.Label(win, image=resized_img)
image.grid(row=2, column=0, columnspan=5, pady=20)
btn = tk.Button(win, text="Allenati", command=allenamentoCalorie)
btn.grid(row=4, column=0, columnspan=5, pady=10)
win.mainloop()
3.4. Modifiche ai commit git
Il quarto, infine, è stato uno script creato grazie all’IA qualche mese fa perchè dovevo cambiare velocemente i nomi di alcuni commit git.
Subito dopo averlo usato ho voluto fare alcune prove e mi sono reso conto che in shell ci mettevo tempo e righe in meno, ma a quel punto ho fatto spallucce e me ne sono sbattuto, tanto quello che dovevo fare l’avevo fatto.
import os
import subprocess
# === CONFIGURAZIONE ===
repo_path = "" # <- Cambia con il percorso del tuo repository
nuovo_nome = ""
nuova_email = ""
# === FUNZIONE PRINCIPALE ===
def riscrivi_autori(repo_path, nuovo_nome, nuova_email):
os.chdir(repo_path)
print("🔍 Avvio riscrittura dei commit...")
comando = f'''
git filter-branch --env-filter '
OLD_NAME=$(git config user.name)
OLD_EMAIL=$(git config user.email)
if [ "$GIT_COMMITTER_NAME" != "{nuovo_nome}" ] || [ "$GIT_COMMITTER_EMAIL" != "{nuova_email}" ]; then
export GIT_COMMITTER_NAME="{nuovo_nome}"
export GIT_COMMITTER_EMAIL="{nuova_email}"
fi
if [ "$GIT_AUTHOR_NAME" != "{nuovo_nome}" ] || [ "$GIT_AUTHOR_EMAIL" != "{nuova_email}" ]; then
export GIT_AUTHOR_NAME="{nuovo_nome}"
export GIT_AUTHOR_EMAIL="{nuova_email}"
fi
' --tag-name-filter cat -- --all
'''
# Esegui il comando
subprocess.run(comando, shell=True, check=True)
print("✅ Commit riscritti con autore aggiornato.")
# Push forzato
print("🚀 Eseguo push --force su tutti i branch...")
subprocess.run("git push --force --tags", shell=True, check=True)
print("🎉 Operazione completata con successo!")
# === ESECUZIONE ===
riscrivi_autori(repo_path, nuovo_nome, nuova_email)