Home > PyQt5, python > PyQt5: QTime

PyQt5: QTime

8 Aprile 2019

Torna all’indice degli appunti

QTime

QTime è una classe che mette a disposizione un set di metodi per la gestione dell’orario.
Oltre alla creazione di oggetti QTime è possibile effettuare comparazioni tra essi.
La creazione di un oggetto QTime può avvenire, sia passando esplicitamente al costruttore, ore, minuti, secondi e millisecondi, sia utilizzando lo static-method currenTime, che ritorna l’ora corrente di sistema:

>>> from PyQt5.QtCore import QTime
>>> QTime.currentTime()
PyQt5.QtCore.QTime(9, 7, 38, 84)
>>> QTime(9, 8, 0, 0)
PyQt5.QtCore.QTime(9, 8)

I metodi per ottenere i valori dell’oggetto QTime sono hour, minute, second, msec:

>>> ct = QTime.currentTime()
>>> ct.hour()
9
>>> ct.minute()
12
>>> ct.second()
11
>>> ct.msec()
592

Per modificare manualmente l’orario, dopo la creazione dell’oggetto QTime, è possibile utilizzare il metodo setHMS(hours, minutes, seconds, milliseconds):

ct.setHMS(1, 1, 50, 50)
True
>>> ct.hour()
1

Con i due metodi addSecs(int), addMSecs(int) è possibile incrementare l’orario della quantità desiderata di secondi e/o msec:

>>> ct.addSecs(20)
PyQt5.QtCore.QTime(1, 2, 10, 50)

Come per l’ggetto QDate, l’utilizzo di questi metodi, non modifica l’oggetto corrente, ma ne ritorna un altro. Per la modifica si utilizza il metodo setHMS(hours, minutes, seconds, milliseconds).

>>> new_time = ct.addMSecs(4500)
>>> new_time
PyQt5.QtCore.QTime(1, 1, 54, 550)

Quando si hanno 2 o più oggetti QTime, è possibile sapere quanti secondi o msec di differenza ci sono tra i due orari, con i metodi secsTo(time) e mSecsTo(time):

>>> ct.secsTo(new_time)
4
>>> ct.msecsTo(new_time)
4500

CONFRONTI

I confronti tra date vengono effettuati con i comuni operatori:

>>> ct < new_time
True

CRONOMETRO

E’ possibile utilizzare l’oggetto QTime anche per cronometrare i millisecondi passati da un determinato evento.
I metodi utilizzabili sono:
start: avvia il cronometro;
restart: resetta il cronometro, ritornando i msec passati dal precedente avvio (start);
elapsed: ritorna i msec passati dall’ avvio (start);

>>> start_time = QTime.currentTime()
>>> start_time.start()
>>> start_time.elapsed()
14383
>>> start_time.restart()
23415
>>> start_time.elapsed()
8955

CONVERSIONE DA TIME A STRINGA

E’ possibile convertire un oggetto QTime in formato stringa con il metodo toString(format) dove format rappresenta il tipo di formato utilizzato per la conversione.
format può assumere i seguenti patterns:

h l’ora rappresentata senza il leading zero (0-23 o 1-12 con am/pm attivo);
hh l’ora rappresentata con il leading zero (01-23 o 01-12 con am/pm attivo);
H l’ora rappresentata senza il leading zero (0-23 anche con am/pm attivo);
HH l’ora rappresentata con il leading zero (01-23 anche con am/pm attivo);
m il minuto rappresentato senza il leading zero (0-59);
mm il minuto rappresentato con il leading zero (00-59);
s i secondi rappresentati senza il leading zero (0-59);
ss i secondi rappresentati con il leading zero (00-59);
z i millisecondi rappresentati senza il trailing zero(0-999);
zzz i millisecondi rappresentati con il trailing zero(000-999);
AP visualizza in modalità AM/PM;
ap visualizza in modalità AM/PM, ma in minuscolo;
t visualizza il time-zone (es ‘CEST’);

>>> ct = QTime.currentTime()
>>> ct.toString("h")
'10'
>>> format = "hh:mm:ss.zzz A t"
>>> ct.toString(format)
'10:27:30.689  ora legale Europa occidentale'

CONVERSIONE DA STRINGA A TIME

Inversamente della situazione precedente, è possibile convertire una stringa in oggetto QTime, con il metodo fromString(string, format), dove string è la stringa dell’orario e format il tipo di formato utilizzato per la conversione.

>>> s_time = '11:28:31.100'
>>> format = "hh:mm:ss.zzz"
>>> new_time = QTime.fromString(s_time, format)
>>> new_time
PyQt5.QtCore.QTime(11, 28, 31, 100)
TIME WIDGET QTIMEEDIT

Il widget utilizzato per gestire l’orario è QTimeEdit.
I metodi di QTimeEdit sono i seguenti:

time(): ottiene l’orario mostrato nel widget;
setMinimumTime(QTime): definisce il valore minimo dell’orario definibile dall’utente;
setMaximumTime(QTime): definisce il valore massimo dell’orario definibile dall’utente;
minimumTime: ottiene il valore minimo impostato per il widget;
maximumTime: ottiene il valore massimo impostato per il widget;
setDisplayFormat(format): definisce il formato dell’orario utilizzato dal widget;
displayFormat: ottiene il formato dell’orario utilizzato dal widget;

from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QTimeEdit
from PyQt5.QtCore import QTime
from PyQt5.QtWidgets import QMainWindow
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QTime Example")
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)
        self.resize(200, 75)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        time_edit = QTimeEdit(QTime.currentTime())
        layout.addWidget(time_edit, 0)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Con i metodi visti precedentemente possiamo affinare la visualizzazione ed il campo di utilizzo.
Usiamo il format degli esempi precedenti e limitiamo la modifica dalle 8 alle 17:

...
        time_edit = QTimeEdit(QTime.currentTime())
        time_edit.setMinimumTime(QTime(8, 00, 00))
        time_edit.setMaximumTime(QTime(17, 0, 0))
        time_edit.setDisplayFormat("hh:mm:ss.zzz")
...

SEGNALI

Il segnale degno di nota, oltre a quelli soliti ereditati, è timeChanged, emesso ad ogni modifica dell’orario, da parte dell’utente, che sia un o un click sulle freccette del widget:

...
        time_edit.timeChanged.connect(self.on_time_changed)

    def on_time_changed(self):
        time_editor = self.sender()
        format = time_editor.displayFormat()
        newtime = time_editor.time().toString(format)
        print("[SIG] Time has changed to %s" % newtime)
        print("      Minimum time set: %s" % time_editor.minimumTime())
        print("      Maximum time set: %s" % time_editor.maximumTime())
        print("      time format is  : %s" % format)
...

Nota:
l’utilizzo di sender() è solo didattico per capire da chi arriva il segnale,
rendendo time_edit attributo dell’istanza di QWidget (self.time_edit) in fase di inizializzazione,
evita l’utilizzo del metodo sender di QWidget.

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.