Как закрыть изображение модуль PIL (Pillow) python
У меня открывается изображение с помощью show(), но я не знаю как его закрыть. Пробовал close() - не работает.
def showImage():
im = Image.open('image.png')
im.show()
time.sleep(5) # Это для того чтобы картинка успела открыться перед закрытием
im.close()
Ответы (2 шт):
Автор решения: Daniil Loban
→ Ссылка
Если не принципиально PIL, c ним тоже можно попробовать но у меня посыпались ошибки изображения. Причина в том что открытие картинки через im.show()блокирует следующие команды до закрытия окна, поэтому нужен свой процесс.
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from multiprocessing import Process
import time
def show_img():
img = mpimg.imread('image.png')
# cпрятать меню
plt.rcParams['toolbar'] = 'None'
imgplot = plt.imshow(img)
plt.axis('off')
plt.show()
def timeout(fn, sec):
p = Process(target=fn)
p.start()
p.join(timeout=sec)
p.terminate()
if __name__ == '__main__':
timeout(show_img, 5)
Все оказалось проще, нужно вместо show вызывать pause
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
def show_img():
img = mpimg.imread('image.png')
plt.rcParams['toolbar'] = 'None'
imgplot = plt.imshow(img)
plt.axis('off')
plt.pause(5)
showImage()
Автор решения: Delvin
→ Ссылка
Вот что нагуглил:
import time
import psutil
from PIL import Image
import threading
im = Image.open('image.png')
def myfunc():
print('основной поток стартовал')
im.show()
def stopfunc():
time.sleep(5)
for proc in psutil.process_iter():
if proc.name() == "display":
proc.kill()
print('основной поток закрыт')
thr1 = threading.Thread(target = myfunc).start()
thr2 = threading.Timer(5.0, stopfunc())
UPD: Посмотрел доки на pcutil. Лучше не proc.kill() использовать, а proc.terminate(). Безопасней и не ругается.