Как можно изменить проводник файлов KivyMD в python, чтобы при двойном щелчке открывался каталог - PullRequest
0 голосов
/ 25 мая 2020

Итак, я работаю над файловым проводником для проекта в школе, и я использую виджет файлового проводника, который встроен в KivyMD. Проблема в том, что текущий код виджета заставляет его открывать каталог, когда вы щелкаете по нему один раз в представлении значков. Мне нужно, чтобы один щелчок выбирал каталог, а двойной щелчок затем открывал его. Я пробовал проверить двойное касание, но, похоже, это не работает. Есть ли способ заставить это работать. Я действительно не настолько продвинут в python или kivy.

Исходный код для проводника файлов kivyMD: https://raw.githubusercontent.com/HeaTTheatR/KivyMD/master/kivymd/uix/filemanager.py

'' '

Большое спасибо :)

1 Ответ

0 голосов
/ 26 мая 2020

Вот хак, который, я думаю, делает то, что вам нужно. Вверху вашего основного файла .py добавьте следующие строки (должны быть перед любым другим импортом):

from kivy.config import Config
# calculate a time delta that is slightly longer than the maximum time for a double tap
dtt = (int(Config.get('postproc', 'double_tap_time')) + 50) / 1000.0

Затем используйте следующий MyMDFileManager вместо MDFileManager:

class MyMDFileManager(MDFileManager):
    def __init__(self, **kwargs):
        super(MyMDFileManager, self).__init__(**kwargs)
        self.single_tap_trigger = None
        self.last_touch = None

    def select_dir_or_file(self, path):
        if self.last_touch is None or not self.last_touch.is_double_tap:
            # schedule single tap process to happen after a possible second tap of a double tap
            self.single_tap_trigger = Clock.schedule_once(partial(self.do_single_tap, path), dtt)
        elif self.last_touch.is_double_tap:
            if self.single_tap_trigger:
                # this is a double tap, so cancel single tap scheduled process
                self.single_tap_trigger.cancel()
                self.single_tap_trigger = None

            # do double tap proessing
            self.do_double_tap(path)
        else:
            # just clean up
            if self.single_tap_trigger:
                self.single_tap_trigger.cancel()
                self.single_tap_trigger = None

    def do_double_tap(self, path):
        print('double tap\n')
        super(MyMDFileManager, self).select_dir_or_file(path)

    def do_single_tap(self, path, dt):
        print('single tap\n')
        self.select_path(path)

    def on_touch_down(self, touch):
        self.last_touch = touch
        return super(MyMDFileManager, self).on_touch_down(touch

Когда получен одиночный щелчок, обычная обработка одного щелчка задерживается (с использованием Clock.schedule_once()) на время, немного большее, чем максимальное время, разрешенное между касаниями двойного касания.

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

...