9

我想用 Python 显示图像并在用户在终端中输入图像的名称后将其关闭。我使用 PIL 来显示图像,这里是代码:

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

我的应用程序显示此图像,但用户任务是识别图像上的对象并在终端中写入答案。如果输入的答案是正确的,用户应该得到另一个图像。PIL 的问题是我无法关闭图像,并且通过研究,唯一的解决方案是杀死图像查看器的进程,但这并不是真正可靠和优雅。是否有任何其他库用于显示具有 .show() 和 .close() 等方法的图像?

4

5 回答 5

4

聚会有点晚了,但是(作为一个心怀不满的数据科学家,他真的不想为了显示图像而学习 gui 编程)我可能可以代表其他几个希望看到更简单的解决方案的人这个。我通过扩展 Anurag 的解决方案找到了一些解决方法:

制作第二个 python 脚本(我们称之为“imviewer.py”):

from skimage.viewer import ImageViewer
from skimage.io import imread

img = imread('image.png') #path to IMG
view = ImageViewer(img)
view.show()

然后在你的主脚本中按照 Anurag 的建议执行:

import subprocess
p = subprocess.Popen('python imviewer.py')
#your code
p.kill()

你可以让主脚本临时保存你想用“imviewer.py”打开的图像,然后用下一个图像等覆盖它。

希望这可以帮助解决这个问题的人!

于 2018-10-08T03:06:24.773 回答
3

只需在单独的进程中打开任何图像查看器/编辑器,并在用户回答您的问题后将其终止,例如

from PIL import Image
import subprocess

p = subprocess.Popen(["display", "/tmp/test.png"])
raw_input("Give a name for image:")
p.kill()
于 2012-11-11T02:33:57.733 回答
2

终端旨在处理线性命令流 - 这意味着它会提出问题,用户回答,然后它可以提出不同的问题。您在这里尝试做的是让终端做两件事,显示图像并同时向用户提问。为此,您可以执行以下两项操作:

多处理

您可以启动一个新线程/进程并让 PIL 使用该线程显示图像,同时在第一个线程/进程中向用户提问。然后在用户回答后,您可以关闭其他线程/进程。您可以查看 Python 的threading模块(链接)以获取有关如何执行此操作的更多信息。

图形用户界面

与其在终端中制作用户界面,不如使用您喜欢的任何框架制作一个简单的 GUI 应用程序。我个人喜欢PyQt4。Qt 是非常强大的 GUI 开发工具包,PyQt4 是它的包装器。如果你制作一个 GUI,那么你想做的事情是相当微不足道的。

于 2012-11-11T02:05:36.947 回答
2

并非所有 GUI 都难以使用。

这是使用 PySimpleGUI 的单行解决方案。通常我不会把它写成一行,但既然它是一次性的,也许不需要添加,那么就可以了。

import PySimpleGUI as sg

sg.Window('My window').Layout([[ sg.Image('PySimpleGUI.png') ]]).Read()

在此处输入图像描述

于 2018-10-09T12:22:54.240 回答
1

可能是矫枉过正,但对我来说,最简单和最强大的解决方案就是使用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()
于 2017-03-09T22:00:02.353 回答