如何无限地调用一个类

时间:2017-06-03 17:07:28

标签: python python-3.x tkinter

我有一段无限运行的代码。我想将这段代码放在一个类中,并在另一个类中定义一个按钮。单击该按钮时,它应该调用类(代码所在的类),并且此类应该像原始代码一样无限运行。我尝试了几种从互联网上学到的方法,但根本没有运气。因为我对python完全不熟悉。任何帮助将不胜感激。

import time
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]])


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()

最好使用Canvas代替imshow,因为稍后我会创建一个GUI并使用Tkinter。

1 个答案:

答案 0 :(得分:0)

假设您有一个函数do_something,您想在循环中重复调用它:

def do_something(...):
    <whatever code you want>

假设您传入对窗口小部件的引用(例如:root),您可以使用类似下面的示例连续运行此函数。在此示例中,它每秒运行一次代码(例如:1000 ms)。

def run_every_second(root):
    do_something()
    root.after(1000, run_every_second, root)

您只需拨打run_every_second一次即可开始此过程:

root = tk.Tk()
...
run_every_second(root)

我不知道这种方法是否与matplotlib一起使用效果很好,但对于普通的tkinter,这是一种非常标准的技术。