Как сделать таймер в отдельном процессе?
Недавно начал изучать 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 шт):
не могу сделать второй процесс под своё приложение и туда поместить таймер/время.
Вам не нужно создавать второй процесс для этих целей.
Класс 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_())

