Чтобы сделать это простым способом, вы можете написать инструкцию try / Кроме того, чтобы поймать эту ошибку.Пока вы точно не знаете, в чем заключается ошибка, вы можете использовать функцию catch all, но я бы порекомендовал вам передать конкретную ошибку, как только вы узнаете, что это такое.немного и более точно следовать стандарту PEP8.
Вы действительно должны сделать import tkinter as tk
вместо использования *
.Это поможет предотвратить перезапись импортированных методов.
Затем ваша лямбда была уничтожена, просто вместо этого выполните root.quit
.Мы хотим сохранить ссылку на команду вместо ее выполнения, и мы делаем это, удаляя скобки.Та же проблема существовала с вашим вторым оператором после.
Наконец, вы импортируете PIL
, а затем специально импортируете из PIL.Вам не нужно делать оба.Если вам просто нужны Image
и ImageTk
, просто сделайте from PIL import Image, ImageTk
, а если вам нужно много вещей из PIL, тогда вы можете просто сделать import PIL
и использовать префикс PIL.
оттуда.
ЗдесьВаш очищенный код с оператором try / исключением.Дайте мне знать, если у вас есть какие-либо вопросы.
import tkinter as tk
from PIL import Image, ImageTk
import cv2
root = tk.Tk()
root.bind('<Escape>', root.quit)
lmain = tk.Label(root)
lmain.pack()
ImageSource = 0
window_name = "AutoCam"
width = 600
height = 800
cap = cv2.VideoCapture(ImageSource)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
def show_frame(frame):
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
lmain.imgtk = imgtk
lmain.configure(image=imgtk)
lmain.after(10, check_source)
def check_source():
try:
ok, frame = cap.read()
if ok:
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.destroyAllWindows()
cv2.waitKey(0)
show_frame(frame)
else:
lmain.after(10, check_source)
except:
print('Connection failed for some reason!')
check_source()
root.mainloop()