Найти - Пользователи
Полная версия: Копирование файлов и ttk.Progressbar, как связать?
Начало » Python для новичков » Копирование файлов и ttk.Progressbar, как связать?
1
FrakeStolsTM
Здравствуйте!
В моей программе имеется функция копирования файлов и директорий.
использую Tkinter для создания GUI, сделал прогрессбар, задача состоит в том, чтобы прогресс бар обновлялся в реальном времени во время копирования. Не знаю как связать эти два элемента вместе. Просьба помочь
PEHDOM
Вы бы выложили хоть какойто код который можно запустить. Потому как на ваш вопрос в текущей формулировке возможен только вот такой ответ:
https://www.google.com/?gfe_rd=cr&ei=3o5aWZX7NsPi8Ae65rtQ&gws_rd=ssl#q=python+progressbar+copy
FrakeStolsTM
Например вот такой код:

 from tkinter import *
import tkinter.ttk as ttk
import shutil, os
class Application(Frame):
    
    def __init__(self, master):
        super(Application, self).__init__(master)
        self.grid()
        self.create_widgets()
        
    def create_widgets(self):
        self.pb = ttk.Progressbar(length=200)
        self.pb.grid()
    
    def copyfiles(self):
        folder_from = "C://test123"
        folder_to = "E://new"
        for f in os.listdir(folder_from):
            if os.path.isfile(os.path.join(folder_from, f)):
                shutil.copy(os.path.join(folder_from, f), os.path.join(folder_to, f))
                 
            if os.path.isdir(os.path.join(folder_from, f)):
                shutil.copytree(os.path.join(folder_from, f), os.path.join(folder_to, f))
        
root = Tk()       
app = Application(root)
app.copyfiles()
root.mainloop()
PEHDOM
ну примерно вот так:
 from tkinter import *
import tkinter.ttk as ttk
import shutil, os
import time
class Application(Frame):
    def __init__(self, master):
        super(Application, self).__init__(master)
        self.progressVar = IntVar() # переменная в которой храним прогресс прогрессбара
        self.grid()
        self.create_widgets()
    def create_widgets(self):
        self.pb = ttk.Progressbar(length=200, variable = self.progressVar, maximum = 100)
        self.pb.grid()
    def incPB(self):
        # увеличить состояние прогрессбара на 1
        self.progressVar.set(self.progressVar.get()+1)
        self.pb.update()
    def copyfiles(self):
        src = "e:\\from"
        dst = "e:\\to"
        countFiles = 0
        #считаем к-во файлов
        for path, dirs, filenames in os.walk(src):
           countFiles  = countFiles + len(filenames)
        self.pb['maximum'] = countFiles # устанавливаем максимум прогресбара равнйм к-ву файлов
        self.progressVar.set(0)  # обнуляем счетчик прогрессбара
        #копируем
        shutil.copytree(src, dst, copy_function=self.copyProgress)
    def copyProgress(self, src, dst):
        # функция котороую дергает shutil.copytree при каждом копировании файла
        print('copy from',src, 'to', dst)
        shutil.copy2(src,dst)
        self.incPB()
        time.sleep(1) # задержка чтобы было видно прогресс на примере из пары файлов
root = Tk()
app = Application(root)
app.copyfiles()
root.mainloop()
это при условии что dst не существует, в таком случае оно само все сделает.
Иначе копировать пофайлово и проверять на существование
 from tkinter import *
import tkinter.ttk as ttk
import shutil, os
import time
class Application(Frame):
    def __init__(self, master):
        super(Application, self).__init__(master)
        self.progressVar = IntVar() # переменная в которой храним прогресс прогрессбара
        self.grid()
        self.create_widgets()
    def create_widgets(self):
        self.pb = ttk.Progressbar(length=200, variable = self.progressVar, maximum = 100)
        self.pb.grid()
    def incPB(self):
        # увеличить состояние прогрессбара на 1
        self.progressVar.set(self.progressVar.get()+1)
        self.pb.update()
    def copyfiles(self):
        src = "e:\\from"
        dst = "e:\\to"
        countFiles = 0
        #считаем к-во файлов
        for path, dirs, filenames in os.walk(src):
           countFiles  = countFiles + len(filenames)
        self.pb['maximum'] = countFiles # устанавливаем максимум прогресбара равнйм к-ву файлов
        self.progressVar.set(0)  # обнуляем счетчик прогрессбара
        #копируем
        for path, dirs, filenames in os.walk(src):
            for directory in dirs:
                srcPath = os.path.join(path, directory)
                dstPath = srcPath.replace(src,dst)
                if not os.path.exists(dst):
                    os.makedirs(dstPath)
            for fileName in filenames:
                srcPath = os.path.join(path, fileName)
                dstPath = srcPath.replace(src, dst)
                if not os.path.exists(dst):
                    print('copy from', srcPath, 'to ', dstPath)
                    shutil.copy(srcPath, dstPath)
                self.incPB()
                time.sleep(1) # задержка чтобы было видно прогресс на примере
root = Tk()
app = Application(root)
app.copyfiles()
root.mainloop()
прогрессбар отбражает только к-во скопированых файлов,без учета размера. Если хотите с учетом размера то алгоритм будет сложнее.
FrakeStolsTM
Спасибо, очень признателен. Буду пробовать
FrakeStolsTM
PEHDOM
ну примерно вот так:

Хотелось бы уточнить, первый скрипт работает замечательно. Но в моей ситуации мне нужно как раз таки второй вариант, когда dst уже существует (копировать файлы и папки в корень USB-флешки). Второй код не копирует ничего, хотя прогресс бар бежит. Извиняюсь за глупые вопросы, изучаю Python только 1ый месяц)
PEHDOM
млин недосмотрел
 if not os.path.exists(dst):
нужно заменить на
  if not os.path.exists(dstPath):
в двух местах.
Да и если такой файл существует оно не перезапишет его.
FrakeStolsTM
PEHDOM
млин недосмотрел
Огромное спасибо, Вы мне очень помогли)
Fedor_Bober
Всех приветствую. Спасибо за идею и реализацию. Но есть вопрос. Прогрессбар доходит до конца и не закрывается.
PEHDOM
Fedor_Bober
Прогрессбар доходит до конца и не закрывается.
Так надо его закрыть. Это всего лишь простейший пример демонстрирующий общий принцип работы там много чего нет, это уже каждый допиливает по мере того что ему нужно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB