首页 > 解决方案 > 将带有其他组件的不断更新的动画情节放在 tkinter gui 中

问题描述

我想在我的 GUI 的一个页面中显示一个情节。绘制的数据theData将不断变化。每当theData改变时,值就valueChangedtheData被写入1。时间和数据的映射在这里:

xsize=100
xdata,ydata = [],[]
def data_gen():
    t = data_gen.t
    global theData
    global valueChangedtheData
    while True:
        if (valueChangedtheData == 1):
           valueChangedtheData = 0;
           t+=0.1
           val=float(theData);
           if val>1000:
               continue
           yield t, val

        else: pass


def animate(data):
    t, val = data
    if t>-1:
        xdata.append(t)
        ydata.append(val)
        if t>xsize: # Scroll to the left.
            a.set_xlim(t-xsize, t)
        line.set_data(xdata, ydata)
    return line,

def on_close_figure(event):
    sys.exit(0)

data_gen.t = -1
f = plt.figure()
f.canvas.mpl_connect('close_event', on_close_figure)
#f = Figure(figsize=(5,5), dpi=100)
a = f.add_subplot(111)
line, = a.plot([], [], lw=2)
a.set_ylim(0, 250)
a.set_xlim(0, xsize)
a.grid()

我已经这样定义了我的 GUI 容器:

class Gui(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = Frame(self)
        container.pack(side="top", fill = "both", expand = TRUE)
        container.grid_rowconfigure(0, weight = 1)

        global theData;


        self.MyReading = StringVar()
        self.frames={}

        for F in (StartPage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row = 0, column = 0, sticky = "nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):
      frame = self.frames[cont]
      frame.tkraise()

和显示情节的页面:

class StartPage(Frame):                         #The Graphical Page
    def __init__(self, parent, controller):
        Frame.__init__(self,parent)

        label = Label(self, text="StartPage")
        label.pack()
        label1 = Label(self, textvariable = controller.theData)
        label1.pack

        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw() #changed from show to draw
        canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)

        toolbar = NavigationToolbar2Tk(canvas, self)
        toolbar.update()
        canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=True)

为了启动动画和 Gui:

root = Gui()
update_reading()
ani = animation.FuncAnimation(f, animate, data_gen, blit = False, interval=100, repeat = False)
root.mainloop()

更新update_reading()标签:

def update_reading():
    global theData
    global valueChangedtheData
    theData = randint(1,20)             #This is just an example of the changing value
    print(theData)
    valueChangedtheData = 1;
    root.MyReading.set(str(theData));
    root.after(100,update_reading)

但是,在页面上添加画布后,所有依赖于变量类的标签都将拒绝购物,包括值,theData 但绘图是图形化的。此外,显示图像的标签也会拒绝显示。注释画布、数据映射和动画后,标签会重新出现。我是否缺少重要的初始化代码?此外,在绘图期间,gui 窗口中发生了相当大的“迟缓”。这可以通过更好的代码编写来缓解吗?谢谢

进口:

from tkinter import *

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import style
from random import randint

编辑:添加遗漏和必要的代码 EDIT2:包括所有进口

标签: pythonmatplotlibtkintergraphtkinter-canvas

解决方案


推荐阅读