web-dev-qa-db-ja.com

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プログラム(サブプロセス付き)で別のアイデアがある場合は、それでも問題ありません。

15
Martin Thoma

showメソッドは「主にデバッグを目的としており」、ハンドルを取得できない外部プロセスを生成するため、適切な方法で強制終了することはできません。

PILでは、 ImageTkImageQtImageWin などのGUIモジュールの1つを使用できます。

それ以外の場合は、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
13
Fred Foo

psutilim.show()によって作成されたdisplayプロセスの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()
15
Bengt

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
3
Nick T