我只使用了Python几周。我没有问题用Matplotlib绘制来自Arduino的数据。然而,该情节显示为一个弹出窗口,我希望该情节只显示在我使用tkinter制作的GUI的根窗口中的画布中。我尝试了多种组合方式,但我无法让它发挥作用。如果我只是将绘图值添加到代码中,请说:
a.plot([1, 2, 3, 4, 5], [2, 3, 4, 5, 6, 7])
它运行正常,所以我的主要问题是从Arduino获取数据时使用while循环。我也尝试过drawow选项来更新情节,但我得到了相同的结果。无论我做什么,我似乎无法让情节停止显示为一个单独的窗口。
[在后面有主GUI窗口的绘图窗口] [1]
以下是我使用的示例代码:
import serial
from tkinter import *
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
root = Tk()
root.geometry('1200x700+200+100')
root.title('This is my root window')
root.state('zoomed')
root.config(background='#fafafa')
yar = []
plt.ion()
style.use('ggplot')
fig = plt.figure(figsize=(14, 4.5), dpi=100)
ax1 = fig.add_subplot(1, 1, 1)
ser = serial.Serial('com3', 9600)
def animate(i):
while True:
ser.reset_input_buffer()
data = ser.readline().decode("utf-8")
data_array = data.split(',')
yvalue = float(data_array[1])
yar.append(yvalue)
print(yvalue)
plt.ylim(0, 100)
ax1.plot(yar, 'r', marker='o')
plt.pause(0.0001)
plotcanvas = FigureCanvasTkAgg(fig, root, animate)
plotcanvas.get_tk_widget().grid(column=1, row=1)
ani = animation.FuncAnimation(fig, animate, interval=1000, blit=True)
plotcanvas.show()
root.mainloop()
答案 0 :(得分:2)
tk的主循环将处理动画,因此你不应该使用plt.ion()或plt.pause()。
每隔interval
秒调用一次动画功能。你不能在这个函数中使用while True
循环。
没有任何理由向FigureCanvasTkAgg
提供动画功能。
除非您知道自己在做什么,否则不要使用blit=True
。间隔为一秒,这无论如何都是必要的。
更新行,而不是在每个迭代步骤中重新绘制它。
#import serial
from Tkinter import *
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
root = Tk()
root.geometry('1200x700+200+100')
root.title('This is my root window')
root.state('zoomed')
root.config(background='#fafafa')
xar = []
yar = []
style.use('ggplot')
fig = plt.figure(figsize=(14, 4.5), dpi=100)
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_ylim(0, 100)
line, = ax1.plot(xar, yar, 'r', marker='o')
#ser = serial.Serial('com3', 9600)
def animate(i):
#ser.reset_input_buffer()
#data = ser.readline().decode("utf-8")
#data_array = data.split(',')
#yvalue = float(data_array[1])
yar.append(99-i)
xar.append(i)
line.set_data(xar, yar)
ax1.set_xlim(0, i+1)
plotcanvas = FigureCanvasTkAgg(fig, root)
plotcanvas.get_tk_widget().grid(column=1, row=1)
ani = animation.FuncAnimation(fig, animate, interval=1000, blit=False)
root.mainloop()