热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何暂停一个函数?

代码在jupyternotebook里写的,奇怪的是在办公室能用,家里不能用了整个功能就是用apscheduler定时运行生成随机数然后在tkinter里可视化

代码在 jupyternotebook 里写的,奇怪的是在办公室能用,家里不能用了...
整个功能就是用 apscheduler 定时运行生成随机数然后在 tkinter 里可视化
现在想保留原代码里 root.after 功能(因为直接用 root.after,按现在做法定时函数就没用了,因为 root.after 是循环的)
感觉可以用锁的方法,但是水平捉急写不出来,求指教。。



'''
import datetime
from apscheduler.schedulers.background import BackgroundScheduler
import random
import numpy as np
from tkinter import *
from tkinter import messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import multiprocessing
from threading import Thread
import time

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
root = Tk()

root.title("tkinter + Matplotlib")

root.geometry('700x750')

plt.rcParams['axes.unicode_minus']=False

plt.rcParams['font.sans-serif'] = ['SimHei']

fig = plt.figure()

ax1 = fig.add_subplot(1, 1, 1)

ax2 = ax1.twinx()



ax1.set_title('随机生成数')



ax1.set_ylim()

ax2.set_ylim()



ax1.set_xlim(0, 200)

ax2.set_xlim(0, 200)



ax1.grid(True)



ax1.set_xlabel("time")

ax1.set_ylabel("随机数 1")

ax2.set_ylabel("随机数 2")



canvas = FigureCanvasTkAgg(fig, master=root)

canvas.draw()



canvas.get_tk_widget().pack()



x = 0

ran1 = []

ran2 = []

times = []



def drawImg():



    global ran1

    global ran2

    global times

    global x

    global ax1

    global ax2



    v1 = float(random.randint(-5, 5))

    r1 = float(random.randint(-10, 10))

    ran1.append(v1)

    ran2.append(r1)

    times.append(x)

    x += 1



    ax1.clear()

    ax2.clear()

    ax1.axes.set_ylim(min(ran1)-5, 5+max(ran1))

    ax2.axes.set_ylim(min(ran2)-5, 5+max(ran2))

    ax1.axes.set_xlim(x-200+200, x+20)

    ax2.axes.set_xlim(x-200+20, x+20)



    ax1.plot(times, ran1,'y')

    ax2.plot(times, ran2,'r')

    canvas.draw()

    #global afterHandler

    #afterHandler = root.after(10, drawImg)

    #print(datetime.datetime.now())



def sub_task():

    drawImg()



def task_(time):

    def task__():

        temp = BackgroundScheduler()

        temp.add_job(sub_task,'interval',secOnds= 1,end_date =str(datetime.datetime.now())[:17]+time)

        temp.start()

    return task__



sche_fn = BackgroundScheduler()

sche_fn.add_job(task_('25'),'cron',day_of_week = 'mon-fri',hour = '*',minute = '*',secOnd= '0' )

sche_fn.start()

sche_an = BackgroundScheduler()

sche_an.add_job(task_('55'),'cron',day_of_week = 'mon-fri',hour = '*',minute = '*',secOnd= '30' )

sche_an.start()







def on_closing():

    sche_an.shutdown()

    sche_fn.shutdown()

    #root.after_cancel(afterHandler)

    answer = messagebox.askokcancel("退出", "确定退出吗?")

    if answer:

        plt.close('all')

        root.destroy()

    else:

        root.after(1000, drawImg)





root.protocol("WM_DELETE_WINDOW", on_closing)

root.mainloop()

如果要暂停函数的话可以考虑`yield`。函数里有`yield`的话,调用函数会返回一个生成器。`next(生成器)`会让函数运行到`yield`处中断,并返回`yield`的值,这样就相当于暂停了函数。有关`yield`见 python 文档语言参考部分,`next`见标准库参考部分。
还有就是考虑协程了,见标准库的`asyncio`。python 早期的协程其实也是基于上面说的生成器的。





   



推荐阅读
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • Android获取app应用程序大小的方法
    Android获取app应用程序大小的方法-Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
author-avatar
亚丶喃7_789
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有