无限屏幕检测,没有达到递归限制

时间:2018-10-27 05:22:58

标签: python recursion tkinter python-imaging-library

我编写了一个图像检测程序,该程序可以截取屏幕截图并检测特定图像,进行计算并在Tkinter窗口中将其报告给用户。除了我需要它继续运行直到用户退出程序外,所有其他方法都工作正常,但是我达到了递归限制(1000)并得到错误RecursionError: maximum recursion depth exceeded。如果我处理此错误,则当然最终会导致stack overflow error

我的方法显然存在一些根本性的缺陷。我该怎么做才能无限拍摄屏幕截图,处理输出并在Tkinter窗口中报告给用户?

我的简化方法如下。预先感谢您的任何建议或想法。

from PIL import ImageGrab
import tkinter as tk

class Main(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.screen_height = self.winfo_screenheight()
        self.screen_width = self.winfo_screenwidth()
        self.callback_time = 1 # Actual time is 1000
        self.num_screenshots = 0
        self.wm_attributes("-topmost", 1) # Keeps the Tkinter window above other windows
        tk.Label(text="Number of Screenshots").pack(side="left")
        self.counter_label = tk.Label()
        self.counter_label.pack(side="left")

    def process_screen(self):
        # Do shape detection here
        self.num_screenshots += 1
        self.counter_label.configure(text=self.num_screenshots)
        self.update_idletasks()

    def take_screen_shot(self):
        #self.screen_shot = ImageGrab.grab(bbox=(0, 0, self.screen_width, self.screen_height)) 
        self.process_screen()
        self.after(self.callback_time, self.take_screen_shot())

    def run(self):
        def callback(event):
            if True:
                self.after_cancel(self.process)
                print("Call back Cancelled")
        self.bind("<Return>", callback)
        self.process = self.after(self.callback_time, self.take_screen_shot)
        self.mainloop()

if __name__ == "__main__":
    Main().run()

1 个答案:

答案 0 :(得分:1)

菜鸟错误。 self.after(self.callback_time, self.take_screen_shot())应该是self.after(self.callback_time, self.take_screen_shot),并且不要加上括号。