如何避免infinte循环

时间:2017-06-02 12:17:23

标签: python python-3.x matplotlib

如何避免此 def func(i) 循环。我必须无限次地运行 while True 。避免这个 matplotlib 循环的原因是每当我创建两个类时,一个类具有这段代码,另一个类具有按钮以在按下按钮时访问这段代码,但我得到的问题是我无法在tkinter窗口中集成此import matplotlib matplotlib.use("TkAgg") from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.pyplot as plt import numpy as np import tkinter as tk from tkinter import * import matplotlib.animation as animation j=0 fig = plt.figure() ax1 = fig.add_axes([0.85, 0.093, 0.04, 0.8]) cax = fig.add_subplot(1, 1, 1) H = np.array([[1, 2, 3, 1], [4, 5, 6, 10], [3, 7, 8, 4], [10, 5, 3, 1]]) Z = np.array([[3, 290, 600], [1011, 230, 830], [152, 750, 5]]) while True: def func(i): global j if j == 0: j += 1 rows, cols = H.shape im = plt.imshow(H, interpolation='nearest', extent=[0, cols, 0, rows], cmap='bwr', vmin=0, vmax=10) fig.colorbar(im, cax=ax1, orientation='vertical') elif j == 1: j -= 1 rows, cols = H.shape im = plt.imshow(Z, interpolation='nearest', cmap='Spectral', vmin=0, vmax=1023,extent=[0, cols, 0, rows]) v = np.linspace(0, 1023, 15, endpoint=True) fig.colorbar(im, cax=ax1, orientation='vertical', ticks=v) ani = animation.FuncAnimation(fig, func, interval=1000) plt.show() plt.close() 。该按钮单独显示,matplotlib单独运行。但是当我删除while循环时,它以某种方式解决了问题但是没有无限循环。

react-router

1 个答案:

答案 0 :(得分:1)

代码样式:您是否可以避免重复运行func0(i),而是定义两个函数,j == 0情况func1(i)func j == 1个案例? (我假设ani = animation.FuncAnimation(fig, func0, interval=1000) plt.show() plt.close() ani = animation.FuncAnimation(fig, func1, interval=1000) plt.show() plt.close() 必须有一个预定义的签名,你不能将j作为参数添加到它。)然后将无限循环的主体改为

after()

使用计时器或线程:在GUI应用程序中拥有无限循环是个坏主意,至少在处理事件的线程中是这样。你可以把无限循环放到一个单独的线程中(注意,线程不是为了胆小的人)或者将它改成一个重复的定时器驱动的事件(在事件中没有循环)?

有关计时器的更多信息:我们的想法是使用计时器运行一个循环,然后返回到GUI,以便更新并响应。 Tkinter支持使用根窗口的{{1}}方法的计时器。我不知道它是否支持重复计时器,但你所要做的就是在计时器事件结束时重新启动计时器。

How to create a timer using tkinter?How to create a timer using tkinter?Python - Countdown timer within a tkinter canvas中有一些示例。

(对不起,我希望将其添加为评论,但I don't have enough reputation here。)