Как закрыть изображение, показанное пользователю с помощью библиотеки изображений Python?

У меня есть несколько изображений, которые я хотел бы показать пользователю с 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 -program (с подпроцессом), это тоже будет хорошо.

Ответ 1

Метод show "в основном предназначен для целей отладки" и порождает внешний процесс, для которого вы не получаете дескриптор, поэтому вы не можете его убить надлежащим образом.

С PIL вы можете использовать один из своих графических интерфейсов, например ImageTk, ImageQt или ImageWin.

В противном случае просто вручную создайте средство просмотра изображений из Python с помощью модуля subprocess:

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

psutil может получить pid процесса display, созданного im.show(), и убить процесс с помощью этого 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()

Ответ 3

Я изменил этот рецепт, прежде чем делать некоторую работу с изображениями на 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