2012-11-11 8 views
6

Tôi muốn hiển thị hình ảnh trong python và đóng nó sau khi người dùng nhập tên của hình ảnh trong thiết bị đầu cuối. Tôi sử dụng PIL để hiển thị hình ảnh, đây là mã:cách hiển thị và đóng hình ảnh trong python?

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

Ứng dụng của tôi hiển thị hình ảnh này, nhưng nhiệm vụ của người dùng là nhận dạng đối tượng trên hình ảnh và ghi câu trả lời trong terminal. Nếu câu trả lời được nhập là đúng người dùng sẽ nhận được một hình ảnh khác. Vấn đề với PIL là tôi không thể đóng hình ảnh và với nghiên cứu chỉ có sollution là để giết chết quá trình xem hình ảnh, nhưng điều này là không thực sự đáng tin cậy và thanh lịch. Có thư viện nào khác để hiển thị hình ảnh có các phương thức như .show() và .close() không?

Trả lời

2

Chỉ cần mở bất kỳ trình xem/trình chỉnh sửa hình ảnh nào trong một quá trình riêng biệt và xóa nó sau khi người dùng đã trả lời câu hỏi của bạn, ví dụ:

from PIL import Image 
import subprocess 

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

Điều này có dựa trên "hiển thị" là tệp thực thi hiển thị hình ảnh, trên đường dẫn của người dùng không? Điều đó có vẻ hơi ... mong manh? – GreenAsJade

+0

Đó là một ví dụ, nhưng phần mềm phải dựa vào một cái gì đó để làm việc, đây là cách dễ nhất cho một tình huống nhất định, nói chung cho ứng dụng nền tảng chéo, bạn có thể sử dụng một số thư viện như wxPython hoặc PyQT để tạo ra một cửa sổ và hình ảnh hiển thị. Bạn cũng có thể sử dụng 'im.show' của PIL có thể là nền tảng chéo nhưng bạn không thể đóng cửa sổ tự động. –

2

Thiết bị đầu cuối có nghĩa là xử lý luồng lệnh tuyến tính - nghĩa là nó hỏi một câu hỏi, câu trả lời của người dùng và sau đó nó có thể đặt một câu hỏi khác. Những gì bạn đang cố gắng làm ở đây là để thiết bị đầu cuối làm hai việc, hiển thị hình ảnh và đồng thời hỏi người dùng một câu hỏi. Để thực hiện điều này, bạn có thể làm hai của một trong hai điều:

Đa

Bạn có thể bắt đầu một chủ đề mới/quy trình và làm cho PIL hiển thị hình ảnh sử dụng chủ đề đó, và khi đó trong thread đầu tiên/quá trình yêu cầu một sử dụng một câu hỏi. Sau đó, sau khi người dùng trả lời, bạn có thể đóng luồng/quy trình khác. Bạn có thể xem mô-đun threading của Python (link) để biết thêm thông tin về cách bạn có thể thực hiện điều đó.

GUI

Thay vì làm cho giao diện người dùng của bạn trong thiết bị đầu cuối, làm cho một ứng dụng GUI đơn giản sử dụng bất cứ khuôn khổ bạn cảm thấy thoải mái. Cá nhân tôi thích PyQt4. Qt là bộ công cụ phát triển GUI rất mạnh và PyQt4 là một trình bao bọc cho nó. Nếu bạn thực hiện một GUI, thì những gì bạn đang buộc phải làm là khá tầm thường.

0

Có thể là một overkill, nhưng đối với tôi là giải pháp dễ nhất và mạnh mẽ nhất là chỉ để sử dụng matplotlib vì nó đúng cách theo dõi những con số nó tạo ra, ví dụ :

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

Đã thử trên máy tính xách tay Jupyter và hình ảnh dường như không đóng. Với Python nhàn rỗi, hình ảnh cũng không đóng. Khi tôi thử đóng thủ công nó sau khi chạy nó với IDLE, nó chỉ bị đóng băng và bị treo. – Moondra

+0

Tôi đã thử nó với python 2 & 3 bình thường trên cả Ubuntu và Mac OS và nó hoạt động tốt - Tôi không biết về các chi tiết cụ thể với các khung công tác như Jupyter. –