1

私のプログラム (をGTK使用して開発glade) は、いくつかのデータを受け取り、データを表す を含む別のウィンドウを表示するオプションがありmatplotlib scatterplotます。

私の問題は、ユーザーがグラフを閉じてwindow再度開いた場合、グラフが表示されないことです。それは単なる空白GTK Windowです。簡単な修正があると確信していますが、私の問題 (またはその問題の統合) に関連する利用可能なリソースはあまりありませGTKmatlplotlib

簡単に再利用できるようにModule自分用に作成しました。scatterplot私はそれを機能させようとしているだけなので、コードは完全に構造化されていません。

##Scatterplot Module:

import gtk
import matplotlib
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
from matplotlib.figure import Figure


class ScatterPlot:
    def __init__(self):
       self.window = gtk.Window()
       self.window.connect("destroy", lambda x: self.destroy())
       self.window.set_default_size(500,400)
       self.is_hidden = False

       self.figure = Figure(figsize = (5,4), dpi=100)
       self.ax = self.figure
       self.ax = self.ax.add_subplot(111)
       self.canvas = FigureCanvas(self.figure)
       self.window.add(self.canvas)

       self.Xs = list()
       self.Ys = list()

   def set_axis(self, xLimit = (0,384) , yLimit = (0,100)):
       self.ax.set_xlim(xLimit)
       self.ax.set_ylim(yLimit)

   def plot(self, xs, ys):
       self.Xs.extend([xs])
       self.Ys.extend([ys])
       self.ax.plot(xs,ys,'bo')

   def update(self):
       self.window.add(self.canvas)

   def set_title(self, title):
       self.ax.set_title(title)

   def show(self):
       self.window.show_all()
       self.is_hidden = False

   def hide(self):
       self.window.hide()
       self.is_hidden = True

   def destroy(self):
       self.window.destroy()

モジュールを次のように呼び出します。

class GUI:
    def __init__(self):
        self.scatterplot = scatterplot.ScatterPlot()

        #When the user presses the "Graph" button it calls the following function
    def graph():
        self.scatterplot.plot(someDataX, someDataY)
        self.scatterplot.set_axis()
        self.scatterplot.set_title("Some Title")
        self.scatterplot.show()

(これは、私のコードがどのように見えるかの単なる例です。)

が閉じているときは、代わりにscatterplot呼び出しています。再開しようとすると、同じ関数を呼び出しますが、上記のようにグラフが表示されません。(最初に開いたときは、完全に表示されます)self.window.destroyself.window.hidegraph()GTK Window

私の推測:

  • .hide()の代わりに電話する必要があり.destroy()ますか?
  • scatterplotを作成するために再度呼び出す必要があるコードがのコンストラクタにありplotますか?
  • または、呼び出されるplotたびに再インスタンス化する必要がありますか?graph()
4

1 に答える 1

1

私の解決策:

から:

class ScatterPlot:
    def __init__(self):
        #remove the following two lines
        self.canvas = FigureCanvas(self.figure)
        self.window.add(self.canvas)

2 行のコードを次の場所に移動します。show()

def show(self):
    self.canvas = FigureCanvas(self.figure)
    self.window.add(self.canvas)
    self.window.show_all()
    self.is_hidden = False

この 2 行のコードを移動すると、ウィンドウを再度開いたときにグラフが表示されるようになります。

補足:ウィンドウを閉じるときに、.destroy()または両方を呼び出すと機能します。.show()どちらが優れているかはわかりません。

于 2013-02-01T14:10:50.923 に答える