2012-11-11 489 views
6

私はpythonで画像を表示し、ユーザーが端末に画像の名前を入力した後に閉じたいと思います。私は画像を表示するPILを使用し、ここでのコードは次のとおりです。pythonで画像を表示および閉じる方法は?

im = Image.open("image.jpg") 
im.show() 

私のアプリケーションは、この画像を表示するが、ユーザタスクは、画像上の物体を認識し、端末に答えを書くことです。答えが入力された場合、正しいユーザーは別のイメージを取得する必要があります。 PILの問題は、画像を閉じることができないということです。研究の結果、唯一の解決策は画像ビューアのプロセスを終了させることでしたが、これは本当に信頼性が高く、エレガントではありません。 .show()や.close()のようなメソッドを持つ画像を表示するライブラリはありますか?

答えて

2

画像ビューア/エディタを別のプロセスで開いて、ユーザーがあなたの質問に回答した後にそれを強制終了してください。

from PIL import Image 
import subprocess 

p = subprocess.Popen(["display", "/tmp/test.png"]) 
raw_input("Give a name for image:") 
p.kill() 
+2

これは、画像をユーザーのパスに表示する実行可能ファイルである「表示」に依存していますか?それは少し...壊れやすいようですね? – GreenAsJade

+0

これは一例ですが、ソフトウェアは何かに依存して動作する必要があります。これは、特定の状況で最も簡単な方法です.WxPythonやPyQTのようなライブラリを使用して、ウィンドウと表示イメージを作成することができます。クロスプラットフォームのPILの 'im.show'を使うこともできますが、ウィンドウを自動的に閉じることはできません。 –

2

ターミナルは、リニアコマンドフローを扱うことを意図しています。つまり、質問をしてユーザーが答えてから、別の質問をすることができます。あなたがここでやろうとしているのは、端末が2つのことを行い、イメージを表示し、同時にユーザーに質問することです。これを行うには、いずれかのものの2行うことができます。

マルチプロセッシング

新しいスレッド/プロセスを開始し、そのスレッドを使用してPILは画像を表示させると、その間に最初のスレッド/プロセスに尋ねることができますユーザーに質問。その後、ユーザーが答えた後、他のスレッド/プロセスを閉じることができます。どのようにできるかについては、Pythonのthreadingモジュール(link)をご覧ください。代わりに、端末でユーザーインターフェースを作る

GUI

、あなたが快適で、どんなフレームワーク使用して簡単なGUIアプリケーションを作ります。私は個人的にはPyQt4が好きです。 Qtは非常に強力なGUI開発ツールキットであり、PyQt4はそのためのラッパーです。あなたがGUIを作ったら、あなたがしていることはやや些細なことです。

0

はやり過ぎかもしれませんが、私にとっては最も簡単で堅牢なソリューションは、例えば、それは正しく、それが作成されます数字を追跡してちょうどmatplotlib使用することでした:

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 

imgplot = plt.imshow(mpimg.imread('animal.png')) 
plt.ion() 
plt.show() 
animal_name = raw_input("What is the name?: ") 
plt.close() 
+0

Jupyterノートブックで試してみると、画像が閉じるようではありません。 Pythonのアイドル状態では、画像も閉じられませんでした。 IDLEでそれを実行した後に私が手動でクローズしようとしたとき、それはちょうど凍ってクラッシュしました。 – Moondra

+0

私はUbuntuとMac OSの両方で通常のPython 2&3で試してみましたが、うまくいきました.Jupyterなどのフレームワークの詳細はわかりません。 –

関連する問題