Как сделать таймер в отдельном процессе?

Недавно начал изучать Python, изучаю ООП и потихоньку захотелось создавать небольшую игру, похожую на телефонную, но на пк. Да, выходит пока криво и не совсем удачно, но вроде что-то получается.

И вот встала проблема так, что я не понимаю как сделать время через отдельный поток. Смотрел как это реализовывается в книге "Python 3 и PyQt5" и на разных форумах, но всё равно не могу сделать второй процесс под своё приложение и туда поместить таймер/время.

введите сюда описание изображения

Как можно реализовать и вообще понять, как делать? Вот весь код без реализации таймера и скрин приложения. Надеюсь на вашу помощь:

from PyQt5 import QtWidgets, QtCore, QtGui
import title2, time, threading


class game(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = title2.Ui_Form()
        self.ui.setupUi(self)

        # Initialization time
        self.seconds = 0
        self.minutes = 0
        self.hours = 0

        # Var initialization
        self.balance_rub = 0
        self.balance_dol = 0

        # Var contribution initialization
        self.balance_contribution_rub = 0
        self.balance_contribution_dol = 0

        # Var bank initialization
        self.balance_bank_rub = 0
        self.balance_bank_dol = 0

        # Font initialization
        self.font = QtGui.QFont()
        self.font.setFamily("Consolas")
        self.font.setPointSize(18)

        # Button func
        self.ui.pushButton.clicked.connect(self.add_rub)
        self.ui.pushButton_2.clicked.connect(self.add_dol)
        self.ui.pushButton_3.clicked.connect(self.contribution_widget)
        self.ui.pushButton_4.clicked.connect(self.bank_widget)

    def add_rub(self):
        self.balance_rub += 100
        self.ui.label_3.pyqtConfigure(text=str(self.balance_rub))

    def add_dol(self):
        self.balance_dol += 100
        self.ui.label_4.pyqtConfigure(text=str(self.balance_dol))

    def contribution_widget(self):
        self.dialog = QtWidgets.QWidget()
        self.dialog.setWindowTitle("Клади деньги, чорт")
        self.dialog.resize(400, 250)
        self.label = QtWidgets.QLabel("<h3 align=\"center\">Введите сумму вклада</h2>")
        self.line_edit = QtWidgets.QLineEdit(self)
        self.radio_rub = QtWidgets.QRadioButton("Р")
        self.radio_dol = QtWidgets.QRadioButton("$")
        self.btn_cont = QtWidgets.QPushButton("Положить")
        self.btn_cont.setFont(self.font)
        self.label.setFont(self.font)
        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.vbox.addWidget(self.line_edit)
        self.vbox.addWidget(self.radio_rub)
        self.vbox.addWidget(self.radio_dol)
        self.vbox.addWidget(self.btn_cont)
        self.dialog.setLayout(self.vbox)
        self.btn_cont.clicked.connect(self.contribution)
        self.dialog.show()

    def contribution(self):
        if self.radio_rub.isChecked():
            if self.balance_rub >= int(self.line_edit.text()):
                self.balance_contribution_rub += int(self.line_edit.text())
                self.balance_rub -= int(self.line_edit.text())
                self.ui.label_3.pyqtConfigure(text=str(self.balance_rub))
                self.radio_rub.isHidden()
        elif self.radio_dol.isChecked():
            if self.balance_dol >= int(self.line_edit.text()):
                self.balance_contribution_dol += int(self.line_edit.text())
                self.balance_dol -= int(self.line_edit.text())
                self.ui.label_4.pyqtConfigure(text=str(self.balance_dol))

    def bank_widget(self):
        self.dialog_bank = QtWidgets.QWidget()
        self.dialog_bank.setWindowTitle("Бери деньги, ЧОРТ")
        self.dialog_bank.resize(400, 25)
        self.label_bank = QtWidgets.QLabel("<h3 align=\"center\">Введите сумму кредита</h2>")
        self.line_edit_bank = QtWidgets.QLineEdit(self)
        self.radio_rub_bank = QtWidgets.QRadioButton("Р")
        self.radio_dol_bank = QtWidgets.QRadioButton("$")
        self.btn_cont_bank = QtWidgets.QPushButton("Взять")
        self.v2box = QtWidgets.QVBoxLayout()
        self.v2box.addWidget(self.label_bank)
        self.v2box.addWidget(self.line_edit_bank)
        self.v2box.addWidget(self.radio_rub_bank)
        self.v2box.addWidget(self.radio_dol_bank)
        self.v2box.addWidget(self.btn_cont_bank)
        self.dialog_bank.setLayout(self.v2box)
        self.btn_cont_bank.clicked.connect(self.bank)
        self.dialog_bank.show()

    def bank(self):
        if self.radio_rub_bank.isChecked():
            self.balance_contribution_rub += int(self.line_edit_bank.text())
            self.balance_rub += int(self.line_edit_bank.text())
            self.ui.label_3.pyqtConfigure(text=str(self.balance_rub))
        elif self.radio_dol_bank.isChecked():
            self.balance_contribution_dol += int(self.line_edit_bank.text())
            self.balance_dol += int(self.line_edit_bank.text())
            self.ui.label_4.pyqtConfigure(text=str(self.balance_dol))







if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = game()
    window.setWindowTitle("Игра")
    window.show()
    sys.exit(app.exec_()) 

Модуль title2.py:


# Form implementation generated from reading ui file 'D:\Python\title2.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(917, 698)
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(14)
        Form.setFont(font)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(260, 240, 171, 51))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(260, 310, 171, 51))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(Form)
        self.pushButton_3.setGeometry(QtCore.QRect(10, 240, 241, 51))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(Form)
        self.pushButton_4.setGeometry(QtCore.QRect(10, 310, 241, 51))
        self.pushButton_4.setObjectName("pushButton_4")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(200, 20, 21, 31))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(200, 90, 21, 31))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(250, 10, 181, 51))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.line = QtWidgets.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(200, 70, 251, 16))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(250, 80, 181, 51))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(20, 50, 31, 41))
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(Form)
        self.label_6.setGeometry(QtCore.QRect(70, 50, 31, 41))
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(Form)
        self.label_7.setGeometry(QtCore.QRect(120, 50, 31, 41))
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(Form)
        self.label_8.setGeometry(QtCore.QRect(50, 60, 16, 21))
        self.label_8.setObjectName("label_8")
        self.label_9 = QtWidgets.QLabel(Form)
        self.label_9.setGeometry(QtCore.QRect(100, 60, 16, 21))
        self.label_9.setObjectName("label_9")
        self.pushButton_5 = QtWidgets.QPushButton(Form)
        self.pushButton_5.setGeometry(QtCore.QRect(80, 400, 151, 41))
        self.pushButton_5.setObjectName("pushButton_5")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "Добавить 100р"))
        self.pushButton_2.setText(_translate("Form", "Добавить 100$"))
        self.pushButton_3.setText(_translate("Form", "Положить деньги в банк"))
        self.pushButton_4.setText(_translate("Form", "Взять кредит"))
        self.label.setText(_translate("Form", "Р"))
        self.label_2.setText(_translate("Form", "$"))
        self.label_3.setText(_translate("Form", "<html><head/><body><p align=\"right\">0</p></body></html>"))
        self.label_4.setText(_translate("Form", "<html><head/><body><p align=\"right\">0</p></body></html>"))
        self.label_5.setText(_translate("Form", "10"))
        self.label_6.setText(_translate("Form", "0"))
        self.label_7.setText(_translate("Form", "0"))
        self.label_8.setText(_translate("Form", ":"))
        self.label_9.setText(_translate("Form", ":"))
        self.pushButton_5.setText(_translate("Form", "Time"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

не могу сделать второй процесс под своё приложение и туда поместить таймер/время.

Вам не нужно создавать второй процесс для этих целей.

Класс QTimer предоставляет повторяющиеся и одиночные таймеры. Подробно читаем здксь https://doc.qt.io/qt-5/qtimer.html#details

Я отметил места где внес изменения и дополнения.

#import time
#import threading
from PyQt5 import QtWidgets, QtCore, QtGui

#from title2 import Ui_Form
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
#        Form.resize(917, 698)
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(14)
        Form.setFont(font)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(260, 240, 171, 51))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(260, 310, 171, 51))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(Form)
        self.pushButton_3.setGeometry(QtCore.QRect(10, 240, 241, 51))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(Form)
        self.pushButton_4.setGeometry(QtCore.QRect(10, 310, 241, 51))
        self.pushButton_4.setObjectName("pushButton_4")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(200, 20, 21, 31))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(200, 90, 21, 31))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(250, 10, 181, 51))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.line = QtWidgets.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(200, 70, 251, 16))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(250, 80, 181, 51))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(18)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
