Matplotlib, Pylab с использованием TKAgg: обнаружение PyEval_RestoreThread: NULL tstate при использовании plt.ion () на win32 - PullRequest
2 голосов
/ 21 октября 2010

РЕДАКТИРОВАТЬ:

Бах, наконец, нашел обсуждение ошибки времени выполнения, хотя она сосредоточена на использовании PythonWin, который я не устанавливал в то время.После установки PythonWin и настройки GTK (согласно более раннему вопросу ) я все еще сталкивался с ошибкой.Решением здесь для обсуждения было добавить plt.close () после цикла for.Кажется, это работает.

Однако:

Из командной строки окно все еще не перемещается во время печати.При выходе PyEval_RestoreThread больше не сталкивается с NULL tstate.Было бы неплохо разрешить перемещать окно во время печати. ​​


Исходное сообщение:

Примечание. Все описанные проблемы возникают при запуске из командной строки.Подобные причуды встречаются при запуске из оболочки IDLE (-n), как отмечено в разделе «Дополнительная, возможно, несущественная информация».

Мой код правильно строит линию, и сразу после построения я получаю:

"Неустранимая ошибка Python: PyEval_RestoreThread: NULL tstate
Это приложение запросило среду выполнения завершить еенеобычным способом. Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации. "

Код выглядит следующим образом:

import matplotlib as mpl  
mpl.use("TKAgg")  
import pylab as plt  
import numpy as np  

Line = mpl.lines.Line2D  
x = np.linspace(-1,1,50)  
y=np.sin(x*np.pi)  

plt.ion()  

fig = plt.gcf()  
ax = fig.gca()  
ax.add_line(Line([x],[y]))  

plt.draw()

Код хорош при комментировании plt.ion (), но тогда ничего не отображается.
Хотя plt.show () будет работать в этом примере, цель состоит в том, чтобы использовать интерактив для создания грубой анимации с помощью следующего:

import matplotlib as mpl
mpl.use("TKAgg")

import pylab as plt
import numpy as np

plt.ion()

Line = mpl.lines.Line2D

x = np.linspace(-1,1,50)
for i in xrange(10):
    y = (1.0+i/9.0) * np.sin(x*np.pi)
    plt.clf()
    fig = plt.gcf()
    ax = fig.gca()
    ax.add_line(Line([x],[y]))
    plt.draw()

Каждая итерация правильно отображаетсоответствующая строка и любой код после цикла, выполняемого до фатальной ошибки, что можно продемонстрировать, добавив следующее сразу после цикла for:

raw_input("no error yet: ")
print "here it comes"

Я понимаю, что уничтожение фигуры и создание новойфигура и новые оси не могут быть эффективными или даже хорошей практикой.Тем не менее, проблема все еще, кажется, связана с plt.ion (), так как ее комментирование не приводит к ошибкам.

Если решение хорошо документировано, и я пропустил его в своих поисках, пожалуйста, смело указывайте на это и, возможно, предоставьте ссылку на него.Это было бы намного предпочтительнее, если альтернатива столкнулась с новой проблемой.

Если ответ заключается в том, чтобы управлять графикой более напрямую, чем при использовании pylab, я более чем готов изучить эту опцию.

Дополнительная, возможно, не относящаяся к делу информация:

  • Когда не используется raw_input () после цикла for, окно не перемещается при выполнении второго кода.
  • Если используется raw_input (), окно можно перемещать после построения графика, пока программа ожидает raw_input ()
  • Проблема одинакова при запуске из оболочки IDLE (-no подпроцесс):
    • Окно не может быть перемещено при построении, но не встречается фатальная ошибка.
    • Окно можетперемещаться после построения графика, даже без использования raw_input ()
  • Из командной строки или оболочки IDLE каждый график отображается правильно, пока окно неподвижно

Спасибозаранее за любые предложения / советы.

...