python matplotlib 如何使用类打开图像

标签 python image class matplotlib

我对 matplotlib 还很陌生,我尝试编写一个类来通过 matplotlib 打开和关闭图像,代码如下:

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt

class ptlShow():
    def __init__(self, file, pos):
        plt.rcParams['toolbar'] = 'None'

        fig, ax = plt.subplots(figsize=(1, 1.4))
        fig.subplots_adjust(0, 0, 1, 1)

        ax.axis("off")

        im = plt.imread(file)
        ax.imshow(im)


        fig.canvas.manager.window.overrideredirect(1)
        plt.get_current_fig_manager().window.wm_geometry(pos)#  
        plt.show()

    def close(self):
        plt.close




a = ptlShow('1.jpg', '+700+100')
b = ptlShow('2.jpg', '+500+100')

a.close()
b.close()

但最后我只有一个图像实例并且关闭不起作用,我做错了什么!谢谢!

最佳答案

plt.show() 意味着在脚本结束时仅调用一次,因为它接管了事件循环。在所有数字都关闭之前,后面的代码不会被执行。

您可能希望通过单击来关闭图窗,因此您可以将 close 方法注册到 button_press_event。请注意,plt.close 只是一个函数 - 您需要调用它:plt.close()

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt


class ptlShow():
    def __init__(self, file, pos):
        plt.rcParams['toolbar'] = 'None'

        self.fig, ax = plt.subplots(figsize=(1, 1.4))
        self.fig.subplots_adjust(0, 0, 1, 1)

        ax.axis("off")

        im = plt.imread(file)
        ax.imshow(im)

        self.fig.canvas.manager.window.overrideredirect(1)
        self.fig.canvas.manager.window.wm_geometry(pos)# 
        self.fig.canvas.mpl_connect("button_press_event", self.close)

    def close(self, event=None):
        plt.close(self.fig)

a = ptlShow('1.jpg', '+700+100')
b = ptlShow('2.jpg', '+500+100')

plt.show()

为了在一段时间t后关闭窗口,可以使用tkinter.after方法,.after(t, func):

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt


class ptlShow():
    def __init__(self, file, pos):
        plt.rcParams['toolbar'] = 'None'

        self.fig, ax = plt.subplots(figsize=(1, 1.4))
        self.fig.subplots_adjust(0, 0, 1, 1)

        ax.axis("off")

        im = plt.imread(file)
        ax.imshow(im)


        self.fig.canvas.manager.window.overrideredirect(1)
        self.fig.canvas.manager.window.wm_geometry(pos)# 
        self.fig.canvas.mpl_connect("button_press_event", self.close)
        self.fig.canvas.mpl_connect("draw_event", self.delayed_close)

    def delayed_close(self,event=None):
        self.fig.canvas.manager.window.after(1000, self.close)
    def close(self, event=None):
        plt.close(self.fig)

a = ptlShow('house.png', '+700+100')
b = ptlShow('house.png', '+500+100')

plt.show()

关于python matplotlib 如何使用类打开图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47147748/

相关文章:

python - 我可以在使用 aws_cdk 创建 lambda 后立即调用它吗?

python - 查找图像中红色像素的坐标

java - 如何使用Java Reflect获取类级别注释值?

node.js - 从 Node.js 中的另一个自定义模块访问自定义模块的正确路径表示法

c++ - 在运行时使用 'const' 参数构造类

python - Celerybeat 任务正在获取相同的信息,即使它已更改。 (可能缓存)我怎样才能禁用它

python - 在 python 多处理队列中推进 tensorflow 数据集迭代器

python - pytest 测试是否可以更改 session 固定装置的值并影响后续测试?

php - 如何抑制由 imagejpeg 创建的 JPEG 注释?

asp.net - 如何在 Facebook 上分享图片并将图片作为灯箱打开