[Python] wxPythhon 전송 폴더 사용하기 (진도 대화상자, 다중 루틴 구현)

진행 대화 상자란?


파일 전송하고 설치할 때 나오는 거예요.

wxPythhon을 사용하여 전송 파일을 만들 때 표시되는 진행 대화상자입니다.
저번의 글의 계속.

wx.ProgressDialog

ProgressDialog 범주를 사용하여 진행 대화 상자를 표시합니다.
클래스 매개변수는 다음과 같습니다.
・title(string) - 대화상자의 왼쪽 위 모서리에 표시되는 문
• 메시지 (string) - 실행 시 표시되는 진행률 정보(%~%, 등)
・maximum(int) – 진행률 막대의 최대값(여러 부분으로 분할됨).기본값은 100이며 기본적으로 변경하지 않아도 됩니다.
・parent(wx.Window) - 대화상자의 상위 객체를 지정합니다.안 바꿔도 돼.
・style(int) - 대화상자의 스타일을 변경합니다.(후술)

스타일 정보


대화 상자가 표시되면 기능을 옵션으로 추가할 수 있습니다.
이번에는 다음과 같은 기능을 추가한다.
・wx.PD_AUTO_HIDE - 프로세스가 끝나면 대화 상자가 자동으로 닫힙니다.
・wx.PD_CAN_ABORT - Close 버튼을 표시하고 중지를 누릅니다.
・wx.PD_REMAINING_TIME - 남은 시간을 표시합니다.
스타일공식 문서에 대한 일람표가 있습니다.

        # プログレスダイアログ作成
        dlg = wx.ProgressDialog(
            title="コピー中",
            message="0/100",
            maximum=100,
            style=wx.PD_AUTO_HIDE | wx.PD_CAN_ABORT | wx.PD_REMAINING_TIME)

        # ダイアログ表示
        dlg.ShowModal()

ProgressDialog.Update

Update 사용 방법을 통해 진도표와 메시지를 업데이트할 수 있습니다.
        # プログレスダイアログ作成
        dlg = wx.ProgressDialog(
            title="コピー中",
            message="0/100",
            maximum=100,
            style=wx.PD_AUTO_HIDE | wx.PD_CAN_ABORT | wx.PD_REMAINING_TIME)

        # ダイアログ表示
        dlg.ShowModal()
        rate = 0

        # ループ処理
        while rate < 100:
            # 0.5秒待つ
            time.sleep(0.5)

            # 値の更新
            dlg.Update(value=rate, newmsg="%d/100" % rate + "%")

        dlg.Destroy()

폴더 용량 비교


진도표는 이미 준비가 되었으며, 다음은 프로세스에 따라 변화하는 진도표입니다.
이번에는 폴더 전송을 목적으로 합니다.
• 대상 폴더의 용량
• 폴더 용량 이동
이 두 개를 비교해 보자.
동피하 기사1가 있어서 다 썼어요.
    # フォルダサイズ取得
    def get_dir_size(self, path="."):
        total = 0
        with os.scandir(path) as it:
            for entry in it:
                if entry.is_file():
                    total += entry.stat().st_size
                elif entry.is_dir():
                    total += self.get_dir_size(entry.path)
        return total
그리고 사이즈의 결과를 백분율로 비교하면 됩니다.
방금 진도 대화상자가 업데이트된 곳에 적용됩니다.
    # ボタンのクリックでプログレスバー表示
    def progress(self, event):

        # プログレスダイアログ
        dlg = wx.ProgressDialog(
            title="コピー中",
            message="0/100",
            maximum=100,
            style=wx.PD_AUTO_HIDE | wx.PD_CAN_ABORT | wx.PD_REMAINING_TIME)

        dlg.ShowModal()
        rate = 0

        # ループ処理
        while rate < 100:
            # 0.5秒待つ
            time.sleep(0.5)

            # サイズから割合を算出
            rate = self.get_dir_size(
                self.old.GetLabel())/self.get_dir_size(self.old.GetLabel())*100

            # 値の更新
            dlg.Update(value=rate, newmsg="%d/100" % rate + "%")

        dlg.Destroy()

다중 스레드


같은 라인에서 '대화상자 표시 관련' 과 '파일 전송' 을 할 때
처리 応答していません 를 참을 수 없는 로그가 나왔습니다. 창이 다운되었습니다.
따라서 '대화상자의 디스플레이 연결' 과 '파일의 전송' 을 라인에서 분리하면 효과가 좋습니다.
    def done(self,event):
        #別スレッドを生成する。
        thr = threading.Thread(target=self.replace_folder, args=(event,))
        thr_progress = threading.Thread(target=self.progress, args=(event,))
        thr.start()
        thr_progress.start()
우리는 단독 라인을 만들고 실행에만 사용할 방법을 만들었습니다.
실행 단추를 누르면 여러 개의 단서를 만들고 실행합니다.
완료된 대화상자는 여기에 있습니다.

파이톤을 거의 접하지 않았지만 앞으로 Syling 같은 마법도 사용할 수 있도록 노력하겠습니다.
참조 링크  

좋은 웹페이지 즐겨찾기