Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重新打开GTK&;matplotlib窗口-GTK窗口为空_Python_Matplotlib_Gtk - Fatal编程技术网

Python 重新打开GTK&;matplotlib窗口-GTK窗口为空

Python 重新打开GTK&;matplotlib窗口-GTK窗口为空,python,matplotlib,gtk,Python,Matplotlib,Gtk,我的程序(使用glade使用GTK开发)接收一些数据,并可以选择显示一个单独的窗口,其中包含表示数据的matplotlib scatterplot 我的问题是,如果用户关闭图形窗口并重新打开,则不会显示任何图形。这只是一个空白的GTK窗口我确信有一个简单的修复方法,但是没有太多与我的问题相关的可用资源(或者GTK和matlplotlib集成) 我已经为我的散点图创建了模块,因此我可以轻松地重用它。我只是想让它工作,所以代码的结构并不完美 ##Scatterplot Module: import

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

我的问题是,如果用户关闭图形
窗口并重新打开,则不会显示任何图形。这只是一个空白的
GTK窗口
我确信有一个简单的修复方法,但是没有太多与我的问题相关的可用资源(或者
GTK
matlplotlib
集成)

我已经为我的
散点图创建了
模块
,因此我可以轻松地重用它。我只是想让它工作,所以代码的结构并不完美

##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()
(这只是我的代码的一个示例。)

散点图
关闭时,我调用的是
self.window.destroy
,而不是
self.window.hide
。当尝试重新打开时,我调用相同的
graph()
函数,但是如上所述,
GTK窗口不显示图形。(当我第一次打开它时,它显示得非常完美)

我的猜测:

  • 我应该调用
    .hide()
    而不是
    .destroy()
  • 散点图
    的构造函数中是否有一段代码需要再次调用以创建
  • 或者每次调用
    graph()
    时,我是否应该重新实例化
    绘图
我的解决方案: 发件人:

将两行代码移动到
show()

移动这两行代码可以在重新打开窗口时显示图形

旁注:关闭窗口时同时调用
.destroy()
.show()
。但我不确定哪一个更好。

我的解决方案: 发件人:

将两行代码移动到
show()

移动这两行代码可以在重新打开窗口时显示图形


旁注:关闭窗口时同时调用
.destroy()
.show()
。但是我不确定哪一个更好。

.hide()
将数据保存在内存中-如果您想再次显示它,这是一个好主意。你试过了吗?我试过了。不幸的是,这并不能解决问题。我有一种感觉,这是因为它没有重新绘制(或重新显示)绘图,或绘图显示的
GTK绘图区域
。用户如何“关闭”窗口,以及如何重新打开/之后调用什么函数。可能需要.show()调用。用户只能通过点击右上角的“X”来关闭窗口。当图形重新打开时,它将调用上面相同的
graph()
函数。该函数确实包含一个
.show()
调用。谢谢您的帮助。如果您单击
X
,则默认情况下窗口将被破坏。如果你想改变这一点,你必须这样做。在这种情况下,您可以真正隐藏而不是销毁数据。
.hide()
将数据保存在内存中-如果您希望能够再次显示数据,这是一个好主意。你试过了吗?我试过了。不幸的是,这并不能解决问题。我有一种感觉,这是因为它没有重新绘制(或重新显示)绘图,或绘图显示的
GTK绘图区域
。用户如何“关闭”窗口,以及如何重新打开/之后调用什么函数。可能需要.show()调用。用户只能通过点击右上角的“X”来关闭窗口。当图形重新打开时,它将调用上面相同的
graph()
函数。该函数确实包含一个
.show()
调用。谢谢您的帮助。如果您单击
X
,则默认情况下窗口将被破坏。如果你想改变这一点,你必须这样做。在这种情况下,你可以真正地隐藏它而不是摧毁它。自己找出它,然后发布答案,是一个最佳实践-+1!现在你所要做的就是“接受”你自己的答案。我会在两天后接受你的答案。谢谢。你自己想出来,然后把答案贴出来,这是最好的做法-+1!现在你所要做的就是“接受”你自己的答案。我会在两天后接受你的答案。谢谢
class ScatterPlot:
    def __init__(self):
        #remove the following two lines
        self.canvas = FigureCanvas(self.figure)
        self.window.add(self.canvas)
def show(self):
    self.canvas = FigureCanvas(self.figure)
    self.window.add(self.canvas)
    self.window.show_all()
    self.is_hidden = False