Ткинтер Матплотлиб, бэкэнд конфликт? - PullRequest
2 голосов
/ 20 марта 2012

Я довольно новичок в python, но я провел последнюю неделю, пытаясь написать программное обеспечение для визуализации какой-то утомительной штуки.

Основная кинематика: пользователь вводит всю необходимую информацию в графический интерфейснажмите «Продолжить», и у меня есть другая большая функция для генерации всей графики.

Это работало, но проблема заключалась в том, что когда я запускал функцию, которая длится около 2 минут, окно tkinter зависало.Я прочитал, что я должен использовать темы.Потом я нашел это: http://uucode.com/texts/pylongopgui/pyguiapp.html Это пример, который в основном делает то, что я хочу, плюс некоторые другие вещи.

Я сейчас пытаюсь адаптировать свой код, чтобы он соответствовал этому.

И вот моя проблема: кажется, что все работает нормально, за исключением того, что в какой-то момент в моей функции появляется новое окно с именем "tk", и все останавливается.

Все останавливается в этот момент:

# On trace les fils de chaine
for i in range(0, Couches_Trame + 1):
    t = np.arange(0, np.pi, 0.1)
    plt.figure(i)
    plt.title('Plan de Trame ' + str(i+1), fontsize = '16')
    ax = plt.gca()
    ax.yaxis.set_visible(False)
    ax.xaxis.set_visible(False)
    plt.axis([-1, Plans, Fils_Chaine + 1, -1])
    for j in range(0,Plans):
        for k in range(0,Fils_Chaine):
            plt.fill_between(np.cos(t)/8+j, np.sin(t+np.pi)/8+k+0.5, \
            np.sin(t)/8+k+0.5, color='r')
    plt.savefig('Blabla'+int(i))
plt.figure(Couches_Trame)
plt.title('Plan de Trame: Projection')

Когда я запускаю его напрямую, без использования Tkinter, все работает нормально, поэтому я понятия не имею, с чем это связано.

Также я попытался заменить этот фрагмент кода бесконечным циклом следующим образом:

i=1
while i > 0:
    i=i+1
    print(i)

Это работает и ничего не замерзает.Но потом я попробовал это:

i=1
while i > 0:
    i=i+1
    plt.plot((i,i))

И все зависает, и окно, называемое "tk", всплывает и мгновенно зависает.

Я где-то читал, что это может быть конфликт между Tkinter иБэкэнд matplotlib, но это все, и это мне не сильно помогло.

Редактировать: я не знаю, поможет ли это, но я использую Python Portble 2.7.2.1

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Я не могу писать комментарии, но несколько вещей, которые нужно проверить:

  • в командной строке python, попробуйте построить очень простой график. E.g.:

    >>> import pyplot
    >>> pyplot.plot([1,3,1,3,1])
    

Я предполагаю, что это покажет окно ТЗ, но затем остановится.

  • посмотрим, действительно ли работает Tkinter. попробуйте например:

    >>> import Tkinter
    >>> import _tkinter
    >>> Tkinter._test()
    

Последняя команда должна показать небольшое окно с кнопками.

Кроме того, вы на самом деле не указываете, что вы подразумеваете под «заморозкой»:

  • Ваша система полностью заблокирована?

  • скрипт блокируется? Или вы можете закрыть окно, и сценарии просто останавливается?

  • что-то рисуется, или просто появляется пустое окно TK?

С другой стороны, поскольку вы упоминаете потоки, возможно, вы столкнулись с общей проблемой графического интерфейса: графический интерфейс ожидает ввода данных пользователем. Если вы хотите, чтобы он ждал этого и в то же время делал вычисления, последние действительно должны быть в отдельном потоке. Опять же, если вы хотите обновлять график каждый раз, когда вычисляется новый показатель, в этом не должно быть необходимости. Смотрите, например http://matplotlib.sourceforge.net/examples/animation/simple_anim_tkagg.html

Наконец, это может помочь, если вы укажете свою ОС, если речь идет об отладке вашей установки. И я предполагаю, что Python Portble - это портативный Python.

0 голосов
/ 27 мая 2018

Попробуйте закрыть отображение matplotlib перед открытием окна Tkinter:

plt.close()
tk = Tkinter()
...

Это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...