重新开放GTK& matplotlib窗口 - GTK窗口是空白的

时间:2013-02-01 13:49:09

标签: python matplotlib gtk

我的程序(使用GTK使用glade开发)接收一些数据,并且可以选择显示包含代表数据的matplotlib scatterplot的单独窗口。

我的问题是,如果用户关闭图表window并重新打开它,则不会显示图表。它只是一个空白GTK Window我确信有一个简单的修复,但没有太多可用资源与我的问题相关(或GTK和{{1这个问题的整合)。

我为matlplotlib创建了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.destroy。尝试重新打开时,我会调用相同的self.window.hide函数,但如上所述,graph()不会显示图表。 (当我第一次打开它时,它显示完美)

我的推测:

  • 我应该拨打GTK Window而不是.hide()吗?
  • .destroy()的构造函数中是否有一段代码需要再次调用以创建scatterplot
  • 或者我应该在每次调用plot时重新实例化plot吗?

1 个答案:

答案 0 :(得分: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()都可以。我不确定哪一个更好。