2017-02-12 75 views
3

私は2週間しかPythonを使用していません。 MatplotlibでArduinoからのデータをプロットするのに問題はありません。しかし、プロットはポップウィンドウとして表示され、そのプロットはtkinterで作っているGUIのルートウィンドウにキャンバスにしか表示されません。私は物事の複数の組み合わせを試して、私はそれを働かせることができません。私はコードにプロット値を追加する場合、のは言わせて:ArduinoのMatplotlibライブプロットデータをtkinterキャンバスに埋め込む

a.plot([1, 2, 3, 4, 5], [2, 3, 4, 5, 6, 7]) 

のArduinoからデータを取得するときに私の主な問題は、その後、whileループであるので、それは、正常に動作します。私はプロットを更新するためにdrawnowオプションを試しましたが、私は同じ正確な結果を得ます。私が何をしても、プロットを別のウィンドウとして表示されなくすることはできません。

[背面のメイン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() 

答えて

2

Tkの意志のメインループアニメーションを処理するので、plt.ion()またはplt.pause()を使用しないでください。

アニメーション機能は、interval秒ごとに呼び出されます。この機能の内部ではwhile Trueループを使用することはできません。

アニメーション機能をFigureCanvasTkAggに提供する理由はありません。

あなたが何をしているのかわからない限りblit=Trueを使用しないでください。 1秒の間隔でこれはとにかく必要ではありません。

各繰り返しステップでそれを再配置するのではなく、ラインを更新します。

#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) 
plotcanvas.show() 

root.mainloop() 
+0

ありがとうございました!それは完璧に働く、まさに私が探していたものです。他のヒントをありがとう、今私はコードの仕組みをよりよく理解している。 –

関連する問題