如何使用Python Imaging Library关闭向用户显示的图像?

时间:2011-07-17 16:08:32

标签: python python-imaging-library

我有几个图像,我想用Python向用户显示。用户应输入一些描述,然后显示下一个图像。

这是我的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, glob
from PIL import Image

path = '/home/moose/my/path/'
for infile in glob.glob( os.path.join(path, '*.png') ):
    im = Image.open(infile)
    im.show()
    value = raw_input("Description: ")
    # store and do some other stuff. Now the image-window should get closed

它正在工作,但用户必须自己关闭图像。在输入描述后,我可以让python关闭图像吗?

我不需要PIL。如果您对另一个库/ bash程序(使用子进程)有另一个想法,它也会没问题。

3 个答案:

答案 0 :(得分:15)

psutil可以获取display创建的im.show()进程的pid,并在每个操作系统上使用该pid终止进程:

import time

import psutil
from PIL import Image

# open and show image
im = Image.open('myImageFile.jpg')
im.show()

# display image for 10 seconds
time.sleep(10)

# hide image
for proc in psutil.process_iter():
    if proc.name() == "display":
        proc.kill()

答案 1 :(得分:13)

show方法主要用于调试目的“并产生一个你无法获得句柄的外部进程,所以你不能以正确的方式杀死它。

使用PIL,您可能希望使用其中一个GUI模块,例如ImageTkImageQtImageWin

否则,只需使用subprocess模块从Python手动生成图像查看器:

for infile in glob.glob( os.path.join(path, '*.png')):
    viewer = subprocess.Popen(['some_viewer', infile])
    viewer.terminate()
    viewer.kill()  # make sure the viewer is gone; not needed on Windows

答案 2 :(得分:3)

我之前修改了this recipe以便在Python中进行一些图像处理。它使用Tkinter,因此除了PIL之外不需要任何模块。

'''This will simply go through each file in the current directory and
try to display it. If the file is not an image then it will be skipped.
Click on the image display window to go to the next image.

Noah Spurrier 2007'''
import os, sys
import Tkinter
import Image, ImageTk

def button_click_exit_mainloop (event):
    event.widget.quit() # this will cause mainloop to unblock.

root = Tkinter.Tk()
root.bind("<Button>", button_click_exit_mainloop)
root.geometry('+%d+%d' % (100,100))
dirlist = os.listdir('.')
old_label_image = None
for f in dirlist:
    try:
        image1 = Image.open(f)
        root.geometry('%dx%d' % (image1.size[0],image1.size[1]))
        tkpi = ImageTk.PhotoImage(image1)
        label_image = Tkinter.Label(root, image=tkpi)
        label_image.place(x=0,y=0,width=image1.size[0],height=image1.size[1])
        root.title(f)
        if old_label_image is not None:
            old_label_image.destroy()
        old_label_image = label_image
        root.mainloop() # wait until user clicks the window
    except Exception, e:
        # This is used to skip anything not an image.
        # Warning, this will hide other errors as well.
        pass