Уведомления

Группа в Telegram: @pythonsu

#1 Июль 3, 2017 20:51:46

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

Здравствуйте!
В моей программе имеется функция копирования файлов и директорий.
использую Tkinter для создания GUI, сделал прогрессбар, задача состоит в том, чтобы прогресс бар обновлялся в реальном времени во время копирования. Не знаю как связать эти два элемента вместе. Просьба помочь

Офлайн

#2 Июль 3, 2017 21:42:31

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

Вы бы выложили хоть какойто код который можно запустить. Потому как на ваш вопрос в текущей формулировке возможен только вот такой ответ:
https://www.google.com/?gfe_rd=cr&ei=3o5aWZX7NsPi8Ae65rtQ&gws_rd=ssl#q=python+progressbar+copy



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 3, 2017 21:44:34)

Офлайн

#3 Июль 3, 2017 21:53:19

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

Например вот такой код:

 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()

Офлайн

#4 Июль 4, 2017 17:01:07

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

ну примерно вот так:

 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()
прогрессбар отбражает только к-во скопированых файлов,без учета размера. Если хотите с учетом размера то алгоритм будет сложнее.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 4, 2017 17:05:46)

Офлайн

#5 Июль 4, 2017 18:00:39

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

Спасибо, очень признателен. Буду пробовать

Офлайн

#6 Июль 4, 2017 19:55:03

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

PEHDOM
ну примерно вот так:

Хотелось бы уточнить, первый скрипт работает замечательно. Но в моей ситуации мне нужно как раз таки второй вариант, когда dst уже существует (копировать файлы и папки в корень USB-флешки). Второй код не копирует ничего, хотя прогресс бар бежит. Извиняюсь за глупые вопросы, изучаю Python только 1ый месяц)

Отредактировано FrakeStolsTM (Июль 4, 2017 19:55:35)

Офлайн

#7 Июль 4, 2017 20:02:27

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

млин недосмотрел

 if not os.path.exists(dst):
нужно заменить на
  if not os.path.exists(dstPath):
в двух местах.
Да и если такой файл существует оно не перезапишет его.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 4, 2017 20:06:11)

Офлайн

#8 Июль 4, 2017 20:06:44

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

PEHDOM
млин недосмотрел
Огромное спасибо, Вы мне очень помогли)

Офлайн

#9 Июнь 7, 2019 12:59:25

Fedor_Bober
От: Екатеринбург
Зарегистрирован: 2019-06-07
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

Всех приветствую. Спасибо за идею и реализацию. Но есть вопрос. Прогрессбар доходит до конца и не закрывается.

Офлайн

#10 Июнь 7, 2019 14:36:58

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Копирование файлов и ttk.Progressbar, как связать?

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version