Python-it.org forum # share your knowledge! ;)
Settembre 08, 2010, 21:36 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizie: Novità: traduzione del blog "The History of Python" di Guido van Rossum: http://www.python-it.org/10/06/23/novit%C3%A0-traduzione-del-blog-the-history-python-di-guido-van-rossum
 
   Home   Guida Regolamento Ricerca Accedi Registrati Python-it.org Doc Chat  
Apri il forum in una pagina a parte - È possibile fornire/richiedere supporto anche presso i canali IRC #python su Azzurra e #python.it su Freenode

Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: timer in gui  (Letto 110 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
nkint
python erectus
***

Livello reputazione: 0
nkint non ha alcuna influenza
Scollegato Scollegato

Messaggi: 177


Mostra profilo
« inserito:: Luglio 29, 2010, 12:27 »

ciao a tutti
stavo leggendo il modulo signal,
ho fatto una ricerca nel forum
e sono arrivato a questo tread:
http://www.python-it.org/forum/index.php?topic=2364.msg19982#msg19982

e allora ho ben penato di provare a farlo con una minima interfaccia grafica, cosa da mezzo minuto

però nn funziona..
cose strane:
se clicco 1 volta mi appare il print starttimer
la seconda volta il timer si incrementa
la terza pure
.. la quarta non va più e se continuo a cliccare rimane solo il print starttimer..

qualche dritta?


import sys
from PyQt4 import QtGui, QtCore
import signal

class QTimer(QtGui.QMainWindow):
def __init__(self, period=1):
self._initgui()
self.period = period
self.count = 0
signal.signal(signal.SIGALRM, self.updatelabel)

def _initgui(self):
QtGui.QMainWindow.__init__(self)

self.resize(350, 250)
self.setWindowTitle("Timer")

body = QtGui.QWidget(self)

self.hbox = QtGui.QHBoxLayout()
self.hbox.setSpacing(5)
body.setLayout(self.hbox)
self.setCentralWidget(body)

self._addgui()

def _addgui(self):

start = QtGui.QPushButton("start")
self.connect(start, QtCore.SIGNAL("clicked()"), self.starttimer)
self.hbox.addWidget(start)

self.timerlabel = QtGui.QLabel("0")
self.hbox.addWidget(self.timerlabel)

def starttimer(self):
print("starttimer")
signal.signal(signal.SIGALRM, self.updatelabel)
signal.alarm(1)

def updatelabel(self, a, b):
self.count += 1
print("updatelabel",self.count)
self.timerlabel.setText(str(self.count))
signal.alarm(1)


app = QtGui.QApplication(sys.argv)
main = QTimer()
main.show()
sys.exit(app.exec_())
Registrato
Python-it.org forum
« inserito:: Luglio 29, 2010, 12:27 »

 Registrato
nkint
python erectus
***

Livello reputazione: 0
nkint non ha alcuna influenza
Scollegato Scollegato

Messaggi: 177


Mostra profilo
« Risposta #1 inserito:: Luglio 29, 2010, 13:06 »

beh in ogni caso sto provando a farlo con i thread, in particolare
ho trovato questa classe postata da riko
http://www.python-it.org/forum/index.php?topic=4194.0 (il link è nell'ultimo thread)

e ok, tutto a posto, la situazione funziona, c'è un pulsante per l'avvio e uno per lo stop del timer.
in realtà usare i thread senza saperli usare non penso sia una soluzione felice.. : p

ora ho un altro problema: se l'utente è sbadato, avvia il timer e poi chiude la finestra senza stopparlo..
il thread rimane in running.. come triggero l'evento quit di QMainWindow per fare close al thread?
pensavo bastasse fare overriding di close() ma non è così.-.
Registrato
Python
python sapiens
*****

Livello reputazione: 0
Python non ha alcuna influenza
Scollegato Scollegato

Messaggi: 894


Mostra profilo
« Risposta #2 inserito:: Luglio 29, 2010, 13:27 »

ora ho un altro problema: se l'utente è sbadato, avvia il timer e poi chiude la finestra senza stopparlo..
il thread rimane in running.. come triggero l'evento quit di QMainWindow per fare close al thread?
pensavo bastasse fare overriding di close() ma non è così.-.

Se ho capito bene basta reimplementare nella tua classe il metodo closeEvent(self, event). Poi puoi fare una cosa così:
def closeEvent(self, event):
    self.stoppaThread()   ### Tua funzione
    event.accept() ## Se vuoi uscire, altrimenti event.ignore()
Registrato


nkint
python erectus
***

Livello reputazione: 0
nkint non ha alcuna influenza
Scollegato Scollegato

Messaggi: 177


Mostra profilo
« Risposta #3 inserito:: Luglio 29, 2010, 13:58 »

si perfetto grazie mille..

rimane da capire perchè signal non sono riuscito a farlo andare : (
Registrato
riko
moderatore
python sapiens sapiens
*

Livello reputazione: 0
riko non ha alcuna influenza
Scollegato Scollegato

Messaggi: 2257



Mostra profilo WWW
« Risposta #4 inserito:: Luglio 29, 2010, 14:12 »

Io non mischierei troppo la roba POSIX con Qt senza avere capito in dettaglio come interagiscono.
Perche' non usi segnali Qt per fare sta fola?
Registrato

nkint
python erectus
***

Livello reputazione: 0
nkint non ha alcuna influenza
Scollegato Scollegato

Messaggi: 177


Mostra profilo
« Risposta #5 inserito:: Luglio 29, 2010, 14:32 »

ah.
esiste QtCore.QTimer
.. meglio che mi studi un po' le qt prima di perdermi in un bicchier d'acqua.. : p

insomma,
import sys
from PyQt4 import QtGui, QtCore


def timeformat(second):
s = second%60
m = (second/60)%60
h = int(second/(60*60))
return "time %02d:%02d:%02d" % (h,m,s)


class SimpleTimer(QtGui.QMainWindow):
def __init__(self):
self._initgui()
self.count = 0
self.clock = QtCore.QTimer(self)
self.clock.setInterval(1000)
self.connect(self.clock, QtCore.SIGNAL("timeout()"), self.tick)

def closeEvent(self, event):
self.stop()
event.accept()

def _initgui(self):
QtGui.QMainWindow.__init__(self)

self.resize(350, 100)
self.setWindowTitle("Timer")

body = QtGui.QWidget(self)

self.box = QtGui.QVBoxLayout()
self.box.setSpacing(5)
body.setLayout(self.box)
self.setCentralWidget(body)

self._addgui()

def _addgui(self):
start = QtGui.QPushButton("start")
self.connect(start, QtCore.SIGNAL("clicked()"), self.start)
self.box.addWidget(start)

stop = QtGui.QPushButton("stop")
self.connect(stop, QtCore.SIGNAL("clicked()"), self.stop)
self.box.addWidget(stop)

self.timerlabel = QtGui.QLabel(timeformat(0))
self.box.addWidget(self.timerlabel)

def start(self):
print("start")
self.count = 0
self.timerlabel.setText(timeformat(0))
self.clock.start()

def stop(self):
self.clock.stop()

def tick(self):
self.count += 1
self.timerlabel.setText(timeformat(self.count))

app = QtGui.QApplication(sys.argv)
main = SimpleTimer()
main.show()
sys.exit(app.exec_())


commenti? aggiunte modifiche correzioni finezze?
Registrato
riko
moderatore
python sapiens sapiens
*

Livello reputazione: 0
riko non ha alcuna influenza
Scollegato Scollegato

Messaggi: 2257



Mostra profilo WWW
« Risposta #6 inserito:: Luglio 29, 2010, 15:47 »

No, perche'! Funziona, funziona bene... direi che basta.

Tra l'altro non avendo installato Qt non potrei nemmeno provarlo, ergo...
Registrato

nkint
python erectus
***

Livello reputazione: 0
nkint non ha alcuna influenza
Scollegato Scollegato

Messaggi: 177


Mostra profilo
« Risposta #7 inserito:: Luglio 29, 2010, 16:15 »

non hai installato le qt?!?
pensavo tu fossi, fra le tante cose, un qtboy : )
dai, passo ad altro allora, grazie!
Registrato
riko
moderatore
python sapiens sapiens
*

Livello reputazione: 0
riko non ha alcuna influenza
Scollegato Scollegato

Messaggi: 2257



Mostra profilo WWW
« Risposta #8 inserito:: Luglio 29, 2010, 17:50 »

non hai installato le qt?!?
pensavo tu fossi, fra le tante cose, un qtboy : )
dai, passo ad altro allora, grazie!

Si, mi piacciono molto. Normalmente userei quelle. Ma normalmente sono su OS X e non faccio apps desktop.
Ergo, non credo di avere installato su questa macchina. Magari su un'altra si... tipo sul netbook e' probabile
di si.
Registrato

Bakuriu
python sapiens sapiens
******

Livello reputazione: 0
Bakuriu non ha alcuna influenza
Scollegato Scollegato

Messaggi: 1280

Katon, Goukakyuu no jutsu!


Mostra profilo
« Risposta #9 inserito:: Luglio 30, 2010, 09:57 »

Una delle cose più positive delle Qt sono la gestione signal & slot, quindi è inutile cercare di reinventare la ruota tramite il modulo signal.
Comunque penso che usando QTimer sia inutile stopparlo nel closeEvent...dovrebbe essere distrutto automaticamente.
Registrato

Citazione
Atlantide è sprofondata nell'oceano quando Chuck Norris rispose:"solo 5" alla domanda "Quanti sono i continenti?"
Python-it.org forum
   

 Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC XHTML 1.0 valido! CSS valido!