Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-04-2010, 15:31   #1
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
[python] Problema generico con interfacce grafiche

Ciao.

Ho un problema generico con un interfaccia grafica e python. In realtà il problema non è inerente ad una specifica libreria grafica...

Comunque... In pratica ho una interfaccina con un pulsante e una casella di testo.

Voglio che quando l'utente spinga un pulsante nella casellina ogni 1 secondo compaia un numero particolare.

Così ho "collegato" il bottone ad una funzione. Il problema è che la finestra si blocca... In pratica il programmino è fatto così

Codice:
while(True):
     time.sleep(1)
     caselladitesto.scrivitesto(testo)
Quello è praticamente la funzione che scrive il testo... Come mai però si blocca?

Se invece del while metto un caselladitesto.scrivitesto(testo) e basta si aggiorna... Come mai se metto il while si blocca la finestra?

Grazie a tutti
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2010, 21:38   #2
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Almeno dicci che interfaccia grafica usi. Posta tutto il codice poi, cosi come ti aiutiamo?
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 00:05   #3
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Probabilmente la funzione termina così rapidamente che ricominci subito il ciclo ed entri nella sleep(), al che il tuo processo viene messo nello stato blocked dal tuo sistema operativo... Penso non abbia nemmeno il tempo di ridisegnare l'interfaccia che rimane lì fermo e ti sembra bloccato anche se in realtà non lo è.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 00:07   #4
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Solitamente questi problemi sono dovuti alle varie GUI, alcuni li hanno, altri no. Quel codice vorrei capire in quale contesto è scritto e che framework grafico usa.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 00:16   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Ryuzaki_Eru Guarda i messaggi
Solitamente questi problemi sono dovuti alle varie GUI, alcuni li hanno, altri no. Quel codice vorrei capire in quale contesto è scritto e che framework grafico usa.
Difficile, se il processo è bloccato in una sleep() lo è anche la GUI. A meno che non sia multithreaded.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 08:31   #6
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Serve un oggetto timer (del modulo threading):
Codice:
15.3.7 Timer Objects 
This class represents an action that should be run only after a certain amount of time has passed -- a timer. Timer is a subclass of Thread and as such also functions as an example of creating custom threads. 

Timers are started, as with threads, by calling their start() method. The timer can be stopped (before its action has begun) by calling the cancel() method. The interval the timer will wait before executing its action may not be exactly the same as the interval specified by the user. 

For example: 

def hello():
    print "hello, world"

t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed


class Timer( interval, function, args=[], kwargs={}) 

Create a timer that will run function with arguments args and keyword arguments kwargs, after interval seconds have passed. 

cancel( ) 

Stop the timer, and cancel the execution of the timer's action. This will only work if the timer is still in its waiting stage.
Ma, soprattutto, riscrivere il while così:
Codice:
while True:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 10:57   #7
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
ragazzi, vi ringrazio tutti per l'aiuto... Ora ho avuto un piccolo inconveniente... Risponderò a tutti questa sera...
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 11:59   #8
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Difficile, se il processo è bloccato in una sleep() lo è anche la GUI. A meno che non sia multithreaded.
Non sempre. Un esempio sono le PyGame che in questo caso non si bloccano e funzionano senza problemi. In altri casi, come le wx per esempio, allora serve un timer, come detto da cdimauro.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 12:05   #9
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Ryuzaki_Eru Guarda i messaggi
Non sempre. Un esempio sono le PyGame che in questo caso non si bloccano e funzionano senza problemi.
Mi puoi fare un esempio in codice? Non sono molto pratico di PyGame.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 12:42   #10
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Serve un oggetto timer (del modulo threading):
Codice:
15.3.7 Timer Objects 
This class represents an action that should be run only after a certain amount of time has passed -- a timer. Timer is a subclass of Thread and as such also functions as an example of creating custom threads. 

Timers are started, as with threads, by calling their start() method. The timer can be stopped (before its action has begun) by calling the cancel() method. The interval the timer will wait before executing its action may not be exactly the same as the interval specified by the user. 

For example: 

def hello():
    print "hello, world"

t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed


class Timer( interval, function, args=[], kwargs={}) 

Create a timer that will run function with arguments args and keyword arguments kwargs, after interval seconds have passed. 

cancel( ) 

Stop the timer, and cancel the execution of the timer's action. This will only work if the timer is still in its waiting stage.
Ma, soprattutto, riscrivere il while così:
Codice:
while True:
questa dei timer è proprio quello che mi serviva... C'è però modo di fare si che si vada avanti all'infinito?
Cioè nel mio programma io vorrei che una certa funzione sia chiamata ogni 10 secondi... Ma per sempre.... Ho visto che usando il timer che consigli la funzione è chiamata una volta sola.
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 13:02   #11
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Mi puoi fare un esempio in codice? Non sono molto pratico di PyGame.
Sto andando in mensa adesso, comunque in qualunque tutorial di PyGame fanno vedere il ciclo principale che interagisce sempre con i componenti del framework, del gioco e quant'altro. E nel 90% dei casi viene usato un semplice sleep().
Quote:
questa dei timer è proprio quello che mi serviva... C'è però modo di fare si che si vada avanti all'infinito?
Cioè nel mio programma io vorrei che una certa funzione sia chiamata ogni 10 secondi... Ma per sempre.... Ho visto che usando il timer che consigli la funzione è chiamata una volta sola.
Il timer lo hai messo dentro il while?
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 13:05   #12
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Ryuzaki_Eru Guarda i messaggi
Sto andando in mensa adesso, comunque in qualunque tutorial di PyGame fanno vedere il ciclo principale che interagisce sempre con i componenti del framework, del gioco e quant'altro. E nel 90% dei casi viene usato un semplice sleep().
Ma perché rispondi ad una code di eventi e poi chiedi di ridisegnare l'interfaccia? Perché se è così non c'è niente di strano, è una prassi normalissima.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 14:12   #13
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da giova22 Guarda i messaggi
questa dei timer è proprio quello che mi serviva... C'è però modo di fare si che si vada avanti all'infinito?
Cioè nel mio programma io vorrei che una certa funzione sia chiamata ogni 10 secondi... Ma per sempre.... Ho visto che usando il timer che consigli la funzione è chiamata una volta sola.
Basta che richiami t.start() da dentro la funzione di callback chiamata.

