我有了2個非常簡單的線程的程序:運行與matplotlib原因蟒蛇崩潰線程
- 一個用於監聽串口
- 一個用於文本UI
我也有matplotlib
animation
在我main()
運行。它有一個scope
類,它是從matplotlib的例子。
當程序開始運行,它顯示的情節,一切都OK。問題是,只要用戶輸入密鑰,程序崩潰,python就會退出,並帶有致命錯誤。
ui
線程與matplotlib
和scope
類無關。如果我刪除創建圖的代碼,ui
線程沒有問題,並且程序運行順利。我也注意到matplotlib
我的系統上使用tkinter
創建窗口。
你有爲什麼matplotlib
animation
導致問題的任何提示或經驗?不能線程與matplotlib
plot
使用嗎?
我在命令行窗口中Windows7
與Python 2.7
運行此。
matplotlib
版本:2.0.2 Tkinter
版本:8.5
錯誤:
Fatal Python error: GC object already tracked
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
或者這個錯誤:
TclStackFree: incorrect freePtr. Call out of sequence?
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
代碼:
import threading
import serial
from matplotlib.lines import Line2D
import matplotlib.pyplot as plt
import matplotlib.animation as animation
class listner(threading.Thread):
def __init__(self,port):
threading.Thread.__init__(self)
self.sport=None
self.is_running=True
self.init_port(port)
def run(self):
print ' Reading from Port'
while self.is_running:
try:
self.sport.read(1)
except:
print 'Error reading port'
def init_port(self,port):
print '1'
if self.sport==None or not self.sport.is_open :
try:
self.sport = serial.Serial(port,115200)
self.sport.timeout = 1
self.sport.reset_input_buffer()
self.sport.reset_output_buffer()
self.port_open=True
except:
print " Port error Listener Initing\n",self.port_open,'\n',self.sport
else:
pass
def process(self):
pass
class ui(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.running = True
def run(self):
print 'Starting UI:\n'
while self.running:
print ' Enter input ''S'':\n'
user = raw_input()
def main(port):
listner_thread = None
try:
listner_thread = listner(port)
listner_thread.start();
except:
print "Listener Thread Failed To Start"
return
ui_thread=None
try:
ui_thread = ui()
ui_thread.start()
except:
print "UI Thread Failed To Start"
return
run_charts()
def run_charts():
fig, (ax1, ax2) = plt.subplots(2, 1)
scope1 = Scope(ax1)
ani1 = animation.FuncAnimation(fig, scope1.update, emit_ch1, interval=10,blit=True)
scope2 = Scope(ax2)
ani2 = animation.FuncAnimation(fig, scope2.update, emit_ch2, interval=10,blit=True)
plt.show()
def emit_ch1():
yield 0.001
def emit_ch2():
yield -0.001
class Scope(object):
def __init__(self, ax, maxt=2, dt=0.02):
self.ax = ax
self.dt = dt
self.maxt = maxt
self.tdata = [0]
self.ydata = [0]
self.line = Line2D(self.tdata, self.ydata)
self.ax.add_line(self.line)
self.ax.set_ylim(-.009, 0.009)
self.ax.set_xlim(0, self.maxt)
def update(self, y):
t = self.tdata[-1] + self.dt
self.tdata.append(t)
self.ydata.append(y)
self.line.set_data(self.tdata, self.ydata)
return self.line,
if __name__ == '__main__':
main('COM11')
這可能是人們更容易地調試這個,如果你提供的是仍然有這個問題更小例子。請參閱https:// stackoverflow。COM /幫助/ MCVE – timotree
當我在Python把這個代碼中,我得到的錯誤: 'AttributeError的:對象類型「聽者」有listner'' 因爲這行沒有屬性」: 'listner_thread = listner.listner(端口) ' 你確定你所提供的代碼是工作,直到用戶點擊一個鍵的代碼? – timotree
我更新了代碼。這是完全正常工作並重現問題。 –