2013-02-01 101 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的限制。谢谢。 –