Al limite ti fai un thread con un while + sleep, e che ogni volta che si sveglia richiama la funzione di callback.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 15:41   #14
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Ma perché rispondi ad una code di eventi e poi chiedi di ridisegnare l'interfaccia? Perché se è così non c'è niente di strano, è una prassi normalissima.
Non solo quello. Comunque mi sa che stiamo parlando di due cose diverse. Torniamo sui binari: di cosa stai parlando tu?
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 16:36   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Sto parlando del fatto che se hai una GUI legata mani e piedi ad un processo, e tale processo va continuamente nella coda dei processi "blocked" senza prima ridisegnare l'interfaccia utente, allora ti capiteranno i casi in cui hai una finestra "bloccata", insensibile agli input o totalmente bianca (hai presente su Windows il caso in cui la finestra "non risponde"?).

Se con PyGame non succede vuole dire che direttamente o indirettamente stai chiedendo di ridisegnare l'interfaccia prima che finisca il tuo ciclo, e prima di rientrare nella fase di sleep().
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 17:27   #16
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Ahhhh, ora ho capito che vuoi dire. Allora si, è cosi come dici tu. Io avevo capito tutt'altro
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2010, 17:55   #17
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2010, 16:58   #18
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi

Se con PyGame non succede vuole dire che direttamente o indirettamente stai chiedendo di ridisegnare l'interfaccia prima che finisca il tuo ciclo, e prima di rientrare nella fase di sleep().
e c'è modo con le normali pyQT di chiedere di ridisegnare l'interfaccia?
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2010, 17:16   #19
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Puoi usare un thread "in background" che fa il lavoro, ed un thread principale (che è quello che crea e gestisce l'interfaccia) che raccoglie i dati ed aggiorna l'interfaccia di conseguenza.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2010, 22:47   #20
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Puoi usare un thread "in background" che fa il lavoro, ed un thread principale (che è quello che crea e gestisce l'interfaccia) che raccoglie i dati ed aggiorna l'interfaccia di conseguenza.
è quello che penso di avere fatto. Insomma... Ecco il codicillo (pseudocodice):

Codice:
#tutti i vari import

class GUI(QtGui.QWidget):
       def __init__(self, parent=None):
             QtGui.QWidget.__init__(self, parent)
             self.radiobutton = QtGui.QRadioButton(self)
             self.radiobutton.move(coordinata1, coordinata2)
             self.threadcheparte = calcolodati(self)
             while(True):
                       self.threadcheparte.start()
                       self.threadcheparte.wait()

class calcolodati(QtCore.QThread):
    def __init__(self,parent=None):
        QtCore.QThread.__init__(self,parent)

    def run(self):
             #calcoli matematici
            qb.radiobutton.setChecked(True)
             #semplice codice che va a calcolare dei valori numerici partendo dalla data, valore poi stampato in console con un print, codice omesso per semplicità, anche se è piuttosto lungo (circa 1/2 secondo di calcoli)
             qb.radiobutton.setChecked(False)
             #time.sleep(10)


app = QtGui.QApplication(sys.argv)
qb = GUI()
qb.show()
Praticamente si vede che il thread lanciato deve andare a abilitare il tondino nel radiobutton, fare dei conti e poi spegnerlo.
Praticamente accende correttamente il tondino nel radiobutton, ma non lo spegne nonostante sia specificato nell'ultima istruzinoe. Viene spento in realtà appena è richiamato il thread.... Perchè? Perchè non lo fa subito?

Se ad esempio dopo qb.radiobutton.setChecked(False) metto un time.sleep(10 secondi) il tondino si spegne poco dopo 10 secondi cioè quando è ricreato il thread e non prima come in realtà sarebbe corretto... Come mai ho questo comportamento? Da notare che tutto funziona bene in effetti
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
Obbligati ad acquistare una scheda madre...
GTA VI su PC? La data non c'è, ma...
Monopattini elettrici, a un anno dal dec...
Tesla Robotaxi, autista di sicurezza si ...
Samsung Galaxy S26: svelate le combinazi...
Microsoft Ignite: arriva Edge for Busine...
OPPO e Lamine Yamal uniscono sport e tec...
Microsoft, NVIDIA e Anthropic siglano un...
SpaceX potrebbe comunicare alla NASA rit...
Scoperte cavità sotterranee scava...
OnePlus anticipa l'arrivo di due nuovi p...
DJI lancia Osmo Action 6: la prima actio...
NASA: conferenza stampa sulla cometa int...
Ex CEO di TSMC passa a Intel: aperta un'...
Gigabyte X870E Aorus Elite X3D, una moth...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v