2012-04-03 3 views
2

친구, 친절하게도 Windows에서 폴더를 복사하는 동안 WX 위젯 Python의 진행률 막대를 업데이트하는 방법을 도와주세요. 나는 많은 것을 시도했다. Im는 파이썬에 대한 통념이지만 그다지 전문가는 아닙니다. 그냥 콘솔 파이썬 프로그래밍에서 GUI 프로그래밍으로 전환하려고 생각했습니다. 친절하게 도와주세요.wxpython filecopy 진행률 막대

미리 감사드립니다. Ganesh R

답변

2

ProgressDialog's Update 함수 또는 UpdatePulse을 사용하면 사용자에게 무언가가 발생했음을 알리는 것만으로 충분합니다.

pulse_dlg = wx.ProgressDialog(title="Dialog Title", message="Dialog Message", maximum=100) 
# Some stuff happens 
for i in range(10): 
    wx.MilliSleep(250) 
    pulse_dlg.Update(10*i) 

또한 사용자가 작업을 중단 주제에 Mike Driscoll's excellent tutorial을 확인할 수 있습니다.

+0

감사하지만 .. 한 가지 문제 .. 내가 게시 할 때 "# 몇 가지 일이 생깁니다"대신에 copytree (소스, 대상) 구문이 표시됩니다. 폴더 및 해당 내용의 복사본을 마친 후 진행률 표시 줄이 시작됩니다 ... copytree (소스, 대상)와 진행률 막대 ... 즉, 폴더와 내용을 복사하는 동시에 진행률 표시 줄에 진행 상황을 표시해야합니다. –

+0

[shutil.copytree] (http://docs.python.org/library/shutil.html#module-shutil)를 사용하는 경우 복사 기능을 지정할 수있는 것처럼 보입니다 (기본값은 copy2입니다). 한 가지 방법은 파일이 복사 된 시간, 복사 된 바이트 수 등을보고하는 콜백 함수를 지정하는 것입니다. [threads] (http://docs.python.org/library/)를 사용하십시오. threading.html # module-threading) 하나의 스레드에서 복사하고 대상의 # 파일/바이트를 모니터합니다. – ChrisC

+0

폴더 및 해당 내용을 복사하는 동안 progress bar를 업데이트하는 copy2 콜백 함수를 사용하여 코드를 적어 둘 수 있습니까? 나는 파이썬에서 전문가가 아니다. –

0

당신은 도움이됩니다 copytree의 자신의 매우-약간 수정 된 버전을 작성할 수 있습니다

import shutil 
import os.path 
import os 

def file_copied(): 
    print "File copied!" 

# Usage example: copytree(src, dst, cb=file_copied) 
def copytree(src, dst, symlinks=False, ignore=None, cb=None): 
    """Recursively copy a directory tree using copy2(). 

    The destination directory must not already exist. 
    If exception(s) occur, an Error is raised with a list of reasons. 

    If the optional symlinks flag is true, symbolic links in the 
    source tree result in symbolic links in the destination tree; if 
    it is false, the contents of the files pointed to by symbolic 
    links are copied. 

    The optional ignore argument is a callable. If given, it 
    is called with the `src` parameter, which is the directory 
    being visited by copytree(), and `names` which is the list of 
    `src` contents, as returned by os.listdir(): 

     callable(src, names) -> ignored_names 

    Since copytree() is called recursively, the callable will be 
    called once for each directory that is copied. It returns a 
    list of names relative to the `src` directory that should 
    not be copied. 

    XXX Consider this example code rather than the ultimate tool. 

    """ 
    names = os.listdir(src) 
    if ignore is not None: 
     ignored_names = ignore(src, names) 
    else: 
     ignored_names = set() 

    os.makedirs(dst) 
    errors = [] 
    for name in names: 
     if name in ignored_names: 
      continue 
     srcname = os.path.join(src, name) 
     dstname = os.path.join(dst, name) 
     try: 
      if symlinks and os.path.islink(srcname): 
       linkto = os.readlink(srcname) 
       os.symlink(linkto, dstname) 
      elif os.path.isdir(srcname): 
       copytree(srcname, dstname, symlinks, ignore) 
      else: 
       # Will raise a SpecialFileError for unsupported file types 
       shutil.copy2(srcname, dstname) 
       if cb is not None: 
        cb() 
     # catch the Error from the recursive copytree so that we can 
     # continue with other files 
     except Error, err: 
      errors.extend(err.args[0]) 
     except EnvironmentError, why: 
      errors.append((srcname, dstname, str(why))) 
    try: 
     shutil.copystat(src, dst) 
    except OSError, why: 
     if WindowsError is not None and isinstance(why, WindowsError): 
      # Copying file access times may fail on Windows 
      pass 
     else: 
      errors.extend((src, dst, str(why))) 
    if errors: 
     raise Error, errors 

이 모든 코드가 다르게 않는 원래의 copytree가 복사 a를 한 후 지정된 함수를 호출을보다가 파일. 그래서 귀하의 경우에는 file_copied() 대신 Update() 대화 상자를 사용하거나 성공적으로 복사 된 파일 수 등을 업데이트 할 수 있습니다.

+0

당신의 도움을 위해 thnk u .. 내 파이썬 2.7에 코드를 삽입했을 때 다음 오류가 발생했습니다. 추적 (가장 최근에 마지막으로 호출) : 파일 "C : \ Python27 \ tr.py", 줄 131, createctrl self.copytree (source, destination) copytree 파일의 "C : \ Python27 \ tr.py"파일names = os.listdir (src) TypeError : 유니 코드로 강제 변환하는 중 : 필요한 문자열 또는 버퍼가 필요합니다. 인스턴트 메신저 여기에 첨부 된 메신저 .. 나는 여기에 "-4521 문자"를 보여줄 때 여기 긴 코딩을 붙여 넣는 방법을 모릅니다. 친절하게도 그것을 다운로드하고 진행 막대 func도 https : // rapidshare를 추가하십시오. co.kr/files/3443229017/tr.py –

+0

안녕하세요. 친절하게 도와주세요. –

+0

하나의 들여 쓰기가 잘못되어있는 것처럼 보입니다. 탭이나 공백 문자 만 사용하고 둘 다 사용하지 않는지 확인하고 주 클래스의 메서드가 모두 같은 수준으로 들여 쓰기되어 있는지 확인하십시오. copytree에 메소드를 선언 했으므로 선언을 예를 들어로 변경해야합니다. 'def copytree (self, src, dst, symlinks = False, 무시 = 없음, cb = 없음)'. 또한 시작하기 좋은 튜토리얼을 살펴 보는 것이 좋습니다. [Python 어려운 방법 알아보기] (http://learnpythonthehardway.org/)는 좋은 방법입니다. – ChrisC