How can I close an image shown to the user with the Python Imaging Library?

后端 未结 3 1608
暗喜
暗喜 2020-12-17 16:20

I have several images which I would like to show the user with Python. The user should enter some description and then the next image should be shown.

This is my cod

相关标签:
3条回答
  • 2020-12-17 16:45

    The show method "is mainly intended for debugging purposes" and spawns an external process for which you don't get a handle, so you can't kill it in a proper way.

    With PIL, you may want to use one of its GUI modules , such as ImageTk, ImageQt or ImageWin.

    Otherwise, just manually spawn an image viewer from Python with the subprocess module:

    for infile in glob.glob( os.path.join(path, '*.png')):
        viewer = subprocess.Popen(['some_viewer', infile])
        viewer.terminate()
        viewer.kill()  # make sure the viewer is gone; not needed on Windows
    
    0 讨论(0)
  • 2020-12-17 16:47

    psutil can get the pid of the display process created by im.show() and kill the process with that pid on every operating system:

    import time
    
    import psutil
    from PIL import Image
    
    # open and show image
    im = Image.open('myImageFile.jpg')
    im.show()
    
    # display image for 10 seconds
    time.sleep(10)
    
    # hide image
    for proc in psutil.process_iter():
        if proc.name() == "display":
            proc.kill()
    
    0 讨论(0)
  • 2020-12-17 16:50

    I've modified this recipe before to do some image work in Python. It uses Tkinter, so it doesn't require any modules besides PIL.

    '''This will simply go through each file in the current directory and
    try to display it. If the file is not an image then it will be skipped.
    Click on the image display window to go to the next image.
    
    Noah Spurrier 2007'''
    import os, sys
    import Tkinter
    import Image, ImageTk
    
    def button_click_exit_mainloop (event):
        event.widget.quit() # this will cause mainloop to unblock.
    
    root = Tkinter.Tk()
    root.bind("<Button>", button_click_exit_mainloop)
    root.geometry('+%d+%d' % (100,100))
    dirlist = os.listdir('.')
    old_label_image = None
    for f in dirlist:
        try:
            image1 = Image.open(f)
            root.geometry('%dx%d' % (image1.size[0],image1.size[1]))
            tkpi = ImageTk.PhotoImage(image1)
            label_image = Tkinter.Label(root, image=tkpi)
            label_image.place(x=0,y=0,width=image1.size[0],height=image1.size[1])
            root.title(f)
            if old_label_image is not None:
                old_label_image.destroy()
            old_label_image = label_image
            root.mainloop() # wait until user clicks the window
        except Exception, e:
            # This is used to skip anything not an image.
            # Warning, this will hide other errors as well.
            pass
    
    0 讨论(0)
提交回复
热议问题