告诉我,我正在与图书馆datetime
和schedule
.
在某个时间,该功能应该起作用。
为此,我使用schedule
.
我正在使用PyQt5,当我启动这个schedule
窗口时,它会冻结(它说“没有响应”),你不能点击窗口中的按钮。
只是等到它schedule
结束。
该程序的含义是,如果您指定时间(例如14:50)并按下按钮,则程序应在14:50显示一条消息。
因此,我使用schedule
.
但我再说一遍,窗口冻结,但我想在循环进行时按窗口中的其他按钮。14:50
后显示消息,程序挂起,你可以继续点击任何你想要的地方,但是当计划运行到14:50时,你不能点击,一切都冻结了。/
告诉我如何摆脱冻结?
UPDATE(开始,指定比当前时间多1分钟或更多分钟的时间,并等到时间相同:根据莫斯科时间和您指定的时间
import sys
import time
from datetime import datetime
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic
import schedule
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(449, 208)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 40, 191, 31))
font = QtGui.QFont()
font.setPointSize(11)
self.label.setFont(font)
self.label.setObjectName("label")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(250, 50, 171, 21))
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(340, 130, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 449, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Когда вывести сообщение:"))
self.pushButton.setText(_translate("MainWindow", "Запуститть"))
class Example(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.go)
self.f = False
def write(self):
print('красафчик')
self.f = True
def go(self):
try:
self.t = self.lineEdit.text()
self.datetime_object = datetime.strptime(self.t, '%H:%M')
print(self.datetime_object.time())
print(datetime.now().time())
print(self.datetime_object.time() == datetime.now().time())
if self.datetime_object.time() > datetime.now().time():
schedule.every().day.at(str(self.datetime_object.time())).do(
self.write)
while self.f != True:
print('нет')
schedule.run_pending()
time.sleep(1)
while self.f != True:
if self.datetime_object.time() == datetime.now().time():
schedule.every().day.at(
str(self.datetime_object.time())).do(self.write())
schedule.run_pending()
time.sleep(0.5)
except Exception as e:
print(e)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
代码中的调用
time.sleep
加上无限循环会阻塞应用程序事件的处理,因此它不会响应。无需最少代码更改的最快解决方案是使用
QApplication.processEvents()
而不是time.sleep
:该调用
QApplication.processEvents()
可以通过向其返回活动来处理应用程序事件。另一种选择是将工作发送
schedule
到单独的线程,我通过QThread
和信号抛出了一个示例:您的任务不需要任何额外的库和额外的线程。试试这样: