Как отобразить таймер с помощью PyQt5 для Python - PullRequest
2 голосов
/ 01 декабря 2019

Я создаю игру, в которой я хотел бы, чтобы таймер отображался на экране после того, как пользователь нажимает «НОВАЯ ИГРА», чтобы отслеживать, как долго они играют. У меня есть класс, который прекрасно запускает таймер, но когда я включаю его в оставшуюся часть моей игры, а затем поверх этого, пытаюсь отобразить обновленные значения таймера, никакие значения в пользовательском интерфейсе не обновляются и распечаткатаймера даже не происходит в терминале. Я попытался запустить таймер в том же потоке, что и процесс настройки игры, и я также попытался создать новый поток для запуска таймера, но ни один из них не работает. Игра загружается и функционирует нормально, за исключением того, что таймер не считает вверх и не отображает обновленные значения таймера. Где я ошибаюсь?

Вот мой автономный класс Timer, который, опять же, прекрасно работает сам по себе.

from PyQt5 import QtCore
import sys

def startThread(functionName, *args, **kwargs):
    print(args)
    if len(args) == 0:
        t = threading.Thread(target=functionName)
    else:
        try:
            t = threading.Thread(target=functionName, args=args, kwargs=kwargs)
        except:
            try:
                if args is None:
                    t = threading.Thread(target=functionName, kwargs=kwargs)
            except:
                t = threading.Thread(target=functionName)
    t.daemon = True
    t.start()

class Timer(object):

    def __init__(self):
        super(Timer, self).__init__()

    def start_timer(self):
        print("Starting timer...")
        Timer.timer = QtCore.QTimer()
        Timer.time = QtCore.QTime(0, 0, 0)
        Timer.timer.timeout.connect(self.tick)
        Timer.timer.start(1000)

    def tick(self):
        Timer.time = Timer.time.addSecs(1)
        self.update_UI('%s' % Timer.time.toString("hh:mm:ss"))

    def update_UI(self, text_string):
        print(text_string)
        # This is where the text would be sent to try and update the UI

Timer().start_timer()

Это более или менее, как структурирован мой класс настройки игры- в настоящее время я показываю версию, которая использует потоки:

class BuildUI(PyQt5.QtWidgets.QMainWindow, Ui_game):

    def __init__(self):
        super(BuildUI, self).__init__()
        self.setupUi(self)
        self.easy_mode = 38
        self.user_available_cells = []
        self.start_easy_game.triggered.connect(lambda: self.setup_game(self.easy_mode))

    def setup_game(self, hidden_count):
        def create_game_board():
            startThread(Timer().start_timer)
            self.game = BuildGame()
                    #The BuildGame class is not deliberately not shown

        startThread(create_game_board)

class GAME(object):
    def __init__(self):
        GAME.app = PyQt5.QtWidgets.QApplication(sys.argv)
        GAME.UI = BuildUI()
        GAME.UI.show()
        GAME.app.exec_()

def main():
    GAME()

if __name__ == '__main__':
    main()
...