如何安排我的桌面应用程序(PyQt)以一定间隔发送电子邮件

时间:2015-02-04 21:18:54

标签: python-2.7 pyqt4 schedule

所以,我已经构建了这个漂亮的应用程序(using camelot)并且不知道如何在其上实现预定作业,它可以定期发送基于某些条件的电子邮件。我正在尝试使用schedule实现它,但不知道如何让我的应用程序自动调用它。 这是我的代码:

import time, schedule


def job():
    print "I'm working..."

schedule.every(10).seconds.do(job)


while True:
    schedule.run_pending()
    time.sleep(1)

当我开始申请时,没有任何作用。如何让我的应用程序意识到这一点。 如果可能的话,我希望这个计划作业在没有启动我的应用程序的情况下执行。

1 个答案:

答案 0 :(得分:0)

如果要安排将与用户交互的作业,则必须使用 Camelot Actions ,它们有自己的方法在模型线程中执行函数,将结果发布到GUI线程,然后回来......

但是,您不需要这样做,您只需要运行将访问数据库,创建电子邮件并发送它的作业(功能),而无需与用户交互。这可以通过完全独立的应用程序完成,无需GUI。 为了避免创建两个应用程序,您可以使用命令行参数更改行为。如果您启动应用程序时没有任何参数,它将照常打开GUI,但如果您使用-background运行它,它将只启动计划循环。 然后,您可以在系统启动时挂钩您的应用程序,使用" -background"执行它,您将在不需要用户启动应用程序的情况下运行计划。

如果稍后用户启动应用程序,那么您将运行两个实例,第一个运行计划循环,第二个运行GUI。

main.py:

if __name__ == '__main__':
    import sys
    if "-background" in sys.argv:

        import background
        background.main()

    else:
        main() #camelot's main

background.py:

from camelot.core.orm import Session
import time, schedule


def job():
    session = Session()
    #Use session to access and manipulate model
    print "I'm working..."

    session.flush() #flush session to DB


def main():
    from camelot.core.conf import settings
    settings.setup_model()

    schedule.every(10).seconds.do(job)

    while True:
        schedule.run_pending()
        time.sleep(1)    

您应该使用python main.py -background运行该应用。