2013-02-01 147 views
1

我的程序(使用glade開發的GTK)接收一些數據並可以選擇顯示包含表示數據的matplotlib scatterplot的單獨窗口。重新打開GTK和matplotlib窗口 - GTK窗口爲空

我的問題是,如果用戶關閉圖形window並重新打開它,則不會顯示圖形。這只是一個空白的GTK Window我確定有一個簡單的修復方法,但沒有太多可用的資源與我的問題相關(或針對此問題集成了GTKmatlplotlib)。

我爲我的scatterplot創建了一個Module,因此我可以輕鬆地重複使用它。我只是試圖讓它工作,所以代碼的結構並不完美。

##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.destroy代替的self.window.hide。當嘗試重新打開時,我會調用相同的graph()函數,但如上所述,GTK Window不會顯示圖形。 (當我第一次打開它,它完美顯示)

我的猜測:

  • 我應該打電話.hide()代替.destroy()
  • scatterplot的構造函數中是否有一段代碼需要再次調用以創建plot
  • 或者我應該每次調用graph()時都要重新實例化plot
+0

'.hide()'將數據保存在內存中 - 如果您想要再次顯示它,這是一個好主意。你試過了嗎? – Floris

+0

我做到了。不幸的是,這並沒有解決問題。我有一種感覺,那是因爲它沒有重繪(或重新顯示)該圖或顯示該圖的「GTK繪圖區」。 –

+0

用戶如何「關閉」窗口?以及它如何重新顯示 - 打開/之後發生什麼功能。一個.show()調用可能是需要的。 – Floris

回答

1

我的解決方案:

來自:

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

移動的兩行代碼到show()

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

移動的這兩行代碼允許將被顯示的圖形時重新打開窗戶。

旁註:在關閉窗口時調用.destroy().show()都可以。我不確定哪一個更好。

+0

自己找出答案,然後發佈答案,是一個最佳實踐 - +1!現在你所要做的就是「接受」你自己的答案。 – Floris

+0

我會在兩天內接受來自SO的限制。謝謝。 –