This is very helpful indeed, thank you. Awe-inspiring.

It occurred to me that I could edit the PIL/ImageShow.py, replacing ‘xv’ (in five places) with the utility of my choice and using ‘executable’ as the command.

Or, is this just not done?

On 26/05/2018 19:11, Peter Otten wrote:
Paul St George wrote:

Thank you.
You are very right. The show() method is intended for debugging purposes
and is useful for that, but what method should I be using and is PIL the
best imaging library for my purposes? I do not want to manipulate
images, I only want to show images (full screen) on an external display.
I want to use Python to control the timing of the images.

And, out of curiosity, as I will probably use a different method - how
do I find out what commands can be used as parameters for show()? I read
the docs at
<https://pillow.readthedocs.io/en/5.1.x/reference/Image.html
#PIL.Image.Image.show>,
but I am none the wiser.
If you look into the source code

https://github.com/python-pillow/Pillow/blob/master/src/PIL/Image.py#L1967

after a few indirections

show --> _show --> _showxv --> ImageShow.show

you will end up in the file

https://github.com/python-pillow/Pillow/blob/master/src/PIL/ImageShow.py

which is short enough to read completely ;)

At first glance it looks like the command argument is silently discarded, so
here's plan B:

It turns out that you can register() Viewer instances, and the pre-
registered viewers for unixoids -- and thus probably the Pi are
DisplayViewer and XVViewer.

Using these as a template I came up with the following simple viewer that
shows an image with firefox:

#!/usr/bin/env python3
import os
import sys

from PIL import Image, ImageShow


class Firefox(ImageShow.UnixViewer):

     # store the image in a format understood by the browser
     format = "jpeg"

     def get_command_ex(self, file, **options):
         return ("firefox",) * 2

     def show_file(self, file, **options):
         quote = ImageShow.quote

         command, executable = self.get_command_ex(file, **options)

         # firefox returns immediately, so let's sleep a few seconds
         # to give it time to actually open the image file
         command = "(%s %s; sleep 10; rm -f %s)&" % (
             command, quote("file://" + file), quote(file)
         )
         os.system(command)
         return 1


# the -1 means our viewer will be inserted before the others
# and thus become the default
ImageShow.register(Firefox(), -1)


if __name__ == "__main__":
     try:
         file = sys.argv[1]
     except IndexError:
         print("Please provide an image file", file=sys.stderr)
     else:
         image = Image.open(file)
         image.show()


Here's another, even simpler one:

class Gwenview(ImageShow.UnixViewer):
     def get_command_ex(self, file, **options):
         return ("gwenview",) * 2




--
Paul St George
http://www.paulstgeorge.com
http://www.devices-of-wonder.com

+44(0)7595 37 1302

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to