Завершение программы или подпрограммы с помощью комбинации клавиш в Python

Есть код, который сохраняет изображение с камеры ноутбука с текущими датой и временем.В коде применяется создание окна с помощью библиотеки dlib. Этот код будет применён в программе написанной на kivy. Будет кнопка, которая будет запускать этот код. Необходимо завершить выполнение кода при нажатии другой кнопки или комбинации клавиш. Вместо цикла из 1000 итераций. В приоритете комбинацией клавиш, а то я так понимаю необходимо будет лезть в асинхронное программирование. Желательно, что бы программа так же завершалась по нажатию на крестик в правом верхнем углу созданного окна. Если я нажму этот крестик сейчас, то у меня продолжится выполнение программы, но окно исчезнет. Как это лучше сделать? Я даже не представляю как подойти к решению этого вопроса.

import cv2
import datetime
import dlib
import os
import time
cap = cv2.VideoCapture(0)
cap.set(3, 640)  # set Width
cap.set(4, 480)  # set Height

win1 = dlib.image_window()
for i in range(1000):
    win1.clear_overlay()
    ret, img = cap.read()
    win1.set_image(img)
    cv2.imwrite('img-jpg-color.jpg', img)  # output size: 109KB
    now = datetime.datetime.now()
    os.rename('img-jpg-color.jpg', str(now.year) + str(now.month) + str(now.day) + '_' + 
    str(now.hour) + '_' + str(now.minute) + '_' + '(' + str(now.second) + ')' + str(now.microsecond) 
    + '.jpg')
    time.sleep(0.3)

Ответы (2 шт):

Автор решения: Egor Shchukin

Не знаю как это делается в dlib, но получилось реализовать то же самое но с использованием cv2. При нажатии клавиши "2" окно закрывается и выполнение программы прекращается

import cv2
import datetime
import os
import time

cap = cv2.VideoCapture(0)
cap.set(3, 640)  # set Width
cap.set(4, 480)  # set Height
file = open("source jpg.txt", "w")

while(True):
    ret, img = cap.read()
    cv2.imshow('Video', img)
    cv2.imwrite('img-jpg-color.jpg', img)
    now = datetime.datetime.now()
    os.rename('img-jpg-color.jpg','_' + str(now.year) + str(now.month) + str(now.day) 
    + '_' + str(now.hour) + '_' + str(now.minute) + '_' + '(' + str(now.second) + ')' 
    + str(now.microsecond) + '.jpg')
    file.write(str(now.year) + str(now.month) + str(now.day) + '_' + str(now.hour) + 
    '_' + str(now.minute) + '_' + '(' + str(now.second) + ')' + str(now.microsecond) + 
    '.jpg' + '\n')
    time.sleep(0.3)
    if cv2.waitKey(1) & 0xFF == ord('2'):
        break
file.close()
cap.release()
cv2.destroyAllWindows()
→ Ссылка
Автор решения: Александр

вы можете использовать вместо 2 любой символ

if cv2.waitKey(1) & 0xFF == ord('2'):
    break

вот полезная информация: https://stackoverflow.com/questions/35372700/whats-0xff-for-in-cv2-waitkey1

https://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html?highlight=waitkey#waitkey

также важно сказать, что если сделать cv2.waitKey(0), то это значит, ждать бесконечно долго, иначе цифра - количество миллисекунд, которое ждет функция, прежде чем прервать вернуть результат работы.

также можно использовать просто, тогда при нажатии на любую кнопку у вас остановится функция

if cv2.waitKey(1):
    break

все эти вещи должны использоваться в бесконечных циклах:

while 1:
    # do some
    if cv2.waitKey(1) & 0xFF == ord('2'):
        break
→ Ссылка