#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 и выдать ошибку, если она уже установлена при вводе. Затем установите его в начале выполнения функции и снимите его непосредственно перед возвращением.