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プログラム(サブプロセス付き)で別のアイデアがある場合は、それでも問題ありません。
show
メソッドは「主にデバッグを目的としており」、ハンドルを取得できない外部プロセスを生成するため、適切な方法で強制終了することはできません。
PILでは、 ImageTk
、 ImageQt
、 ImageWin
などの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
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()
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