Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python apscheduler不删除作业_Python_Python 3.x_Tkinter_Apscheduler - Fatal编程技术网

Python apscheduler不删除作业

Python apscheduler不删除作业,python,python-3.x,tkinter,apscheduler,Python,Python 3.x,Tkinter,Apscheduler,我是python的初学者,在我的tkinter中,我有一个选项菜单,共有4个选项 选项菜单 但在我的例子中,一旦apscheduler作业开始运行,即使切换到本应删除该作业的其他选项,它也不会停止。它能完成工作。因此,如果我选择5秒选项,它将正常运行。但是如果我切换到10秒选项,它将在5秒选项之上运行10秒选项。由于这两个选项使用相同的函数,因此当5秒和10秒相互重合时,它会给我两次相同的结果 我试过这个方法,不管有没有工作id,结果都是一样的 这些是结果 连接到端口…# job将永远不会在lo

我是python的初学者,在我的tkinter中,我有一个选项菜单,共有4个选项

选项菜单 但在我的例子中,一旦apscheduler作业开始运行,即使切换到本应删除该作业的其他选项,它也不会停止。它能完成工作。因此,如果我选择
5秒
选项,它将正常运行。但是如果我切换到
10秒
选项,它将在
5秒
选项之上运行
10秒
选项。由于这两个选项使用相同的函数,因此当5秒和10秒相互重合时,它会给我两次相同的结果

我试过这个方法,不管有没有工作id,结果都是一样的

这些是结果
连接到端口…# 
job
将永远不会在
locals()
中,因为它是一个局部变量,您正在设置它之前检查它。当函数返回时,所有局部变量都未设置,因此下次调用该函数时,它将再次未设置

因为您似乎在使用类,所以应该使用类变量,并将其初始化为
None

class Whatever():
    def __init__(self, ...):
        self.job = None
        ...
    def req_timer(self, option=None):
        if self.job is not None:
            ...
此外,您还有许多可以删除的重复代码。例如,您可能需要考虑重写这样的函数以减少复制:

def req_timer(self, option):

    seconds_map = {
        "15 minutes": "*/15",
        "10 minutes": "*/10",
        "5 minutes": "*/5",
        "-": None,
    }

    scheduler = apscheduler.schedulers.background.BackgroundScheduler()

    if self.job is not None:
        self.job.remove_job('option_timer')
        self.job = None

    seconds = seconds_map.get(option, None)
    if seconds is not None:
        self.job = scheduler.add_job(self.req_client, 'cron',
                                     second=seconds,
                                     id='option_timer')
        scheduler.start()

job
将永远不会在
locals()
中,因为它是一个局部变量,您正在设置它之前检查它。当函数返回时,所有局部变量都未设置,因此下次调用该函数时,它将再次未设置

因为您似乎在使用类,所以应该使用类变量,并将其初始化为
None

class Whatever():
    def __init__(self, ...):
        self.job = None
        ...
    def req_timer(self, option=None):
        if self.job is not None:
            ...
此外,您还有许多可以删除的重复代码。例如,您可能需要考虑重写这样的函数以减少复制:

def req_timer(self, option):

    seconds_map = {
        "15 minutes": "*/15",
        "10 minutes": "*/10",
        "5 minutes": "*/5",
        "-": None,
    }

    scheduler = apscheduler.schedulers.background.BackgroundScheduler()

    if self.job is not None:
        self.job.remove_job('option_timer')
        self.job = None

    seconds = seconds_map.get(option, None)
    if seconds is not None:
        self.job = scheduler.add_job(self.req_client, 'cron',
                                     second=seconds,
                                     id='option_timer')
        scheduler.start()

为什么要使用
local()
?当您退出并再次运行函数时,是否确实在函数中获得了本地值?我不这么认为-当你退出时,所有的局部变量都应该被删除。你不能使用self.job吗?为什么每次更改选项时都要创建新的
BackgroundScheduler()
?您不应该只创建一次吗?可以使用
req\u timer
中的
print()
来查看变量(即
locals()
)中的内容,并查看执行的代码部分。为什么要使用
local()
?当您退出并再次运行函数时,是否确实在函数中获得了本地值?我不这么认为-当你退出时,所有的局部变量都应该被删除。你不能使用self.job吗?为什么每次更改选项时都要创建新的
BackgroundScheduler()
?您不应该只创建一次吗?可以使用
req\u timer
中的
print()
查看变量中的内容(即
locals()
)并查看执行的代码部分。尝试您的方法,我设法减少了复制,但我目前看到了这个错误:
AttributeError:“Job”对象在
self.Job.remove\u Job('option\u timer')的回溯中没有属性“remove\u Job”
@Jero:我刚刚复制了你的代码,我不知道
self.Job
有什么方法。我相信文件会告诉你的。谢谢。查看文档并将我的代码更改为
self.job.remove()
使其正常工作。尝试您的方法,我设法减少了复制,但我目前看到了以下错误:
AttributeError:“job”对象在
self.job.remove\u job.remove的回溯中没有属性“remove\u job”
@Jero:我刚刚复制了你的代码,我不知道self.job
有什么方法。我相信文件会告诉你的。谢谢。查看文档并将我的代码更改为
self.job.remove()
使其正常工作。
def req_timer(self, option):

    seconds_map = {
        "15 minutes": "*/15",
        "10 minutes": "*/10",
        "5 minutes": "*/5",
        "-": None,
    }

    scheduler = apscheduler.schedulers.background.BackgroundScheduler()

    if self.job is not None:
        self.job.remove_job('option_timer')
        self.job = None

    seconds = seconds_map.get(option, None)
    if seconds is not None:
        self.job = scheduler.add_job(self.req_client, 'cron',
                                     second=seconds,
                                     id='option_timer')
        scheduler.start()