2 回答

TA貢獻1829條經驗 獲得超7個贊
通過堆棧跟蹤,您可以確定遞歸發生在第 49 行(這是被執行多次的行)
File "C:/Users/Gotta/Documents/AutoCamPy.py", line 49, in CheckSource
lmain.after(10, CheckSource())
File "C:/Users/Gotta/Documents/AutoCamPy.py", line 49, in CheckSource
lmain.after(10, CheckSource())
File "C:/Users/Gotta/Documents/AutoCamPy.py", line 49, in CheckSource
lmain.after(10, CheckSource())
[Previous line repeated 995 more times]
它達到遞歸限制的原因是因為該.after函數(https://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method)需要一個回調函數作為第二個參數,但您正在傳遞而是調用的結果。CheckSource您應該傳遞CheckSource而不是CheckSource()作為第二個參數:
lmain.after(10, CheckSource)

TA貢獻1909條經驗 獲得超7個贊
要以簡單的方式處理此問題,您可以編寫 try/except 語句來捕獲此錯誤。在您確切知道錯誤是什么之前,您可以使用全部捕獲,但我建議您在知道具體錯誤后處理具體錯誤。
也就是說,我在您的代碼中更改了一些內容以對其進行一些清理并更嚴格地遵循 PEP8 標準。
你真的應該做import tkinter as tk而不是使用*. 這將有助于防止覆蓋已導入的方法。
接下來,您的 lambda 結束了,只需執行此操作即可root.quit。我們想保存對命令的引用而不是執行它,我們通過刪除括號來做到這一點。您的第二個后聲明也存在同樣的問題。
最后你導入PIL,然后專門從 PIL 導入。您不需要兩者都做。如果您只需要Image然后ImageTk就做from PIL import Image, ImageTk,如果您需要 PIL 的很多東西,那么您可以簡單地做import PIL并使用PIL.那里的前綴。
這是帶有 try/except 語句的清理代碼。如果您有任何問題,請告訴我。
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()
添加回答
舉報