PIL's Image.show () выводит * двух * разных зрителей - PullRequest
2 голосов
/ 14 июня 2010

При работе с изображениями в оболочке python я использую image.show (), где image является экземпляром Image.Давным-давно ничего не произошло, но после определения символической ссылки на мираж с именем «xv» я был счастлив.

В последние несколько дней show () вызовет как отображение ImageMagick, так и Mirage.Непонятно, откуда show () получает информацию о том, что запускать.Документация не помогла.Как заставить его вести себя и воспитывать только то, что он считает xv?

Ответы [ 6 ]

5 голосов
/ 28 августа 2012

Немного устарел, но ... Я решил эту проблему, изменив код файла /usr/lib/python2.7/dist-packages/PIL/ImageShow.py. Отсутствует return для метода show класса Viewer (рядом со строкой 66): return self.show_image(image, **options).

3 голосов
/ 14 июня 2010

Ну, во-первых, im.show предназначен только для целей отладки, он не гарантированно работает.

Тем не менее, вы всегда можете посмотреть на источник (откройте «pydoc PIL», раздел FILE указывает, где находится модуль):

В Windows PIL будет использовать «start / wait»filename "

В Mac он использует" open -a /Applications/Preview.app"

и в Linux, либо "display", если найден, либо иным образом "xdg-open".

1 голос
/ 09 ноября 2014

Я нашел какой-то обходной путь.

Я использовал:

image.save('something.png')

Открыл png из файлового менеджера, используя программу предварительного просмотра по умолчанию. Затем каждый раз, когда я снова вызывал save, программа предварительного просмотра автоматически обновлялась, и я получал новое изображение:)

0 голосов
/ 15 марта 2018

ImageShow имеет список поддерживаемых и доступных средств просмотра в ImageShow._viewers.На моем ящике находятся два зрителя:

>>> import PIL.ImageShow
>>> PIL.ImageShow._viewers
[<PIL.ImageShow.DisplayViewer instance at 0x2587ef0>, <PIL.ImageShow.XVViewer instance at 0x2587f80>]

К сожалению, ImageShow.show() использует все доступные зрители.Таким образом, отображаются два окна.

Решение состоит в том, чтобы уменьшить реестр средства просмотра только до первого доступного средства просмотра:

>>> PIL.ImageShow._viewers = [ PIL.ImageShow._viewers[0] ]
0 голосов
/ 29 апреля 2013

Я столкнулся с той же проблемой, это проблема в PIL. Вы можете изменить код PIL следующим образом:

В файле ImageShow.py заменить

return "start /wait %s && del /f %s" % (file,file) 

с

return "start /wait %s && del /wait /f %s" % (file,file)
0 голосов
/ 14 июня 2010

он может указать зрителя как command аргумент для метода show, например,

img.show (command = 'feh')

...