@MikUrrey

Как сделать «заморозку» и «разморозку» интерфейса?

Есть простое приложение с тремя кнопками, есть цикл, который собирает список файлов и копирует их.
В момент запуска копирования кнопки необходимо сделать DISABLED, в момент окончания - NORMAL.
def go_copy(self):
        self.disable_all_buttons()
        self.btnGo.configure(text = self.folder_source + ' >> ' + self.folder_target)

        for path, directories, files in sorted(os.walk(self.folder_source)):
            for file in sorted(files):
                if file.endswith('.mp3'):
                    path_source = os.path.join(path, file);
                    d = os.path.basename(self.folder_source)
                    f = os.path.relpath(path_source, self.folder_source)
                    path_target = os.path.join(self.folder_target, d, f);
                    print(path_source)
                    print(' >> ')
                    print(path_target)
                    print(' == ')
                    os.makedirs(os.path.dirname(path_target), exist_ok=True)
                    shutil.copyfile(path_source, path_target)

        self.btnGo.configure(text='Погнали!') #замена на текст по умолчанию
        self.enable_all_buttons()

    def disable_all_buttons(self):
        self.btnFrom.configure(state=tk.DISABLED)
        self.btnTo.configure(state=tk.DISABLED)
        self.btnGo.configure(state=tk.DISABLED)

    def enable_all_buttons(self):
        self.btnFrom.configure(state=tk.NORMAL)
        self.btnTo.configure(state=tk.NORMAL)
        self.btnGo.configure(state=tk.NORMAL)


Почему-то первые две строчки метода go_copy срабатывают ПОСЛЕ выполнения цикла, и сразу же две последние, из-за чего никакого эффекта не видно. Как сделать правильно?
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
@Sozdavan
Похоже, проблема в том, что строки disable_all_buttons() и btnGo.configure(text = self.folder_source + ' >> ' + self.folder_target) выполняются до начала for цикла, а enable_all_buttons() строки btnGo.configure(text='Let's go!') и выполняются после завершения for цикла.

Чтобы исправить это, вы можете использовать update() метод Tk класса tkinter для обновления графического интерфейса после выполнения строк disable_all_buttons() и btnGo.configure(text = self.folder_source + ' >> ' + self.folder_target) и до forзапуска цикла. Затем вы можете update() снова использовать этот метод после завершения for цикла и до выполнения строк и enable_all_buttons().btnGo.configure(text='Let's go!')

Вот пример того, как вы можете это сделать:

def go_copy(self):
    self.disable_all_buttons()
    self.btnGo.configure(text = self.folder_source + ' >> ' + self.folder_target)
    self.update()

    for path, directories, files in sorted(os.walk(self.folder_source)):
        for file in sorted(files):
            if file.endswith('.mp3'):
                path_source = os.path.join(path, file)
                d = os.path.basename(self.folder_source)
                f = os.path.relpath(path_source, self.folder_source)
                path_target = os.path.join(self.folder_target, d, f)
                os.makedirs(os.path.dirname(path_target), exist_ok=True)
                shutil.copyfile(path_source, path_target)
    self.update()
    self.btnGo.configure(text='Let's go!')
    self.enable_all_buttons()


Это должно сделать кнопки отключенными во время процесса копирования и снова включить их, когда процесс будет завершен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы