|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
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)
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 |
|
|
|
|
|
#2 |
|
Senior Member
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?
|
|
|
|
|
|
#3 |
|
Senior Member
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! |
|
|
|
|
|
#4 |
|
Senior Member
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.
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#6 |
|
Senior Member
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.
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 |
|
|
|
|
|
#7 |
|
Senior Member
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 |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
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.
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
|
Quote:
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 |
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Quote:
Quote:
|
||
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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! |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
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 |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Non solo quello. Comunque mi sa che stiamo parlando di due cose diverse. Torniamo sui binari: di cosa stai parlando tu?
|
|
|
|
|
|
#15 |
|
Senior Member
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! |
|
|
|
|
|
#16 |
|
Senior Member
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
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
|
e c'è modo con le normali pyQT di chiedere di ridisegnare l'interfaccia?
__________________
Ho fatto affati con.... troppi |
|
|
|
|
|
#19 |
|
Senior Member
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! |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
|
Quote:
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 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 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:20.




















