Задать вопрос

Управления временем в Python?

Помогите начинающему. как сделать, что бы определенная операция повторялась через определенное количество секунд и при этом можно было делать другие операции например если есть статусбар и через каждую секунду пропадал 1%, а с каждым нажатием кнопки добавлялось 2%. я пробовал через sleep, но вы сами понимаете. по идее все время убавления должно идти автоматом, а прибавления при нажатии кнопки. вышло что-то типа
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore
class Rybalka(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setGeometry(200, 200, 400, 450)
        self.setWindowTitle('')
        self.hp = 10
        self.start = QtGui.QPushButton('Start', self)
        self.start.setGeometry(290, 280, 100, 40)
        self.connect(self.start,QtCore.SIGNAL("clicked()"),self.Timed)
        self.video = QtGui.QPushButton('++', self)
        self.video.setGeometry(10, 80, 100, 40)
        self.connect(self.video,QtCore.SIGNAL("clicked()"),self.Videod)
        self.follow = QtGui.QProgressBar(self)
        self.follow.setGeometry(10,20,370,30)
        self.follow.setMaximum(100)
        self.follow.setMinimum(0)
        self.follow.setValue(self.hp)
    def Timed(self):
        while True: 
            time.sleep(3)
            self.hp -=1
            self.follow.setValue(self.hp)
            if (self.hp < 0):
                break
    def Videod(self):
        self.hp +=2
        self.follow.setValue(self.hp)
app = QtGui.QApplication(sys.argv)
icon = Rybalka()
icon.show()
app.exec_()
  • Вопрос задан
  • 2474 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
Avernial
@Avernial
Разрабатываю научное ПО на языке Python.
Как и сказал Sergey6661313 вам нужно использовать QTimer. Класс QTimer испускает сигнал timeout спустя заданное время.

Вот пример использования QTimer с QProgressBar. Таймер испускает сигнал timeout каждую секунду, по сигналу вызывается метод on_timer в котором происходит инкрементирование QProgressBar, после заполнения прогресса таймер останавливается.

from PyQt4 import QtGui
from PyQt4 import QtCore

class Widget(QtGui.QWidget):
    
    def __init__(self, parent=None):
        super(Widget, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        self.pb = QtGui.QProgressBar()
        self.pb.setMaximum(100)
        self.pb.setMinimum(0)
        self.pb.setValue(0)
        layout.addWidget(self.pb)
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.on_timer)
        self.timer.start(1000)

    def on_timer(self):
        current_value = self.pb.value() + 1
        self.pb.setValue(current_value)
        if current_value == 100:
            self.timer.stop()

if __name__ == '__main__':
    app = QtGui.QApplication([])
    w = Widget()
    w.show()
    app.exec()
Ответ написан
Комментировать
@Sergey6661313
в __init__:
self.timer = QtCore.QBasicTimer()
self.timer.start(1000, self) # 1000 - наша задержка (должна быть в миллисекундах помоему)

и определите метод:
def timerEvent(self, event)
self.follow.setValue(self.follow.value() - 1)

и да переменная hp не нужна. follow уже содержит переменную доступ к которой осуществляется через value() и setValue(), поэтому плодить сущности незачем.

В кратце QBasicTimer это что-то вроде Qthread котороый каждые обозначенные миллисекунды вызывает событие timerEvent обозначенного обьекта.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
У вас программа работает в один поток. А вам нужно использовать или треды или какой асинхронный фреймворк. Так как используете QT, то в нем наверняка есть функции для таймеров, туда и смотрите.
import sys

from PyQt4.QtCore import QTimer
from PyQt4.QtGui import QApplication

app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)

def tick():
    print 'tick'

timer = QTimer()
timer.timeout.connect(tick)
timer.start(1000)

# run event loop so python doesn't exit
app.exec_()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы