<p>我有一个处理Modbus通信的Python脚本。我添加的一个特性是一个“图形”,它显示响应时间以及一条彩色编码线,指示响应是成功的、有异常的还是错误的。这个图形只是Tkinter的一个可滚动的画布小部件。在</p>
<p>在绘制一定数量的线后,旧的线将被删除,然后在末尾添加一个新的。对于本例,我将其设置为10,这意味着画布上一次的行数永远不会超过10行。在</p>
<p>代码正常工作,但此函数中存在内存泄漏。我让它运行了大约24小时,24小时后占用了大约6倍的内存。函数是一个较大类的一部分。在</p>
<p>我目前的猜测是,我的代码导致画布大小不断“膨胀”,这会慢慢消耗内存。在</p>
<pre><code>self.lineList = []
self.xPos = 0
def UpdateResponseTimeGraph(self):
if not self.graphQueue.empty():
temp = self.graphQueue.get() #pull from queue. A separate thread handles calculating the length and color of the line.
self.graphQueue.task_done()
lineName = temp[0] #assign queue values to variables
lineLength = temp[1]
lineColor = temp[2]
if len(self.lineList) >= 10: #if more than 10 lines are on the graph, delete the first one.
self.responseTimeCanvas.delete(self.lineList[0])
del self.lineList[0]
#Add line to canvas and a list so it can be referenced.
self.lineList.append(self.responseTimeCanvas.create_rectangle(self.xPos, self.responseWidth, self.xPos + 4, self.responseWidth-lineLength,
fill=lineColor, outline=''))
self.xPos += 5 #will cause the next line to start 5 pixels later. MEMORY LEAK HERE?
self.responseTimeCanvas.config(scrollregion=self.responseTimeCanvas.bbox(ALL))
self.responseTimeCanvas.xview_moveto(1.0) #move to the end of the canvas which is scrollable.
self.graphFrame.after(10, self.UpdateResponseTimeGraph)
</code></pre>
<p>一种解决方案是,一旦达到极限,就可以循环回图的开头,但我不想这样做,因为这可能会混淆图形的起始位置。通常我收到的回复远远多于10条。在</p>
<p><strong>编辑:</strong></p>
<p>我仍在做跟踪和错误的工作,但看起来只要行属性不通过itemconfig更改,那么内存泄漏就可以通过Bryan的建议消除。下面的代码应该可以按原样运行,如果您使用的是python2.7,请将import语句从tkinter更改为tkinter(小写与大写t)。这个代码会有内存泄漏。注释掉itemconfig行,它将被删除。在</p>
^{pr2}$