python关闭窗口代码_关于python:关闭pyplot窗口

最终编辑:

我在关闭pyplot窗口这一主题上发现,实际上可能不应该使用pyplot完成它。 SRK给出了一个很好的示例,说明如何处理将在下面的答案中更新的图。我也偶然发现了如何将pyplot图放到Tkinter窗口中,并且Tkinter比pyplot更擅长打开和关闭窗口。这是将pyplot图放到Tk窗口中的方法,这也是一个很好的例子。

/最终编辑

我希望能够显示多个图,然后能够从某些代码输入中分别关闭(从屏幕上删除)它们,但是我不知道要执行此操作的代码输入。

以下是到目前为止我尝试过的。我一直在使用show和close命令的位置,但是我从中得到的唯一真实结果是没有绘制一个或另一个图,但是我无法从屏幕上删除一个图。我一直在插入raw_input()创建暂停。

编辑:这些图是从Tkinter gui调用的,如果有更好的方法从该方向进行操作,我会很高兴听到它。

任何输入将不胜感激,谢谢。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19import matplotlib.pyplot as plt

a = range(0,10)

b = range(0,20,2)

c = range(0,30,3)

d = range(0,40,4)

plot1 = plt.figure()

plt.plot(a,b, 'r-o')

plt.show()

plt.close()

plot2 = plt.figure()

plt.plot(c,d, 'b-o')

plt.show()

plt.close()

编辑代码:这也不起作用。

1

2

3

4

5

6

7

8

9plot1 = plt.figure(1)

plt.plot(a,b, 'r-o')

plot2 = plt.figure(2)

plt.plot(c,d, 'b-o')

#plt.close(1)

#this will prevent plot1 from being displayed

plt.show()

plt.close(1) # or ('all') or (plot1)

plt.close()将关闭当前实例。

plt.close(2)将关闭图2

plt.close(plot1)将使用图plot1关闭图

plt.close('all')将关闭所有漏洞

在这里找到。

请记住,plt.show()是一个阻塞函数,因此在您上面使用的示例代码中,直到关闭窗口后才会执行plt.close(),这使其变得多余。

您可以在代码的开头使用plt.ion()使其无阻塞,尽管这还有其他含义。

在评论中进行讨论之后,我整理了一个示例,只是为了演示如何使用绘图功能。

下面我创建一个图:

1

2

3

4fig = plt.figure(figsize=plt.figaspect(0.75))

ax = fig.add_subplot(1, 1, 1)

....

par_plot, = plot(x_data,y_data, lw=2, color='red')

在这种情况下,上面的ax是一对轴的句柄。每当我想对这些轴进行操作时,都可以通过调用axes(ax)将当前轴集更改为该特定轴集。

par_plot是line2D实例的句柄。这就是所谓的艺术家。如果要更改该行的属性(例如更改ydata),可以通过引用此句柄来实现。

我还可以通过执行以下操作来创建滑块小部件:

1

2

3axsliderA = axes([0.12, 0.85, 0.16, 0.075])

sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)

sA.on_changed(update)

第一行创建滑块的新轴(称为axsliderA),第二行创建放置在轴中的滑块实例sA,第??三行指定当滑块值更改时要调用的函数(< x12>)。

我的更新功能可能看起来像这样:

1

2

3

4

5

6

7def update(val):

A = sA.val

B = sB.val

C = sC.val

y_data = A*x_data*x_data + B*x_data + C

par_plot.set_ydata(y_data)

draw()

par_plot.set_ydata(y_data)使用句柄par_plot更改Line2D对象的ydata属性。

draw()功能更新当前轴集。

放在一起:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45from pylab import *

import matplotlib.pyplot as plt

import numpy

def update(val):

A = sA.val

B = sB.val

C = sC.val

y_data = A*x_data*x_data + B*x_data + C

par_plot.set_ydata(y_data)

draw()

x_data = numpy.arange(-100,100,0.1);

fig = plt.figure(figsize=plt.figaspect(0.75))

ax = fig.add_subplot(1, 1, 1)

subplots_adjust(top=0.8)

ax.set_xlim(-100, 100);

ax.set_ylim(-100, 100);

ax.set_xlabel('X')

ax.set_ylabel('Y')

axsliderA = axes([0.12, 0.85, 0.16, 0.075])

sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)

sA.on_changed(update)

axsliderB = axes([0.43, 0.85, 0.16, 0.075])

sB = Slider(axsliderB, 'B', -30, 30.0, valinit=2)

sB.on_changed(update)

axsliderC = axes([0.74, 0.85, 0.16, 0.075])

sC = Slider(axsliderC, 'C', -30, 30.0, valinit=1)

sC.on_changed(update)

axes(ax)

A = 1;

B = 2;

C = 1;

y_data = A*x_data*x_data + B*x_data + C;

par_plot, = plot(x_data,y_data, lw=2, color='red')

show()

关于上述内容的注释:运行应用程序时,代码按顺序依次运行(我认为它会将update函数存储在内存中),直到遇到阻塞的show()。当您对其中一个滑块进行更改时,它会从内存中运行更新功能(我认为呢?)。

这就是以这种方式实现show()的原因,以便可以通过使用函数来处理数据来在后台更改值。

我尝试了这些东西,但没有用(请参阅编辑)。它确实清除了该实例的内存,但并未从屏幕上删除该图。还有其他想法吗?

香港专业教育学院增加了原因。 plt.show()是一个阻止函数。

谢谢。那么,这对我关闭显示的情节意味着什么?我猜我有一个真正的问题,那就是如何处理plt.show()函数创建的窗口。您还有其他想法可以解决吗?

您能给我更多您打算做什么的想法吗?通常,我允许用户关闭窗口,或者检测何时关闭主窗口,然后全部关闭。以您建议的方式从代码中关闭窗口不是很常见。

我有一个Tk gui,当被问到将产生绘图时,如果用户需要调整绘图,则将对一些变量进行调整,并通过调整重新生成绘图。我只是想减少用户输入,让程序在制作新图之前销毁旧图,但是我想如果用户必须手动执行操作,这不会是世界末日。您是在这种情况下说手册吗?谢谢!

我试过像您提到的那样使用plt.ion(),但是这样一来,无论是否有plt.close(),我都无法在屏幕上保留绘图。另外,如果我使用raw_input(),则它不会绘制数据,并且程序会挂起,直到我输入数据为止。这些是您提到的"其他含义"吗?

Ja,python真的不应该与plt.ion()一起使用。 show()函数由于某种原因被阻止。我会在答案编辑中详细说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值