如何避免此 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
答案 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。)