Python论坛  - 讨论区

标题:[python-chinese] pygtk多文件复制进度对话框

2006年07月15日 星期六 16:27

yetist wu2xiaotian at gmail.com
Sat Jul 15 16:27:32 HKT 2006

#!/usr/bin/env python
# -*- encoding: utf8 -*-

# Filename: copy.py
# Discripion: 
# Author(s): yetist
# Version: 
import os
import shutil
import gtk
import gobject
import gui_dialog
#import com_i18n

#import pygtk
import gettext

#com_i18n.init()
#_ = com_i18n._
_ = gettext.textdomain

class CopyDialog(gtk.Dialog):
    def __init__(self,src_list,dst_dir,modal=True):
        gtk.Dialog.__init__(self)

        self.set_title(_("Copying..."))
        self.set_default_size(400,200)

        self.connect("destroy", self.quit)
        self.connect("delete_event", self.quit)
        if modal:
            self.grab_add()

        self.src_list=src_list
        self.dst_dir=dst_dir
        
        self.nnum=self.get_all_number(src_list)
        self.cnum=0

        self.run()

    def filecopy(self,srcfile, dstfile):

        self.fileprg.set_fraction(.0)
        self.fileprg.set_text("0%")
        while gtk.events_pending():
            gtk.main_iteration()
        length = os.stat(srcfile).st_size

        fp_s=open(srcfile,"r")
        fp_d=open(dstfile,"wb+")

        i=0.0
        while i< length:
            if length-i < 1024:
                lastsize=int(length-i)
                data1=fp_s.read(lastsize)
                i+=lastsize
            else:
                data1=fp_s.read(1024)
                i+=1024
            b=i/length
            num=str(int(b*100))+"%"
            if b <=1:
                self.fileprg.set_fraction(b)
                self.fileprg.set_text(num)
                while gtk.events_pending():
                    gtk.main_iteration()
            else:
                self.fileprg.set_fraction(1)
                self.fileprg.set_text("100%")
                while gtk.events_pending():
                    gtk.main_iteration()
            fp_d.write(data1)
        fp_s.close()
        fp_d.close()

    def showtxt(self,srcpath,dstpath):

        self.infotxt.set_text(_("copy files:"))
        self.infotxt.set_justify(gtk.JUSTIFY_FILL)

        file=os.path.basename(srcpath)

        step=self.cnum/float(self.nnum)
        self.prg.set_fraction(step)
        while gtk.events_pending():
            gtk.main_iteration()

        self.prg.set_text(_("%s of %s") % (self.cnum,self.nnum))

        self.filetxt.set_text(_("file:")+file)
        self.fromtxt.set_text(_("from:")+srcpath)
        self.totxt.set_text(_("to:")+dstpath)

    def process(self):
        for item in self.src_list:
            if os.path.isdir(item):
                #self.copy_dir(item)
                basename=os.path.basename(item) 
                ddir=os.path.join(self.dst_dir,basename)
                self.replace = True
                if os.path.exists(ddir):
                    if gui_dialog.yesno(_("directory [%s] exist,replace
it?") % basename) == gtk.RESPONSE_NO:
                        self.replace=False
                if self.replace== False:
                    for root, dirs, files in os.walk(item): #遍历目录
                        if len(dirs) !=0:
                            self.cnum+=len(dirs)
                        if len(files) != 0:
                            self.cnum+=len(files)
                        self.showtxt(item,ddir)
                else:
                    if not os.path.exists(ddir):
                        os.mkdir(ddir)
                        self.cnum+=1
                    self.showtxt(item,ddir)
                    self.copy_dir(item,ddir)

            elif os.path.isfile(item):
                basename=os.path.basename(item) 
                dfile=os.path.join(self.dst_dir,basename)
                self.replace = True
                if os.path.exists(dfile):
                    if gui_dialog.yesno("file [%s] exist,replace it?" %
basename) == gtk.RESPONSE_NO:
                        self.replace=False
                if self.replace== False:
                    self.cnum+=1
                    self.showtxt(item,dfile)
                else:
                    self.cnum+=1
                    self.showtxt(item,dfile)
                    self.filecopy(item,dfile)

    def copy_dir(self,src_dir,dst_dir):
        """把src_dir目录复制为dst_dir目录,不是复制为dst_dir目录下的子目
录"""
        if src_dir[-1] != "/":
            src_dir+="/"
        for root, dirs, files in os.walk(src_dir): #遍历目录
            if len(dirs) !=0:
                for dir in dirs:
                    newroot=root.replace(src_dir,"")

dstdir=os.path.join(os.path.join(dst_dir,newroot),dir)
                    if os.path.exists(dstdir):
                        shutil.rmtree(dstdir)
                    os.mkdir(dstdir)
                    self.cnum+=1
                    pdir=os.path.join(root,dir)
                    self.showtxt(pdir,dstdir)
        
            if len(files) !=0:
                for file in files:
                    newroot=root.replace(src_dir,"")

dstfile=os.path.join(os.path.join(dst_dir,newroot),file)
                    sfile=os.path.join(root,file)
                    self.showtxt(sfile,dstfile)
                    self.filecopy(sfile,dstfile)
                    self.cnum+=1

    def run(self):
        hbox=gtk.HBox()
        self.infotxt=gtk.Label(_("start copying..."))
        hbox.pack_start(self.infotxt,False,False,0)
        label=gtk.Label("")
        hbox.pack_start(label,True,True,0)
        self.vbox.pack_start(hbox,False,False,5)

        self.prg=gtk.ProgressBar()
        self.prg.set_text("")
        self.vbox.pack_start(self.prg,False,False,3)

        self.vbox.pack_start(gtk.HSeparator(),False,False,3)

        self.fileprg=gtk.ProgressBar()
        self.fileprg.set_text("")
        self.vbox.pack_start(self.fileprg,False,False,3)

        hbox=gtk.HBox()
        self.filetxt=gtk.Label("")
        hbox.pack_start(self.filetxt,False,False,0)
        label=gtk.Label("")
        hbox.pack_start(label,True,True,0)
        self.vbox.pack_start(hbox,False,False,5)

        hbox=gtk.HBox()
        self.fromtxt=gtk.Label("")
        hbox.pack_start(self.fromtxt,False,False,0)
        label=gtk.Label("")
        hbox.pack_start(label,True,True,0)
        self.vbox.pack_start(hbox,False,False,5)

        hbox=gtk.HBox()
        self.totxt=gtk.Label("")
        hbox.pack_start(self.totxt,False,False,0)
        label=gtk.Label("")
        hbox.pack_start(label,True,True,0)
        self.vbox.pack_start(hbox,False,False,5)

        self.show_all()
        self.process()
        self.destroy()

    def quit(self, w=None, event=None):
        self.hide()
        self.destroy()

    def get_all_number(self,srclist):
        num=0L
        for item in srclist:
            if os.path.isdir(item): #如果是目录,就计算整个目录的大小
                for root, dirs, files in os.walk(item): #遍历目录
                    if len(dirs) !=0:
                        num+=len(dirs)
                    if len(files) !=0:
                        num+=len(files)
            else: #如果是文件就加一
                num+=1
        return num

if __name__ == "__main__":
    srclist=[ '/etc/fonts',
'/etc/fdmount.conf','/home/yetist/tmp/knoppix_2.6.12_wu.iso',
'/etc/fam.conf', '/etc/exim4']
    dstdir="/tmp"
    a=CopyDialog(srclist,dstdir,True)
-----------------------
这是一个显示多文件复制过程的进度对话框,srclist列表中为要复制的文件/目
录,dstdir为要复制到的目录。
现在此对话框工作正常,可是还需要加入一个取消按钮,我曾经加入取消按钮,可
是点击之后,程序的运行就比较异常,谁能帮我在里面加入一个取消按钮?谢了。
附件是对话框。
运行时把这两个文件放在同一目录下就可以。
-------------- next part --------------
A non-text attachment was scrubbed...
Name: gui_dialog.py
Type: text/x-python
Size: 9433 bytes
Desc: not available
Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20060715/70c4c344/gui_dialog.py

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号