Как закрыть изображение, отображаемое пользователю, с помощью библиотеки изображений Python? - PullRequest
15 голосов
/ 17 июля 2011

У меня есть несколько изображений, которые я хотел бы показать пользователю с 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 закрыть изображение после ввода описания?

Мне не нужен ПИЛ. Если у вас есть другая идея с другой библиотекой / bash-программой (с подпроцессом), все будет хорошо.

Ответы [ 3 ]

15 голосов
/ 05 июля 2013

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()
13 голосов
/ 17 июля 2011

Метод 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
3 голосов
/ 18 июля 2011

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