python - 将带有其他组件的不断更新的动画情节放在 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:包括所有进口
解决方案
推荐阅读
- c++ - 使用 Vulkan-hpp vk::enumerateInstanceVersion() 会导致段错误
- excel - 打印时间表 PDF
- r - 在插入符号 R 中出现 CV 错误和训练错误
- ruby-on-rails - 值对象枚举未正确验证
- python - 使用 range(len(arr)-1,-1,-1)、arr[::-1] 和 reversed(arr) 的 for 循环是否具有相同的时间复杂度?
- node.js - Lambda 函数只将一个数据点放入 InfluxDB
- c# - C# 中引用类型的范围
- python - Python Json数据按相同的姓氏分组
- angular - Angular,本地存储如何自动调用键
- cordova - cordova.js:308 Uncaught TypeError: AppRate.preferences.openUrl 不是 Function.AppRate.navigateToAppStore 的函数(AppRate.js:257)