2012-11-11 11 views
6

Ich möchte Bild in Python anzeigen und es schließen, nachdem Benutzer Name des Bildes im Terminal eingibt. Ich PIL verwende Bild anzuzeigen, hier ist der Code:wie Bild in Python anzuzeigen und zu schließen?

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

Meine Anwendung Anzeige dieses Bild, aber Benutzer Aufgabe ist Gegenstand auf dem Bild zu erkennen und Antwort in Terminal zu schreiben. Wenn die eingegebene Antwort korrekt ist, sollte der Benutzer ein anderes Bild erhalten. Problem mit PIL ist, dass ich das Bild nicht schließen kann und mit der Forschung die einzige Lösung war, den Prozess des Bildbetrachters zu töten, aber das ist nicht wirklich zuverlässig und elegant. Gibt es weitere Bibliotheken zum Anzeigen von Bildern mit Methoden wie .show() und .close()?

Antwort

2

Öffnen Sie einfach jeden Bildbetrachter/Editor in einem separaten Prozess und beenden Sie es, sobald der Benutzer Ihre Frage beantwortet hat, z.

from PIL import Image 
import subprocess 

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

Ist dies "Display" eine ausführbare Datei, die ein Bild auf dem Pfad des Benutzers anzeigt? Das scheint ein bisschen ... zerbrechlich? – GreenAsJade

+0

Das ist ein Beispiel, aber Software muss sich auf etwas verlassen, um zu arbeiten, dies ist der einfachste Weg für eine bestimmte Situation, im Allgemeinen für Cross-Plattform-Anwendung können Sie eine Bibliothek wie wxPython oder PyQT verwenden, um ein Fenster zu erstellen und Bild anzuzeigen. Sie können auch PILs "im.show" verwenden, die plattformübergreifend sein kann, aber Sie können das Fenster nicht automatisch schließen. –

2

Terminal ist für den linearen Befehlsfluss gedacht - das bedeutet, es stellt eine Frage, der Benutzer antwortet, und dann kann es eine andere Frage stellen. Was Sie hier versuchen, ist, dass Terminal zwei Dinge tut, ein Bild zeigt und gleichzeitig dem Benutzer eine Frage stellt. Dazu können Sie zwei von entweder Dinge tun:

Multi

Sie können einen neuen Thread/Prozess starten und machen PIL das Bild mit diesem Thread zeigen, und in der Zwischenzeit in den ersten Thread/Prozess stellen ein Benutzer eine Frage. Nachdem der Benutzer antwortet, können Sie den anderen Thread/Prozess schließen. Sie können sich Pythons threading Modul (link) für weitere Informationen ansehen, wie Sie das tun können.

GUI

Stattdessen Benutzeroberfläche in Terminal zu machen, eine einfache GUI-Anwendung machen mit, was Framework, um Sie bequem sind. Ich persönlich mag PyQt4. Qt ist ein sehr leistungsfähiges GUI-Entwicklungs-Toolkit und PyQt4 ist ein Wrapper dafür. Wenn Sie eine GUI erstellen, dann ist das, was Sie tun möchten, eher trivial.

0

könnte zuviel des Guten sein, aber für mich die einfachste und robusteste Lösung war nur matplotlib zu verwenden, wie es richtig Spur der Figuren hält es schafft, z.B. :

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

Auf Jupyter-Notebook versucht, und Bild scheint nicht zu schließen. Mit Python im Leerlauf schloss das Bild nicht so gut. Wenn ich manuell versuchte, es nach dem Ausführen mit IDLE zu schließen, erstarrte es und stürzte ab. – Moondra

+0

Ich habe es mit nur normalem Python 2 & 3 sowohl auf Ubuntu als auch auf Mac OS versucht und es hat gut funktioniert - ich weiß nicht über die Besonderheiten mit Frameworks wie Jupyter. –

Verwandte Themen