Почему после очистки текущей фигуры в окне занято место? - PullRequest
0 голосов
/ 02 апреля 2019

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

Есть ли что-то еще, о чем я должен знать при работе с FigureCanvasTkAgg или matplotlib.pyplot?

Я пробовал plt.cla (), plt.clf (), а также plt.close (). Похоже, что и plt.cla (), и plt.clf () удаляют данные, а plt.close () закрывает приложение, что нежелательно.

class PlotPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.canvas = None
        self.xlist, self.ylist = [1,2,3,4], [1,4,9,16]
        label = tk.Label(self, text="PlotPage")
        label.pack(pady=5)
        self.f = None

        buttonPlot = tk.Button(self, text="Show Plot", command=self.plot)
        buttonPlot.pack(pady=5)

        buttonClear = tk.Button(self, text="Clear Plot Field", command = self.clearPlotPage)
        buttonClear.pack(pady=5)

    def plot(self):
        if self.canvas == None:
            if self.f == None:
                self.f = plt.figure(1,figsize=(8,4), dpi=100)   
            plt.plot(self.xlist,self.ylist, 'ro')

            self.canvas = FigureCanvasTkAgg(self.f, self)
            self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
            self.canvas.draw()

            toolbar = NavigationToolbar2Tk(self.canvas, self)
            toolbar.update()
            self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

            print("Stuff has been plotted")
        else:
            print("Plot already plotted please clear first")\

    def clearPlotPage(self):
#         self.f == None
#         plt.clf()
        plt.cla()
        self.canvas.draw()
        self.canvas = None
        print("Plot Page has been cleared")

Я надеюсь, что смогу построить данные в окне tkinter, а затем очистить оси для новых данных, которые будут нанесены на тот же рисунок; однако в действительности происходит следующее: после очистки фигуры / осей данные наносятся на новую фигуру / оси, а не на очищенную фигуру / оси.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

В качестве альтернативы ответа Генри , я бы посоветовал вам не создавать каждый раз новую фигуру. Вместо этого вы должны сохранить свою фигуру и холст (и, возможно, оси) и обновлять только содержимое графика. Вот так (этот код на данный момент не проверен):

class PlotPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.f = plt.figure(1, figsize=(8, 4), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.f, self)
        self.ax = self.f.add_subplot(111)
        self.isPlotted = False

        self.xlist, self.ylist = [1, 2, 3, 4], [1, 4, 9, 16]
        label = tk.Label(self, text="PlotPage")
        label.pack(pady=5)

        buttonPlot = tk.Button(self, text="Show Plot", command=self.plot)
        buttonPlot.pack(pady=5)

        buttonClear = tk.Button(self, text="Clear Plot Field", command=self.clearPlotPage)
        buttonClear.pack(pady=5)

    def plot(self):
        if not self.isPlotted:
            self.ax.plot(self.xlist, self.ylist, 'ro')

            self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
            self.canvas.draw()

            toolbar = NavigationToolbar2Tk(self.canvas, self)
            toolbar.update()
            self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

            print("Stuff has been plotted")
        else:
            print("Plot already plotted please clear first")

    def clearPlotPage(self):
        self.ax.clear()
        self.canvas.draw()
        print("Plot Page has been cleared")
0 голосов
/ 02 апреля 2019

Вы можете позвонить canvas.get_tk_widget().destroy().

class PlotPage(tk.Frame):
    def __init__(self, parent):
        ...

    def plot(self):
        if self.canvas == None:
            if self.f == None:
                self.f = plt.figure(1,figsize=(8,4), dpi=100)
            plt.plot(self.xlist,self.ylist, 'ro')
            self.canvas = FigureCanvasTkAgg(self.f, self)
            self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
            toolbar = NavigationToolbar2Tk(self.canvas, self)
            toolbar.update()
            print("Stuff has been plotted")
        else:
            print("Plot already plotted please clear first")

    def clearPlotPage(self):
        plt.cla()
        self.canvas.get_tk_widget().destroy()
        self.canvas = None
        print("Plot Page has been cleared")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...