RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1202654
Accepted
Евгений
Евгений
Asked:2021-11-10 19:49:15 +0000 UTC2021-11-10 19:49:15 +0000 UTC 2021-11-10 19:49:15 +0000 UTC

计划因计划而冻结

  • 772

告诉我,我正在与图书馆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_())
python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    gil9red
    2021-11-10T21:13:04Z2021-11-10T21:13:04Z

    代码中的调用time.sleep加上无限循环会阻塞应用程序事件的处理,因此它不会响应。

    无需最少代码更改的最快解决方案是使用QApplication.processEvents()而不是time.sleep:

    ...
                if self.datetime_object.time() > datetime.now().time():
                    schedule.every().day.at(str(self.datetime_object.time())).do(
                        self.write
                    )
                    while not self.f:
                        # print('нет')
                        schedule.run_pending()
                        QApplication.processEvents()
    
                while not self.f:
                    if self.datetime_object.time() == datetime.now().time():
                        schedule.every().day.at(
                            str(self.datetime_object.time())).do(self.write())
                    schedule.run_pending()
                    QApplication.processEvents()
    ...
    

    该调用QApplication.processEvents()可以通过向其返回活动来处理应用程序事件。


    另一种选择是将工作发送schedule到单独的线程,我通过QThread和信号抛出了一个示例:

    from PyQt5.QtCore import QThread, pyqtSignal
    
    ...
    
    class ScheduleThread(QThread):
        about_time = pyqtSignal(str)
    
        def add_time(self, time: str):
            schedule.every().day.at(time).do(
                lambda: self.about_time.emit(time)
            )
    
        def run(self):
            while True:
                schedule.run_pending()
                time.sleep(1)
    
    
    class Example(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
    
            self.setupUi(self)
            self.pushButton.clicked.connect(self.go)
    
            self.thread = ScheduleThread()
            self.thread.about_time.connect(self.write)
            self.thread.start()
    
        def write(self, time: str):
            print('красафчик', time)
    
        def go(self):
            try:
                t = self.lineEdit.text()
                datetime_object = datetime.strptime(t, '%H:%M')
                time_str = str(datetime_object.time())
    
                self.thread.add_time(time_str)
    
            except Exception as e:
                print(e)
    
    • 3
  2. S. Nick
    2021-11-10T21:23:42Z2021-11-10T21:23:42Z

    您的任务不需要任何额外的库和额外的线程。试试这样:

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication, QMainWindow
    from PyQt5 import uic
    #from datetime import datetime
    #import schedule
    #import time
    
    
    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.lineEdit.setPlaceholderText('Введите время ЧЧ:ММ:СС')
            
            self.timer = QtCore.QTimer(self)
            self.timer.setInterval(1000)
            self.timer.timeout.connect(self.timerHit)
    
        def timerHit(self):
            current_time = QtCore.QTime.currentTime().toString()
            time = self.lineEdit.text()
            print(time, current_time)
            if time <= current_time:
                msg = QtWidgets.QMessageBox.information(
                    self, 
                    'ВНИМАНИЕ', 
                    'Пришло время, делайте что-нибудь!') 
                self.timer.stop()
            
        def go(self):
            self.timer.start()
        
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Example()
        ex.show()
        sys.exit(app.exec_())
    

    在此处输入图像描述

    • 3

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5