Завершение программы или подпрограммы с помощью комбинации клавиш в 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 шт):
Не знаю как это делается в 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