python - PyQt5 QLCD倒计时
问题描述
我正在努力为 gui 构建一个带有倒数计时器的应用程序,请参见下图:
您可以在左下角设置时间。橙色按钮是将开始时间放入程序以及绿色液晶显示器中。使用开始按钮,我试图启动绿色液晶显示器以倒计时。但是我不能让它工作。程序只是退出什么都不做。我希望你能检查我的代码并告诉我我需要改变什么。编辑:试图用计时器来实现它。只是显示实际时间。运行 updateLCD 时,该应用程序只需在下面找到新的 gui 代码和 Control 代码。
似乎 .display() 函数杀死了应用程序。如果我将其注释掉,没有任何反应,但应用程序保持打开状态。非常感谢提前。
第一个.pyw代码:从PyQt5导入QtCore、QtGui、QtWidgets
class Ui_set_time(object):
def setupUi(self, set_time):
set_time.setObjectName("set_time")
set_time.resize(1125, 824)
self.job_time = QtWidgets.QTimeEdit(set_time)
self.job_time.setGeometry(QtCore.QRect(10, 770, 231, 41))
self.job_time.setStyleSheet("font: 75 16pt \"MS Shell Dlg 2\";")
self.job_time.setTime(QtCore.QTime(0, 0, 0))
self.job_time.setObjectName("job_time")
self.start_button = QtWidgets.QPushButton(set_time)
self.start_button.setGeometry(QtCore.QRect(960, 40, 150, 90))
self.start_button.setStyleSheet("font: 75 22pt \"MS Shell Dlg 2\";\n"
"background-color: rgb(0, 255, 0);")
self.start_button.setAutoDefault(False)
self.start_button.setDefault(False)
self.start_button.setFlat(False)
self.start_button.setObjectName("start_button")
self.pause_button = QtWidgets.QPushButton(set_time)
self.pause_button.setGeometry(QtCore.QRect(960, 140, 150, 90))
self.pause_button.setStyleSheet("background-color: rgb(255, 255, 0);\n"
"font: 75 22pt \"MS Shell Dlg 2\";")
self.pause_button.setObjectName("pause_button")
self.finish_button = QtWidgets.QPushButton(set_time)
self.finish_button.setGeometry(QtCore.QRect(960, 240, 150, 90))
self.finish_button.setStyleSheet("background-color: rgb(0, 85, 255);\n"
"font: 75 22pt \"MS Shell 2\";\n"
"color: rgb(255, 255, 255);")
self.finish_button.setObjectName("finish_button")
self.label = QtWidgets.QLabel(set_time)
self.label.setGeometry(QtCore.QRect(10, 720, 231, 40))
self.label.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label.setFrameShadow(QtWidgets.QFrame.Sunken)
self.label.setLineWidth(10)
self.label.setMidLineWidth(10)
self.label.setObjectName("label")
self.kill_Button = QtWidgets.QPushButton(set_time)
self.kill_Button.setGeometry(QtCore.QRect(960, 720, 150, 90))
self.kill_Button.setObjectName("kill_Button")
self.label_2 = QtWidgets.QLabel(set_time)
self.label_2.setGeometry(QtCore.QRect(260, 720, 261, 40))
self.label_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_2.setFrameShadow(QtWidgets.QFrame.Sunken)
self.label_2.setLineWidth(10)
self.label_2.setMidLineWidth(10)
self.label_2.setObjectName("label_2")
self.lineEdit = QtWidgets.QLineEdit(set_time)
self.lineEdit.setGeometry(QtCore.QRect(260, 770, 261, 41))
self.lineEdit.setObjectName("lineEdit")
self.remaining_time = QtWidgets.QLCDNumber(set_time)
self.remaining_time.setGeometry(QtCore.QRect(0, 50, 911, 221))
self.remaining_time.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(0, 255, 0);")
self.remaining_time.setDigitCount(8)
self.remaining_time.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
self.remaining_time.setObjectName("remaining_time")
self.label_3 = QtWidgets.QLabel(set_time)
self.label_3.setGeometry(QtCore.QRect(0, 10, 911, 40))
self.label_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_3.setFrameShadow(QtWidgets.QFrame.Sunken)
self.label_3.setLineWidth(10)
self.label_3.setMidLineWidth(10)
self.label_3.setObjectName("label_3")
self.extra_time = QtWidgets.QLCDNumber(set_time)
self.extra_time.setGeometry(QtCore.QRect(0, 320, 911, 221))
self.extra_time.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(255, 0, 0);")
self.extra_time.setDigitCount(8)
self.extra_time.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
self.extra_time.setObjectName("extra_time")
self.label_4 = QtWidgets.QLabel(set_time)
self.label_4.setGeometry(QtCore.QRect(0, 280, 911, 40))
self.label_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_4.setFrameShadow(QtWidgets.QFrame.Sunken)
self.label_4.setLineWidth(10)
self.label_4.setMidLineWidth(10)
self.label_4.setObjectName("label_4")
self.set_button = QtWidgets.QPushButton(set_time)
self.set_button.setGeometry(QtCore.QRect(530, 720, 150, 90))
self.set_button.setStyleSheet("background-color: rgb(255, 170, 0);\n"
"font: 75 16pt \"MS Shell Dlg 2\";")
self.set_button.setObjectName("set_button")
self.retranslateUi(set_time)
QtCore.QMetaObject.connectSlotsByName(set_time)
def retranslateUi(self, set_time):
_translate = QtCore.QCoreApplication.translate
set_time.setWindowTitle(_translate("set_time", "Dialog"))
self.job_time.setWhatsThis(_translate("set_time", "<html><head/><body><p>Hier die Zeit für den Auftrag eintragen</p><p><br/></p></body></html>"))
self.job_time.setDisplayFormat(_translate("set_time", "HH:mm:ss"))
self.start_button.setText(_translate("set_time", "Start"))
self.pause_button.setText(_translate("set_time", "Pause"))
self.finish_button.setText(_translate("set_time", "Fertig"))
self.label.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:14pt; font-weight:600;\">Vorgabe Zeit:</span></p></body></html>"))
self.kill_Button.setText(_translate("set_time", "Beenden"))
self.label_2.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:14pt; font-weight:600;\">Auftragsnummer:</span></p><p><br/></p></body></html>"))
self.label_3.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:16pt; font-weight:600;\">Verbleibende Zeit:</span></p></body></html>"))
self.label_4.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:16pt; font-weight:600;\">Überzogene Zeit:</span></p></body></html>"))
self.set_button.setText(_translate("set_time", "Setzen"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
set_time = QtWidgets.QDialog()
ui = Ui_set_time()
ui.setupUi(set_time)
set_time.show()
sys.exit(app.exec_())
其次是控制代码:
from PyQt5 import QtWidgets, QtCore, QtGui
import StortiTimer
class ControlLCD(QtWidgets.QWidget):
def __init__(self, parent = None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = StortiTimer.Ui_set_time()
self.ui.setupUi(self)
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.updateLCD)
self.timer.start(1000)
def updateLCD(self):
self.currenttime = QtCore.QTime.currentTime()
self.printtimer = self.currenttime.toString("hh:mm:ss")
self.update
self.self.ui.remaining_time.display(self.printtimer)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
c = ControlLCD()
c.show()
sys.exit(app.exec_())
解决方案
我相信我已经解决了下面代码中的关键问题。
我将您的例程纳入一个整体课程以简化呼叫。
您的按钮不起作用,因为您需要将它们连接到帮助程序。例如:
def onClickStartTimer(self):
self.timer.start()
...
self.start_button = QPushButton(set_time)
self.start_button.clicked.connect(self.onClickStartTimer)
定时器启动和停止控制然后进入适当的帮助程序。
我修改了 updateLCD 以在每次调用时将“currenttime” QTime() 变量递减 1 秒,然后显示时间。添加了测试以在计数器达到零后停止计数器。还更新了您的 Setzen 按钮帮助程序以调用 updateLCD 以显示您的初始时间设置。
我添加了代码来使暂停在定时器启动和停止之间切换,具体取决于定时器的当前状态,这是我假设你想要的。
希望这可以帮助。请参阅以下内容:
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
# import StortiTimer
@pyqtSlot() # Enable slots
class Ui_set_time(object):
def onClickStartTimer(self):
self.timer.start()
def updateLCD(self): # Subtract 1 sec from currenttime and display it
self.currenttime = self.currenttime.addSecs(-1) # Subtract 1 second from currenttime
self.printtimer = self.currenttime.toString("hh:mm:ss")
self.remaining_time.display(self.printtimer)
if self.currenttime == QTime(0,0,0): # Stop after displaying zero seconds. Place any other needed actions under here when hitting zero.
self.timer.stop()
def onClickPauseTimer(self):
# Toggle between stop and start
if self.timer.isActive():
self.timer.stop()
else:
self.timer.start()
def onClickFinish(self):
self.timer.stop()
def onClickKill(self):
# Don't know what goes in here
pass
print("In kill button")
def onClickSetTimer(self):
self.starttime = self.job_time.time()
self.currenttime = self.starttime.addSecs(1) # Account for updateLCD subtracting 1
self.updateLCD() # Subtract 1 sec from currenttime and display this initial time
def setupUi(self, set_time):
self.timer = QTimer()
self.timer.setInterval(1000) # Fire every 1000 ms
self.timer.timeout.connect(self.updateLCD)
set_time.setObjectName("set_time")
set_time.resize(1125, 824)
self.job_time = QTimeEdit(set_time)
self.job_time.setGeometry(QRect(10, 770, 231, 41))
self.job_time.setStyleSheet("font: 75 16pt \"MS Shell Dlg 2\";")
self.job_time.setTime(QTime(0, 0, 0))
self.job_time.setObjectName("job_time")
self.start_button = QPushButton(set_time)
self.start_button.setGeometry(QRect(960, 40, 150, 90))
self.start_button.setStyleSheet("font: 75 22pt \"MS Shell Dlg 2\";\n"
"background-color: rgb(0, 255, 0);")
self.start_button.setAutoDefault(False)
self.start_button.setDefault(False)
self.start_button.setFlat(False)
self.start_button.setObjectName("start_button")
self.start_button.clicked.connect(self.onClickStartTimer)
self.pause_button = QPushButton(set_time)
self.pause_button.setGeometry(QRect(960, 140, 150, 90))
self.pause_button.setStyleSheet("background-color: rgb(255, 255, 0);\n"
"font: 75 22pt \"MS Shell Dlg 2\";")
self.pause_button.setObjectName("pause_button")
self.pause_button.clicked.connect(self.onClickPauseTimer)
self.finish_button = QPushButton(set_time)
self.finish_button.setGeometry(QRect(960, 240, 150, 90))
self.finish_button.setStyleSheet("background-color: rgb(0, 85, 255);\n"
"font: 75 22pt \"MS Shell 2\";\n"
"color: rgb(255, 255, 255);")
self.finish_button.setObjectName("finish_button")
self.finish_button.clicked.connect(self.onClickFinish)
self.label = QLabel(set_time)
self.label.setGeometry(QRect(10, 720, 231, 40))
self.label.setFrameShape(QFrame.StyledPanel)
self.label.setFrameShadow(QFrame.Sunken)
self.label.setLineWidth(10)
self.label.setMidLineWidth(10)
self.label.setObjectName("label")
self.kill_Button = QPushButton(set_time)
self.kill_Button.setGeometry(QRect(960, 720, 150, 90))
self.kill_Button.setObjectName("kill_Button")
self.kill_Button.clicked.connect(self.onClickKill)
self.label_2 = QLabel(set_time)
self.label_2.setGeometry(QRect(260, 720, 261, 40))
self.label_2.setFrameShape(QFrame.StyledPanel)
self.label_2.setFrameShadow(QFrame.Sunken)
self.label_2.setLineWidth(10)
self.label_2.setMidLineWidth(10)
self.label_2.setObjectName("label_2")
self.lineEdit = QLineEdit(set_time)
self.lineEdit.setGeometry(QRect(260, 770, 261, 41))
self.lineEdit.setObjectName("lineEdit")
self.remaining_time = QLCDNumber(set_time)
self.remaining_time.setGeometry(QRect(0, 50, 911, 221))
self.remaining_time.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(0, 255, 0);")
self.remaining_time.setDigitCount(8)
self.remaining_time.setSegmentStyle(QLCDNumber.Flat)
self.remaining_time.setObjectName("remaining_time")
self.label_3 = QLabel(set_time)
self.label_3.setGeometry(QRect(0, 10, 911, 40))
self.label_3.setFrameShape(QFrame.StyledPanel)
self.label_3.setFrameShadow(QFrame.Sunken)
self.label_3.setLineWidth(10)
self.label_3.setMidLineWidth(10)
self.label_3.setObjectName("label_3")
self.extra_time = QLCDNumber(set_time)
self.extra_time.setGeometry(QRect(0, 320, 911, 221))
self.extra_time.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(255, 0, 0);")
self.extra_time.setDigitCount(8)
self.extra_time.setSegmentStyle(QLCDNumber.Flat)
self.extra_time.setObjectName("extra_time")
self.label_4 = QLabel(set_time)
self.label_4.setGeometry(QRect(0, 280, 911, 40))
self.label_4.setFrameShape(QFrame.StyledPanel)
self.label_4.setFrameShadow(QFrame.Sunken)
self.label_4.setLineWidth(10)
self.label_4.setMidLineWidth(10)
self.label_4.setObjectName("label_4")
self.set_button = QPushButton(set_time)
self.set_button.setGeometry(QRect(530, 720, 150, 90))
self.set_button.setStyleSheet("background-color: rgb(255, 170, 0);\n"
"font: 75 16pt \"MS Shell Dlg 2\";")
self.set_button.setObjectName("set_button")
self.set_button.clicked.connect(self.onClickSetTimer)
self.retranslateUi(set_time)
# QMetaObject.connectSlotsByName(set_time)
def retranslateUi(self, set_time):
_translate = QCoreApplication.translate
set_time.setWindowTitle(_translate("set_time", "Dialog"))
self.job_time.setWhatsThis(_translate("set_time", "<html><head/><body><p>Hier die Zeit für den Auftrag eintragen</p><p><br/></p></body></html>"))
self.job_time.setDisplayFormat(_translate("set_time", "HH:mm:ss"))
self.start_button.setText(_translate("set_time", "Start"))
self.pause_button.setText(_translate("set_time", "Pause"))
self.finish_button.setText(_translate("set_time", "Fertig"))
self.label.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:14pt; font-weight:600;\">Vorgabe Zeit:</span></p></body></html>"))
self.kill_Button.setText(_translate("set_time", "Beenden"))
self.label_2.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:14pt; font-weight:600;\">Auftragsnummer:</span></p><p><br/></p></body></html>"))
self.label_3.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:16pt; font-weight:600;\">Verbleibende Zeit:</span></p></body></html>"))
self.label_4.setText(_translate("set_time", "<html><head/><body><p><span style=\" font-size:16pt; font-weight:600;\">Überzogene Zeit:</span></p></body></html>"))
self.set_button.setText(_translate("set_time", "Setzen"))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
set_time = QDialog()
ui = Ui_set_time()
ui.setupUi(set_time)
set_time.show()
sys.exit(app.exec_())
#Secondly the Control code:
# class ControlLCD(QWidget):
# def __init__(self, parent = None):
# QWidget.__init__(self, parent)
# # self.ui = StortiTimer.Ui_set_time()
# self.ui.setupUi(self)
# # def updateLCD(self):
# # self.currenttime = QTime.currentTime()
# # self.printtimer = self.currenttime.toString("hh:mm:ss")
# # self.update
# # self.ui.remaining_time.display(self.printtimer)
# if __name__ == "__main__":
# import sys
# app = QApplication(sys.argv)
# c = ControlLCD()
# c.show()
# sys.exit(app.exec_())
推荐阅读
- powershell - Connect-PowerBiServiceAccount 无法与服务主体连接
- qt - 设置填充时如何避免绑定循环?
- linux - 使用 bash 脚本根据文件夹名称移动文件夹
- json - MongoDB - 关系化包含数组的 JSON
- javascript - Wave 可访问性检查中的空按钮错误
- modelica - 使用“外部”参数重新声明模型
- java - org.apache.tomcat-embed-core 的 java 模块是什么?
- go - 如何使用 js.Value 作为 js.Global().Get 的参数
- javascript - 如何在 React.js 中使用 reduce 获取嵌套数组中的累计价格
- php - 从具有相同列名 MYSQL/PHP 的引用表上的多个表中选择