#!/usr/bin/python3 from PyQt5.QtCore import QTimer from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QHBoxLayout import sys class Nastav(QWidget): def __init__(self, *args, interval=None, **kwargs): # Inicializace QWidgetu samotného super().__init__(*args, **kwargs) # Intervalové nastavovátko self.label = QLabel(self) self.minusB = QPushButton(self, text="\u2212") self.minusB.clicked.connect(self.minus) self.plusB = QPushButton(self, text="+") self.plusB.clicked.connect(self.plus) # Umístění ovládacích prvků self.layout = QHBoxLayout(self) self.layout.addWidget(self.minusB) self.layout.addWidget(self.label) self.layout.addWidget(self.plusB) # Hodnota k nastavování self.interval = interval self.updateLabel() self.setLayout(self.layout) def plus(self): self.interval += 10 self.updateLabel() self.parent().updateInterval(self.interval) def minus(self): if (self.interval < 20): self.interval = 10 else: self.interval -= 10 self.updateLabel() self.parent().updateInterval(self.interval) def updateLabel(self): self.label.setText("%(kolik)d ms" % { "kolik": self.interval }) class Stopky(QWidget): def __init__(self, *args, **kwargs): # Inicializace QWidgetu samotného super().__init__(*args, **kwargs) # Interval je na začátku 1000 ms self.interval = 1000 # Výroba ovládacích prvků self.label = QLabel(self) self.button = QPushButton(self, text="start") self.button.clicked.connect(self.start) self.stopB = QPushButton(self, text="stop") self.stopB.clicked.connect(self.stop) self.nastav = Nastav(self, interval=self.interval) # Umístění ovládacích prvků self.layout = QVBoxLayout(self) self.layout.addWidget(self.label) self.layout.addWidget(self.button) self.layout.addWidget(self.stopB) self.layout.addWidget(self.nastav) # Připrav časovač self.timer = QTimer() self.timer.timeout.connect(self.tick) # Zobrazení stopek self.setLayout(self.layout) self.show() def start(self): # Zkopíruj interval self.interval = self.nastav.interval # Nastartuj časovač self.timer.start(self.interval) # Počáteční čas je nula self.elapsed = 0 self.updateLabel() def stop(self): # Zruš časovač self.timer.stop() def tick(self): # Uplynul další interval self.elapsed += self.interval self.interval = self.nastav.interval self.timer.start(self.interval) self.updateLabel() def updateInterval(self, interval): # Nastavujeme interval při zastavených stopkách if not self.timer.isActive(): return # Kolik uplynulo od posledního tiku tickElapsed = self.interval - self.timer.remainingTime() if tickElapsed < interval: # Ještě jsme neměli tiknout self.timer.start(interval - tickElapsed) self.interval = interval else: # Už jsme měli tiknout, tikneme hned self.interval = interval self.tick() # A příští tik bude o to dřív self.timer.start(2*interval - tickElapsed) def updateLabel(self): # Zobrazení uplynulého času (konverze na sekundy) self.label.setText("Uplynulo %(kolik).3f sekund." % { "kolik": self.elapsed / 1000.0 }) # Spuštění celého programu app = QApplication(sys.argv) stopky = Stopky() app.exec()