In questi giorni in cui è altamente consigliabile non uscire di casa se non per necessità ho cercato un passatempo stimolante. Dopo aver creato qualche programmino in python per uso personale (usando sia le gtk3 che tkinter che le qt5) mi è venuto in mente di esplorare il funzionamento di una gui. Io non sono un programmatore, è solo un hobby, e so che il sito è frequentato da programmatori di professione. Però a qualcuno dovevo dirlo :) .
Se poi il post non è pertinente alla sezione potete anche cancellarlo.
All'inizio è stato un po' difficile partire col progetto dato che, sebbene conosca le basi basi della programmazione, non so tutto il resto. Poi ho deciso di usare OpenGL per la parte grafica. Perchè OpenGL: ho visto un po' in giro ed è l'unica libreria che non ne richiede altre (sebbene poi abbia usato PIL per le immagini, e poi userò freetype le i font).
Questo è il codice che crea la finestra (allego l'immagine):
Ho creato solo tre widget per il momento:
- label
- immagine
- pulsante.
Ognuno di questi ha delle opzioni, come scelta dei colori, e la possibilità di essere collegati a eventi (per ora solo usando il pulsante sinistro del mouse). Esiste anche un altro widget chiamato application, ma è più che altro un contenitore che gestisce sia i widget che il loro posizionamento. Infatti ho pensato di gestire il posizionamento dei widget non tramite i soliti contenitori, chiamati generalmente box, ma tramite proprietà dei widget.
Il codice una volta eseguito fa apparire la finestra visibile nello screenshot. In sottofondo qualche messaggio generato quando ho premuto (e tenuto premuto) il pulsante superiore.
In alto abbiamo un label con background bianco. Sto usando il font che OpenGL possiede.
In basso viene visualizzata una immagine in formato rgba.
Poi al centro abbiamo due pulsanti, uno senza icona. Il widget pulsante utilizza gli stessi widget label e immagine, è in definitiva composito.
Il pulsante premuto ora di colore viola è collegato a una funzione che stampa la stringa ' **fbutton** hi 5 ' come si vede nel terminale. Commentata è invece la procedura per disconnettere il widget dall'evento.
Nel programma principale i widget vengono definiti con delle proprietà ma solo nel modulo application vengono creati e gestiti.
Per il momento i widget sono in posizione fissa, e lì rimangono quando ridimensiono la finestra.
Per concludere, molte proprietà dei widget hanno dei valori predefiniti ed è per questo che non vengono inizializzate.
Aggiornamento:
Termino il mio esperimento con python+opengl mentre stavo codificando i box (che non erano nel mio programma una entità differente in quando ogni widget possedeva una opzione su come comportarsi quando la finestra del programma cambiava di dimensione). Il motivo è che in certi punti del programma se indento ulteriormente con spazi o tab il programma non se ne accorge ma noto degli errori visivi. Pazienza, comunque ho ottenuto ciò che volevo anche se parzialmente. Non ho usato thread.
Se poi il post non è pertinente alla sezione potete anche cancellarlo.
All'inizio è stato un po' difficile partire col progetto dato che, sebbene conosca le basi basi della programmazione, non so tutto il resto. Poi ho deciso di usare OpenGL per la parte grafica. Perchè OpenGL: ho visto un po' in giro ed è l'unica libreria che non ne richiede altre (sebbene poi abbia usato PIL per le immagini, e poi userò freetype le i font).
Questo è il codice che crea la finestra (allego l'immagine):
Python:
from widgets.application import App
####### CODE
class main():
def __init__(self, app):
self.app = app
#### the label widget
label1 = {"widget":"olabel", "x":0, "y":0, "text":"1cjao", "fontsize":30, "BR":1, "BG":1, "BB":1}
## the label is added to the program
self.app.addWidget(label1)
#### button
button1 = {"widget":"obutton", "x":100, "y":350, "w":250, "h":60, "text":"2cjao", "fontsize":30, "image":"folder.png", "imagepad":3}
self.app.addWidget(button1)
#### button
button2 = {"widget":"obutton", "x":100, "y":300, "w":250, "h":50, "text":"3cjao", "fontsize":30}
self.app.addWidget(button2)
# etablish a connection
id = self.app.connect(button2, lambda:self.fbutton("hi", 5))
# remove a connection
#self.app.disconnect(button2, id)
#### image
image1 = {"widget":"oimage", "x":0, "y":550, "w":50, "state":0, "image":"folder.png"}
self.app.addWidget(image1)
#
def fbutton(self, t, x):
print("**fbutton**", t, x)
####
app = App(width=600,height=600,title="Prova")
main(app)
app.run()
#######################
Ho creato solo tre widget per il momento:
- label
- immagine
- pulsante.
Ognuno di questi ha delle opzioni, come scelta dei colori, e la possibilità di essere collegati a eventi (per ora solo usando il pulsante sinistro del mouse). Esiste anche un altro widget chiamato application, ma è più che altro un contenitore che gestisce sia i widget che il loro posizionamento. Infatti ho pensato di gestire il posizionamento dei widget non tramite i soliti contenitori, chiamati generalmente box, ma tramite proprietà dei widget.
Il codice una volta eseguito fa apparire la finestra visibile nello screenshot. In sottofondo qualche messaggio generato quando ho premuto (e tenuto premuto) il pulsante superiore.
In alto abbiamo un label con background bianco. Sto usando il font che OpenGL possiede.
In basso viene visualizzata una immagine in formato rgba.
Poi al centro abbiamo due pulsanti, uno senza icona. Il widget pulsante utilizza gli stessi widget label e immagine, è in definitiva composito.
Il pulsante premuto ora di colore viola è collegato a una funzione che stampa la stringa ' **fbutton** hi 5 ' come si vede nel terminale. Commentata è invece la procedura per disconnettere il widget dall'evento.
Nel programma principale i widget vengono definiti con delle proprietà ma solo nel modulo application vengono creati e gestiti.
Per il momento i widget sono in posizione fissa, e lì rimangono quando ridimensiono la finestra.
Per concludere, molte proprietà dei widget hanno dei valori predefiniti ed è per questo che non vengono inizializzate.
Aggiornamento:
Termino il mio esperimento con python+opengl mentre stavo codificando i box (che non erano nel mio programma una entità differente in quando ogni widget possedeva una opzione su come comportarsi quando la finestra del programma cambiava di dimensione). Il motivo è che in certi punti del programma se indento ulteriormente con spazi o tab il programma non se ne accorge ma noto degli errori visivi. Pazienza, comunque ho ottenuto ciò che volevo anche se parzialmente. Non ho usato thread.
Ultima modifica: