Функция close () в Matplotlib вызывает закрытие окна Tkinter GUI - PullRequest
0 голосов
/ 07 февраля 2019

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

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

Вместо plt.close () я попытался использовать plt.clf () , plt.gcf (). clear () , fig.clear () и ни один из них не работал.Они заставляют окно GUI оставаться, но они вызывают проблему с памятью.

Кто-нибудь знает, почему plt.close () закрывает окно графического интерфейса Tkinter и как его можно предотвратить? Мне нужен графический интерфейс, чтобы остаться и вывести объекты из памяти, когда я 'с ними покончено.

Я использую Python3.6.3rc1, Windows 7, Tkinter 8.6 и Matplotlib 3.0.2.

from tkinter import *
import matplotlib.pyplot as plt
import os

def make_plot():
    x = [1, 2, 3, 4, 5]
    y = [1, 2, 3, 4, 5]
    for j in range(0,20):
            fig = plt.figure(num=None, figsize=(20, 10), dpi=200, facecolor='w', edgecolor='w')
            plt.plot(x,y)
            plt.xlabel("x")
            plt.ylabel("y")
            out_name = os.getcwd()+ "\\" +  str(j)+".png"
            print(out_name)
            plt.savefig(out_name)
            plt.close()

class Application(Frame):
    def run_make_plot(self):
        make_plot()

    def createWidgets(self):
        self.button = Button(self)
        self.button["text"] = "Plot"
        self.button["command"] = self.run_make_plot
        self.button.pack()

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

1 Ответ

0 голосов
/ 09 февраля 2019

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

import matplotlib
matplotlib.use("Agg")

сверху (до импорта pyplot) избавит от проблемы.Кроме того, вы можете удалить root.destroy(), потому что это не кажется необходимым и в противном случае может привести к ошибке.

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