### 
        """
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(20, 50, 31, 41))
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(Form)
        self.label_6.setGeometry(QtCore.QRect(70, 50, 31, 41))
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(Form)
        self.label_7.setGeometry(QtCore.QRect(120, 50, 31, 41))
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(Form)
        self.label_8.setGeometry(QtCore.QRect(50, 60, 16, 21))
        self.label_8.setObjectName("label_8")
        self.label_9 = QtWidgets.QLabel(Form)
        self.label_9.setGeometry(QtCore.QRect(100, 60, 16, 21))
        self.label_9.setObjectName("label_9")
        """    
###
        self.btnStartStop = QtWidgets.QPushButton(Form)
        self.btnStartStop.setGeometry(QtCore.QRect(80, 400, 151, 41))
        self.btnStartStop.setObjectName("btnStartStop")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "Добавить 100р"))
        self.pushButton_2.setText(_translate("Form", "Добавить 100$"))
        self.pushButton_3.setText(_translate("Form", "Положить деньги в банк"))
        self.pushButton_4.setText(_translate("Form", "Взять кредит"))
        self.label.setText(_translate("Form", "Р"))
        self.label_2.setText(_translate("Form", "$"))
        self.label_3.setText(_translate("Form", "<html><head/><body><p align=\"right\">0</p></body></html>"))
        self.label_4.setText(_translate("Form", "<html><head/><body><p align=\"right\">0</p></body></html>"))

