Как исправить мое приложение для мониторинга папок python kivy от сбоя

#python #python-3.x #kivy #kivy-language

Вопрос:

Я только что начал работать над графическим приложением с python kivy, которое позволяет мне отслеживать папки на моем компьютере, прямо сейчас у меня есть main.py, главная.кв, и watchdog1.py файлы, когда я запускаю свой код, приложение запускается и выводит активность папок на мой терминал, однако примерно через минуту оно выходит из строя из-за большого использования памяти.

вот мой main.py:

 from kivy.app import App  from kivy.core.window import Window from kivy.uix.anchorlayout import AnchorLayout from kivy.uix.label import Label from kivy.uix.checkbox import CheckBox from kivy.uix.boxlayout import BoxLayout from kivy.clock import Clock from kivy.properties import StringProperty, NumericProperty, ObjectProperty from kivy.graphics import Color, Rectangle, Ellipse, Line  from watchdog1 import watch import _thread   WIDTH, HEIGHT = 1000, 800   class MainWindow(AnchorLayout):  bbox = ObjectProperty(None)  folders = ["Desktop", "Documents", "Downloads"]  labels = []  bools = {}     def __init__(self, **kwargs):  super().__init__(**kwargs)  Clock.schedule_once(self.add_initial, .1)  Clock.schedule_interval(self.check_active, .1)   def add_initial(self, dt):  for f in self.folders:  self.add_folder(f)    def add_folder(self, text):  f = Label(text=text)  s = CheckBox()  b = BoxLayout()  b.add_widget(f)  b.add_widget(s)  self.bbox.add_widget(b)    self.labels.append(text)  self.bools[text] = 0    def check_active(self, dt):  for widget in self.bbox.children:  t = widget.children[1].text  b = widget.children[0].active   if b is True and self.bools[t] == 0:  print(t, "is active")  watch(f"C:/Users/Chris/{t}")  self.bools[t] = 1  elif b is False:  self.bools[t] = 0       class MainApp(App):  def build(self):  Window.size = (WIDTH, HEIGHT)  self.title = "Kivy Watchdog"  return   if __name__ == "__main__":  MainApp().run()  

и мой главный.кв

 MainWindow:  lt;MainWindowgt;:  bbox: bbox  BoxLayout:  orientation: "vertical"  BoxLayout:  size_hint: 1, None  height: dp(30)  Label:  text: "Watchdog"  BoxLayout:  Label:   text: "FoldersntonMonitor"  size_hint: .1, 1  BoxLayout:  canvas:  Color:   rgba: .2, .2, .2, 1  Rectangle:  size: self.size  pos: self.pos  orientation: "vertical"  spacing: 10  id: bbox  

и мой watchodg1.py

 import multiprocessing import time import logging from watchdog.observers import Observer from watchdog.events import LoggingEventHandler  def watch(p):  logging.basicConfig(level=logging.INFO,  format='%(asctime)s - %(message)s',  datefmt='%Y-%m-%d %H:%M:%S')  path = p  event_handler = LoggingEventHandler()  observer = Observer()  observer.schedule(event_handler, path, recursive=True)  observer.start()  try:  while True:  time.sleep(1)  finally:  observer.stop()  observer.join()  

вот снимок экрана того, что происходит: В нижнем круге показаны работы по ведению журнала, а в большом-ошибка

Комментарии:

1. Здесь очень мало кода, который потреблял бы память. Интервал повторной проверки .1 секунда и ключевое слово «рекурсивный», о котором я думаю. Что recursive=True происходит и что произойдет, если вы замедлите частоту повторных проверок до интервала в 1 секунду?

2. Я попытался изменить рекурсивный на Ложный и изменить частоту повторных проверок, но результат был тот же, вдовы говорят, что приложение не отвечает

3. Я просто подумал кое о чем, может ли ошибка исходить от функции watch, потому что она никогда ничего не возвращает и никогда не останавливается, означает ли это, что python никогда не покидает функцию, чтобы продолжить?

4. Я предполагал, что он вырвется из этого цикла из-за исключения или чего-то в этом роде. Но ваша check_active функция будет продолжать вызываться, и, по-видимому, эти вызовы будут буферизоваться. (и ваш bool не будет установлен до тех пор, пока функция не вернется, вам, вероятно, следует установить его перед вызовом) Но почему ты не получаешь длинный список отпечатков? если только печать не появится до окончания мероприятия?

5. Простой способ проверить это-установить флаг «в функции» в верхней части функции check_active и выдать ошибку, если она уже установлена при вводе. Затем установите его в начале выполнения функции и снимите его непосредственно перед возвращением.