Python 如何根据收到的变量而不是预先声明的帧数停止动画功能

Python 如何根据收到的变量而不是预先声明的帧数停止动画功能,python,matplotlib,tkinter,arduino,python-multithreading,Python,Matplotlib,Tkinter,Arduino,Python Multithreading,我正在使用动画功能来查询arduino,我需要它以20Hz的频率进行查询,目前我在这方面没有任何问题。我的问题是,我在预先声明的帧数后停止读取,而不是在变量到达某个点时停止读取。我通过在变量到达某个特定点时停止事件源来解决这个问题,我可以将帧删除到arduino永远不会命中的某个大数字,而是以更干净的方式执行 下面是我目前使用的代码,这是tkinter GUI中的代码,但为了简洁起见,我只添加了一些重要的内容: def start(self): self.xdata = [] s

我正在使用动画功能来查询arduino,我需要它以20Hz的频率进行查询,目前我在这方面没有任何问题。我的问题是,我在预先声明的帧数后停止读取,而不是在变量到达某个点时停止读取。我通过在变量到达某个特定点时停止事件源来解决这个问题,我可以将帧删除到arduino永远不会命中的某个大数字,而是以更干净的方式执行

下面是我目前使用的代码,这是tkinter GUI中的代码,但为了简洁起见,我只添加了一些重要的内容:

def start(self):
    self.xdata = []
    self.ydata1 = []
    self.ydata2 = []
    self.k = 0
    self.limit = 300
    self.arduinoData.flushInput()
    self.points = int(float(self.Duration_cycle.get())*60*20) + 1
    self.ani = animation.FuncAnimation(
        self.fig,
        self.update_graph,
        frames=self.points,
        interval=1,
        repeat=False)
    self.arduinoData.write("<L>")
    self.running = True
    self.ani._start()


def update_graph(self, i):
    self.xdata.append(self.k)
    while (self.arduinoData.inWaiting()==0):
        pass
    x = self.arduinoData.readline()
    strip_data = x.strip()
    split_data = x.split(",")
    self.ydata1.append(int(split_data[0])/100)
    self.ydata2.append(int(split_data[1])/100)
    self.ydata3 = int(split_data[2])
    self.line1.set_data(self.xdata, self.ydata1)
    self.line2.set_data(self.xdata, self.ydata2)
    if self.k < 50:
        self.ax1.set_ylim(min(self.ydata1)-1, max(self.ydata1) + 1)
        self.ax1.set_xlim(0, self.k)
        self.ax2.set_ylim(min(self.ydata2)-1, max(self.ydata2) + 1)
        self.ax2.set_xlim(0, self.k)
    elif self.k >= 50:
        self.ax1.set_ylim(min(self.ydata1[self.k-49:self.k])-1, max(self.ydata1[self.k-49:self.k]) + 1)
        #self.ax1.set_ylim(-1, 11)
        self.ax1.set_xlim(self.xdata[self.k-49], self.xdata[self.k-1])
        self.ax2.set_ylim(min(self.ydata2[self.k-49:self.k])-1, max(self.ydata2[self.k-49:self.k]) + 1)
        #self.ax2.set_ylim(-1, 11)
        self.ax2.set_xlim(self.xdata[self.k-49], self.xdata[self.k-1])
    if self.ydata3 >= self.limit:
        #self.points - 1:
        self.ani.event_source.stop()
        self.running = False
        self.ani = None
        self.running = not self.running
    self.k += 1

def getData(self):
    if self.ani is None:
        self.k = 0
        self.points = int(float(self.Duration_cycle.get())*60*20) + 1
        self.arduinoData.flushInput()
        self.arduinoData.write("<L>")
        return self.start()
    else:
        #self.k = 1
        self.arduinoData.write("<L>")
        self.arduinoData.flushInput()
        self.ani.event_source.start()
    self.running = not self.running
def启动(自):
self.xdata=[]
self.ydata1=[]
self.ydata2=[]
self.k=0
自限=300
self.arduinoData.flushInput()
self.points=int(float(self.Duration\u cycle.get())*60*20)+1
self.ani=animation.FuncAnimation(
赛尔夫,
self.update_图,
帧=自身点,
间隔=1,
重复(错误)
self.arduinoData.write(“”)
self.running=True
self.ani.\u start()
def更新_图(自我,i):
self.xdata.append(self.k)
while(self.arduinoData.inWaiting()==0):
通过
x=self.arduinoData.readline()
条带数据=x.条带()
split_data=x.split(“,”)
self.ydata1.append(int(拆分数据[0])/100)
self.ydata2.append(int(split_data[1])/100)
self.ydata3=int(拆分数据[2])
self.line1.set_数据(self.xdata、self.ydata1)
self.line2.set_数据(self.xdata、self.ydata2)
如果self.k<50:
self.ax1.set_ylim(最小值(self.ydata1)-1,最大值(self.ydata1)+1)
self.ax1.set_xlim(0,self.k)
self.ax2.set_ylim(最小值(self.ydata2)-1,最大值(self.ydata2)+1)
self.ax2.set_xlim(0,self.k)
elif self.k>=50:
self.ax1.set_ylim(最小值(self.ydata1[self.k-49:self.k])-1,最大值(self.ydata1[self.k-49:self.k])+1)
#self.ax1.set_ylim(-1,11)
self.ax1.set_xlim(self.xdata[self.k-49],self.xdata[self.k-1])
self.ax2.set_ylim(最小值(self.ydata2[self.k-49:self.k])-1,最大值(self.ydata2[self.k-49:self.k])+1)
#self.ax2.set_ylim(-1,11)
self.ax2.set_xlim(self.xdata[self.k-49],self.xdata[self.k-1])
如果self.ydata3>=self.limit:
#self.points-1:
self.ani.event_source.stop()
self.running=False
self.ani=无
自运行=不自运行
self.k+=1
def getData(自):
如果self.ani为无:
self.k=0
self.points=int(float(self.Duration\u cycle.get())*60*20)+1
self.arduinoData.flushInput()
self.arduinoData.write(“”)
返回self.start()
其他:
#self.k=1
self.arduinoData.write(“”)
self.arduinoData.flushInput()
self.ani.event_source.start()
自运行=不自运行

这两个问题有什么关联吗?不如果你有两个问题,问两个问题。你是在问如何无限期地运行它吗?设置
repeat=True
并删除
frames=self.points,
行。谢谢你的帮助,这正是我要找的。我应该为另一个单独问一个问题part@Novel因此,如果你的评论确实解决了这个问题,你能提供一个可以接受的答案吗?