RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 639389
Accepted
User New
User New
Asked:2020-03-14 21:23:43 +0000 UTC2020-03-14 21:23:43 +0000 UTC 2020-03-14 21:23:43 +0000 UTC

python如何给程序添加定时器

  • 772

下午好。有一个用 python3 编写的程序,带有 PyQt5 图形界面。它有许多不同的模块和功能。到目前为止,一切都在一个线程中运行,即 没有子进程和多进程。该程序有一个启动器:

if __name__ == '__main__':
    Base.start_base()
    app = QApplication(sys.argv)
    form = Ui_Form()
    Ui_Form.user_pass(form)
    form.show()
    sys.exit(app.exec_())

然后,在程序本身中已经有(据我所知)一块 (module def retranslateUi(self, Form): ),其中程序旋转一圈并等待 GUI 中的按键:

        self.Begin.clicked.connect(self.choice)
        self.Clr_mes.clicked.connect(self.clear)
        self.radio_print_user_base.clicked.connect(self.print_userbase)
        self.Foto_Rate.clicked.connect(self.download_fotorating)
        self.Fotorate_folder_btn.clicked.connect(self.fotorate_folder)

在我看来,她在这里旋转,她实际上是如何抓住这些压力的——我不知道。

实际上,问题是:如何向程序添加一个计时器来跟踪时间,比如说,每 10 分钟它将启动一个程序模块(模拟 GUI 中的击键以启动所需模块)?我会澄清:扣上钥匙,启动模块,模拟按下 - 我可以。我不明白如何启动计时器以及在何处输入计时器,这将与程序同时工作,无论它当前正在做什么以及在那里按下了什么。

PS 我试着玩了一下multiprocessing模块,把breakdown放到processes下if __name__ == '__main__':,但是simultaneity不行,processes还是轮流执行,其中一个挂了很久(比如画界面就挂了并且有一个白色的空窗口),等待它完成另一个工作。也许他只是做错了。

python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    m9_psy
    2020-03-14T21:52:10Z2020-03-14T21:52:10Z

    如果不需要进行复杂的计算工作,那么最简单的流程就足够了:

    import threading
    import time
    
    
    def my_timer(print_interval):
        data = threading.local()
        data.counter = 1
        while True:
            time.sleep(print_interval)
            print("I am alive %d times!" % data.counter, threading.current_thread().name)
            data.counter += 1
    
    t = threading.Thread(target=my_timer, name="My time thread", args=(5, ), daemon=True)
    t.start()
    

    该流程很简单,将与应用程序一起完成其工作。如果你打算在里面“算很多”,那么裸 pythonic 流是不合适的,不会有任何收获。唯一值得注意的参数是daemon. 默认情况下,应用程序在终止之前等待其所有子线程完成。如果线程已被声明为守护进程,则应用程序不会等待它完成。那些。如果没有这个参数,应用程序将永远等待关闭(如何向线程发送关闭信号是一个单独的主题)。守护进程很方便,因为您根本不必担心关闭它们 - 它们始终与应用程序一起工作。

    该函数可能也很有趣sleep——它暂停了当前线程的工作(不是全部,不是主线程,而是只有当前线程),这将允许控制界面绘制的线程做它自己的事情而不是等谁。

    然而,还有另一种方法可以使用 Qt 本身来实现,而无需与线程共舞。在引擎盖下,您可以阅读有关信号和事件的信息,这里我将给出针对作者问题的特定解决方案的代码:

    import sys
    
    from PyQt5.QtCore import Qt, QTimer
    from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QGridLayout, QSizePolicy, QApplication
    
    
    class Window(QWidget):
        def __init__(self, *args, **kwargs):
            self.my_counter = 1
    
            QWidget.__init__(self, *args, **kwargs)
    
            self.label = QLabel("QLabel", self)
            self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.label.setAlignment(Qt.AlignCenter)
            self.label.setStyleSheet("QLabel {background-color: pink; font-size: 50pt;}")
    
            self.button = QPushButton("Test", self)
    
            self.button.clicked.connect(self.local_button_handler)
    
            self.layout = QGridLayout()
            self.layout.addWidget(self.label, 0, 0)
            self.layout.addWidget(self.button, 0, 1)
    
            self.setLayout(self.layout)
            self.show()
    
        def local_button_handler(self):
            self.label.setText("Qlabel" + " %d tick" % self.my_counter)
            self.my_counter += 1
    
    
    app = QApplication(sys.argv)
    win = Window()
    
    timer = QTimer()
    timer.timeout.connect(win.local_button_handler)
    timer.start(1000)
    
    sys.exit(app.exec_())
    

    该代码将创建一个带有按钮和铭文的简单窗口。铭文通过按下按钮和计时器来改变。

    • 2
  2. Andrio Skur
    2020-03-14T21:52:10Z2020-03-14T21:52:10Z

    这是一个例子:

    import time
    import threading as th
    
    def target(form):
        while True:
            print(form) #нажмите кнопку тут
            time.sleep(10)
    
    form = 1 #некая кнопка
    t = th.Thread(target=target, args=(form,), daemon=True)
    t.start()
    #сохраните куда-то переменную t
    #del t если вам надо убить поток
    

    您可以使用多处理,但首先它会给系统带来更多负载,其次它更难管理

    • 0

相关问题

Sidebar

Stats

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

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +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
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +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