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