QTimer/Python: считать секунды от начала до конца

В моем пользовательском интерфейсе (Qt Designer) есть кнопка «Пуск», кнопка «Стоп» и lcdNumber, который должен отображать секунды между нажатием «Пуск» и «Стоп». Я следовал приведенным там инструкциям: Похоже, не удается получить обратный отсчет pyqt таймер на работу

Но мой timeout не работает, хотя connect было предложено мне при написании этой строки: QtCore.QTimer.timeout.connect(self.tick_timer) AttributeError: объект «PyQt4.QtCore.pyqtSignal» не имеет атрибута «connect»

Я также пытался реализовать такие строки (QtCore.QTimer.connect(QtCore.QTimer(), QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("func()"))) в моей функции update_timer, но это вызывает ошибки (Object::connect: Нет такого слота MainWindow::func() Object::connect: (имя получателя: 'MainWindow')) и Я действительно не понимаю, как использовать сигнал соединения с тайм-аутом.

Если я прокомментирую эту строку «timeout», появится MainWindow, но нажатие кнопки «Start», очевидно, запустит функцию «tick_timer» только один раз, потому что ЖК-дисплей показывает 0:01.

Спасибо за вашу помощь!

from PyQt4 import QtCore, QtGui, uic

class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi('MainWindow.ui', self)
        # Buttons
        self.QStartButton.clicked.connect(self.start_timer)
        self.QStopButton.clicked.connect(self.stop_timer)
        # Timer
        QtCore.QTimer.timeout.connect(self.tick_timer)

    def start_timer(self):
        self.now = 0
        self.tick_timer()
        QtCore.QTimer.start

    def update_timer(self):
        self.runtime = "%d:%02d" % (self.now/60,self.now % 60)
        self.lcdNumber.display(self.runtime)

    def tick_timer(self):
        self.now += 1
        self.update_timer()

    def stop_timer(self):
        QtCore.QTimer.stop

person C.L.    schedule 23.05.2016    source источник


Ответы (3)


вам нужно иметь QTimer как переменную-член...

вместо QtCore.QTimer.start(stop|timeout) должно быть self.timer. ...

образец:

self.timer = QtCore.QTimer()
self.timer.start()
self.timer.stop()
person Zaiborg    schedule 23.05.2016
comment
Мне нужно вставлять self.timer = QtCore.QTimer() в каждую функцию или только в одну из них? На данный момент эта строка находится только в функции start_timer, и другие функции жалуются на это: AttributeError: объект «MainWindow» не имеет атрибута «таймер» - person C.L.; 23.05.2016

Обновление: теперь счетчик в основном работает, к сожалению, «секунды» таймера слишком короткие. Любые предложения, как это исправить?

Даже self.timer = QtCore.QTimer() теперь работает в функции start_timer, без self.timer.timeout.connect(self.tick_timer) - нет.

Спасибо за вашу помощь!

from PyQt4 import QtCore, QtGui, uic

class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi('MainWindow.ui', self)
        # Buttons
        self.QStartButton.clicked.connect(self.start_timer)
        self.QStopButton.clicked.connect(self.stop_timer)

    def start_timer(self):
        # Initialize timer
        self.timer = QtCore.QTimer()
        self.now = 0
        self.timer.timeout.connect(self.tick_timer)
        # Start timer and update display
        self.timer.start()
        self.update_timer()


    def update_timer(self):
        self.runtime = "%d:%02d" % (self.now/60,self.now % 60)
        self.lcdNumber.display(self.runtime)

    def tick_timer(self):
        self.now += 1
        self.update_timer()

    def stop_timer(self):
        self.timer.stop
person C.L.    schedule 23.05.2016

Обновление: «секунды» теперь соответствуют реальным секундам, мне пришлось определить, что «тик» должен происходить каждые 1000 мс: self.timer.start(1000)

from PyQt4 import QtCore, QtGui, uic

class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi('MainWindow.ui', self)
        # Buttons
        self.QStartButton.clicked.connect(self.start_timer)
        self.QStopButton.clicked.connect(self.stop_timer)

    def start_timer(self):
        # Initialize timer
        self.timer = QtCore.QTimer()
        self.now = 0
        # Update display and start timer
        self.update_timer()
        self.timer.timeout.connect(self.tick_timer)
        self.timer.start(1000) # Duration of one second = 1000 msec

    def update_timer(self):
        self.runtime = "%d:%02d" % (self.now/60,self.now % 60)
        self.lcdNumber.display(self.runtime)

    def tick_timer(self):
        self.now += 1
        self.update_timer()

    def stop_timer(self):
        self.timer.stop
person C.L.    schedule 25.05.2016