Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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 Matplotlib应用程序,用于从主打印窗口打开和关闭多个打印窗口_Python_Matplotlib - Fatal编程技术网

Python Matplotlib应用程序,用于从主打印窗口打开和关闭多个打印窗口

Python Matplotlib应用程序,用于从主打印窗口打开和关闭多个打印窗口,python,matplotlib,Python,Matplotlib,很久以前,我用matplotlib编写了一个GUI,尽管代码很复杂,但它仍能完成我所期望的功能。如果我现在重写,我会改变它背后的全部逻辑,但我现在负担不起。我有一个非常最后的功能,我想补充,但我卡住了 基本上我有一个主要的情节,当按下一个按钮调用一个类。这个类打开了第二个绘图,在那里我做了一些事情,然后关闭了它。关闭它之后,我需要访问这个类的属性,这些属性是通过与第二个绘图交互定义的。然而,当我试图访问属性时,我得到了一个NameError 这是一个最小的代码,重新创建我的问题。如果您运行它,然

很久以前,我用
matplotlib
编写了一个GUI,尽管代码很复杂,但它仍能完成我所期望的功能。如果我现在重写,我会改变它背后的全部逻辑,但我现在负担不起。我有一个非常最后的功能,我想补充,但我卡住了

基本上我有一个主要的情节,当按下一个按钮调用一个类。这个类打开了第二个绘图,在那里我做了一些事情,然后关闭了它。关闭它之后,我需要访问这个类的属性,这些属性是通过与第二个绘图交互定义的。然而,当我试图访问属性时,我得到了一个NameError

这是一个最小的代码,重新创建我的问题。如果您运行它,然后在第一个绘图上按“Ok”,然后在第二个绘图上按“Ok”,最后在第一个绘图上按“Next”,您将得到NameError

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Button

fig, ax = plt.subplots(1)

img = np.zeros((600,600))
ax_b = plt.axes([0.2, 0.2, 0.2, 0.2])
ok_b = Button(ax_b, 'Ok')
ax_next = plt.axes([0.6, 0.2, 0.2, 0.2])
next_b = Button(ax_next, 'Next')


class foo:
    def __init__(self):
        self.fig1, ax1 = plt.subplots(1)
        ax_b_1 = plt.axes([0.2, 0.2, 0.2, 0.2])
        ok_b_1 = Button(ax_b_1, 'Ok')
        ok_b_1.on_clicked(self.ok1)
        ax1.imshow(img)
        plt.show()

    def ok1(self, event):
        self.a = 3
        plt.close(self.fig1)

def ok(event):
    global b
    b = foo()
    print('Figure one closed')

def next(event):
    print(b.a)
    print('Next')

ok_b.on_clicked(ok)
next_b.on_clicked(next)

ax.imshow(img)
plt.show()
print(b.a)
print('End')
基本上,当我按下主绘图上的
ok_b
按钮时,链接到它的事件调用类
foo
,该类被分配给名为
b
的变量,并创建/打开一个新绘图。当我在第二个绘图上按
ok\u b\u 1
an时,我将一些属性分配给
foo
类,然后调用
plt.close()
,第二个绘图将正确关闭。我们的想法是回到仍然打开的主绘图,在按下
next
时,我想访问
foo
属性,但我会得到一个NamedError(见下文),即使我在
ok\u b
调用的函数
ok
中有
global b
。问题是,如果我同时关闭主窗口,
b
的属性实际上是可以访问的,并且可以正确打印

按下
下一步后

NameError: name 'b' is not defined
关闭主窗口后:

Figure one closed
3
End
现在有没有人能在不太改变逻辑的情况下快速解决这个问题?非常感谢,并为我知道我应该改变的复杂逻辑提前道歉

注意:我在Windows1064位上使用了带有matplotlib 3.1.2的Python 3.7.4-64位

编辑工作备选方案: 基本上,我只需将连接移动到init方法之外的单击事件和plt.show()上的按钮。我想这是因为它在某个地方陷入了init中,它没有退出,我现在实际上没有退出。以下方面应起作用:

class foo:
    def __init__(self):
        self.fig1, ax1 = plt.subplots(1)
        ax_b_1 = plt.axes([0.2, 0.2, 0.2, 0.2])
        self.ok_b_1 = Button(ax_b_1, 'Ok')
        ax1.imshow(img)

    def ok1(self, event):
        self.a = 3
        plt.close(self.fig1)

def ok(event):
    global b
    b = foo()
    b.ok_b_1.on_clicked(b.ok1)
    plt.show()
    print('Figure one closed')

def next(event):
    print(b.a)
    print('Next')

ok_b.on_clicked(ok)
next_b.on_clicked(next)

ax.imshow(img)
plt.show()
print(b.a)
print('End')
工作解决方案2:

由于不建议在关闭前一次调用plt.show()打开的所有窗口之前调用多个plt.show(),以便处理多个打印窗口,因此最好将它们嵌入tkinter窗口中。按照matplotlib官方教程,通过这种方式,我们可以调用tkinter方法root.quit()和root.destroy()


Ok找到了解决方案!我将添加它作为对遇到相同问题的人的评论。我添加了两个我发现的解决方案,第二个是我认为最好的解决方案。Nok找到了解决方案!我将添加它作为对遇到相同问题的人的评论。我添加了两个我发现的解决方案,第二个在我看来是最好的