#        self.label_5.setText(_translate("Form", "10"))
#        self.label_6.setText(_translate("Form", "0"))
#        self.label_7.setText(_translate("Form", "0"))
#        self.label_8.setText(_translate("Form", ":"))
#        self.label_9.setText(_translate("Form", ":"))

#        self.pushButton_5.setText(_translate("Form", "Time"))
        self.btnStartStop.setText(_translate("Form", "Start Timer"))


class Game(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        # Initialization time
        self.seconds = 0
        self.minutes = 0
        self.hours = 0

        # Var initialization
        self.balance_rub = 0
        self.balance_dol = 0

        # Var contribution initialization
        self.balance_contribution_rub = 0
        self.balance_contribution_dol = 0

        # Var bank initialization
        self.balance_bank_rub = 0
        self.balance_bank_dol = 0

        # Font initialization
        self.font = QtGui.QFont()
        self.font.setFamily("Consolas")
        self.font.setPointSize(18)

        # Button func
        self.ui.pushButton.clicked.connect(self.add_rub)
        self.ui.pushButton_2.clicked.connect(self.add_dol)
        self.ui.pushButton_3.clicked.connect(self.contribution_widget)
        self.ui.pushButton_4.clicked.connect(self.bank_widget)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

        self.labelTimer = QtWidgets.QLabel(self)
        self.labelTimer.setGeometry(QtCore.QRect(20, 50, 200, 41))

        self.ui.btnStartStop.clicked.connect(self.on_off_timer)

        self.timer = QtCore.QTimer(self)                                                # <--- Timer
        self.timer.setInterval(1000)                                                    # <--- Timer
        self.timer.timeout.connect(self.displayTime)                                    # <--- Timer

    def displayTime(self):
        self.labelTimer.setText(QtCore.QDateTime.currentDateTime().toString('hh:mm:ss'))

    def on_off_timer(self):
        if self.ui.btnStartStop.text() == 'Start Timer':
            self.timer.start()                                                          # <--- Timer
            self.ui.btnStartStop.setText('Stop Timer')
        else:
            self.timer.stop()                                                           # <--- Timer
            self.ui.btnStartStop.setText('Start Timer')

# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


    def add_rub(self):
        self.balance_rub += 100
# ?       self.ui.label_3.pyqtConfigure(text=str(self.balance_rub))

#       так
#        self.ui.label_3.setText(f'{self.balance_rub}')
#       или так 
        self.ui.label_3.setNum(self.balance_rub)                                       # +++ setNum

    def add_dol(self):
        self.balance_dol += 100
        self.ui.label_4.pyqtConfigure(text=str(self.balance_dol))

    def contribution_widget(self):
        self.dialog = QtWidgets.QWidget()
        self.dialog.setWindowTitle("Клади деньги, чорт")
        self.dialog.resize(400, 250)
        self.label = QtWidgets.QLabel("<h3 align=\"center\">Введите сумму вклада</h2>")
        self.line_edit = QtWidgets.QLineEdit(self)
        self.radio_rub = QtWidgets.QRadioButton("Р")
        self.radio_dol = QtWidgets.QRadioButton("$")
        self.btn_cont = QtWidgets.QPushButton("Положить")
        self.btn_cont.setFont(self.font)
        self.label.setFont(self.font)
        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.vbox.addWidget(self.line_edit)
        self.vbox.addWidget(self.radio_rub)
        self.vbox.addWidget(self.radio_dol)
        self.vbox.addWidget(self.btn_cont)
        self.dialog.setLayout(self.vbox)
        self.btn_cont.clicked.connect(self.contribution)
        self.dialog.show()

    def contribution(self):
        print(self.radio_rub.isChecked(), self.radio_dol.isChecked())
        if self.radio_rub.isChecked():
            if self.balance_rub >= int(self.line_edit.text()):
                self.balance_contribution_rub += int(self.line_edit.text())
                self.balance_rub -= int(self.line_edit.text())
                self.ui.label_3.pyqtConfigure(text=str(self.balance_rub))
                self.radio_rub.isHidden()
        elif self.radio_dol.isChecked():
            if self.balance_dol >= int(self.line_edit.text()):
                self.balance_contribution_dol += int(self.line_edit.text())
                self.balance_dol -= int(self.line_edit.text())
                self.ui.label_4.pyqtConfigure(text=str(self.balance_dol))

    def bank_widget(self):
        self.dialog_bank = QtWidgets.QWidget()
        self.dialog_bank.setWindowTitle("Бери деньги, ЧОРТ")
        self.dialog_bank.resize(400, 25)
        self.label_bank = QtWidgets.QLabel("<h3 align=\"center\">Введите сумму кредита</h2>")
        self.line_edit_bank = QtWidgets.QLineEdit(self)
        self.radio_rub_bank = QtWidgets.QRadioButton("Р")
        self.radio_dol_bank = QtWidgets.QRadioButton("$")
        self.btn_cont_bank = QtWidgets.QPushButton("Взять")
        self.v2box = QtWidgets.QVBoxLayout()
        self.v2box.addWidget(self.label_bank)
        self.v2box.addWidget(self.line_edit_bank)
        self.v2box.addWidget(self.radio_rub_bank)
        self.v2box.addWidget(self.radio_dol_bank)
        self.v2box.addWidget(self.btn_cont_bank)
        self.dialog_bank.setLayout(self.v2box)
        self.btn_cont_bank.clicked.connect(self.bank)
        self.dialog_bank.show()

    def bank(self):
        if self.radio_rub_bank.isChecked():
            self.balance_contribution_rub += int(self.line_edit_bank.text())
            self.balance_rub += int(self.line_edit_bank.text())
            self.ui.label_3.pyqtConfigure(text=str(self.balance_rub))
        elif self.radio_dol_bank.isChecked():
            self.balance_contribution_dol += int(self.line_edit_bank.text())
            self.balance_dol += int(self.line_edit_bank.text())
            self.ui.label_4.pyqtConfigure(text=str(self.balance_dol))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Game()
    window.setWindowTitle("Игра")
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка