Обнаружение бесконечного экрана без превышения предела рекурсии - PullRequest
0 голосов
/ 27 октября 2018

Я написал программу обнаружения изображений, которая делает снимок экрана и определяет конкретные изображения, выполняет расчеты и сообщает о них пользователю в окне 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 голосов
/ 27 октября 2018

Ошибка новичка.self.after(self.callback_time, self.take_screen_shot()) должно быть self.after(self.callback_time, self.take_screen_shot) без скобок.

...