web-dev-qa-db-ja.com

FigureCanvasTkAggは、Figureが更新されるとサイズを変更します

私はPythonのtkinter guiに埋め込まれたmatplotlibの図に取り組んでいます。

最初に、以前に作成されたオブジェクトを含むFigureCanvasTkAggが作成されます。このオブジェクトには、matplotlibのFigureが含まれており、それが描画されます。この部分は完璧に機能します。その後、ユーザーのアクションに基づいてキャンバス/そのコンテンツを更新したいと思います。キャンバスを更新するメソッドが呼び出されると、Figureオブジェクトが更新され、キャンバスが再描画されます。これも機能し、図が更新されますが、奇妙な理由でキャンバスのサイズが変更されるため、元のサイズの約4分の1に縮小されます。キャンバスのサイズを印刷すると、サイズが変更されていることがわかります。

リフレッシュ後、キャンバスのサイズを元のサイズに戻そうとしましたが、成功しませんでした。

どんな入力でもありがたいです。コードの短縮版を追加しました。

    #canvas object which is displayed on the gui
    class Canvas:
        def __init__(self, parent):
            #the map_figure object is create
            self.map_figure = map_figure()
            #the matplotlib figure is extracted from the map_figure
            self.figure = self.map_figure.get_figure()
            #the canvas is created using the figure and the parent
            self.canvas = FigureCanvasTkAgg(self.figure, master=parent)
            #I tried both, to manually set the canvas size to the window dimensions (which are
            #described by w and h and using the .pack() parameters, both are working fine
            self.canvas.get_tk_widget().config(width=w,height=h)
            #self.canvas.get_tk_widget().pack(fill='both', expand=True)
            self.canvas.get_tk_widget().pack()
            #canvas is drawn
            self.canvas.draw()
            #its size is printed
            print(self.get_size())

       def refresh(self, parent, point):
            #the map_figure of the canvas is refresh
            self.map_figure.refresh(data)
            #the matplotlib figure is extracted  again
            self.canvas.figure = self.map_figure.get_figure()
            #canvas is redrawn
            self.canvas.draw()
            #the canvas size is now different for some reason even after calling 
            #self.canvas.get_tk_widget().config(width=w,height=h) before this again
            print(self.canvas.get_width_height())

    #the map_figure class if relevant
    class map_figure:
        def __init__(self, data):
            self.figure = self.create_figure(data)

        def get_figure(self):
            return self.figure

        def create_figure(self, data): 
            #creating a matplotlib figure, closing if there was one before
            plt.close(fig=None)
            fig = plt.figure()
            #creating a figure using the data here
            return fig

        #refreshing the figure using new data
        def refresh(self, data):
            self.figure = self.create_figure(data)

ここにも私の問題を視覚化する2つの画像があります。

前 - State by initialization / before user action

State after user action

4
wittn

clf()

更新するたびに図を閉じる代わりに、図をクリアすることができます。

def create_figure(self, date): 
    #creating a matplotlib figure, closing if there was one before
    try:
        self.figure.clf()
        fig = self.figure
    except:
        fig = plt.figure()
    #creating a figure using the data here
    ...
1
SergioR