파이썬 실습/GUI,윈도우 폴더 용량 체크 프로그램 만들기

파이썬 GUI/윈도우 폴더 용량체크 프로그램 만들기 - 4.GUI/윈도우 폴더 용량체크

파기차차 2023. 1. 6. 07:17
728x90
반응형
SMALL
728x90
반응형

ㅁ 개요

 

O 프로그램 소개

 

 

 - 이번 글은 이전글(2022.12.10 - [분류 전체보기] - 파이썬 GUI/윈도우 폴더 용량체크 프로그램 만들기 - 3.파일 및 폴더 용량 체크2)에 이은 4번째 마지막 글로 폴더 용량체크 프로그램의 GUI 버전을 만드는 방법에 대하여 설명합니다.

 

 

 

 

O 완성된 프로그램 실행 화면

 

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

(1) 폴더선택 후 라인에디트가 선택된 상태에서 (2)엔터 또는 (3)확인 버튼을 누르면 결과 화면과 같이 폴더별 용량을 계산하여 텍스트에디트에 보여줍니다.

 

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : 4.py( GUI 폴더별 사이즈 체크)

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtWidgets
import os
from PyQt5.QtGui import *

form_class = uic.loadUiType("folderCheck.ui")[0]

class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()

        self.setFixedSize(760,800)
        self.setWindowIcon(QIcon("pagichacha.png"))
        self.setupUi(self)

        self.pushButton.clicked.connect(self.checkFolderSize)
        self.lineEdit_2.returnPressed.connect(self.checkFolderSize)
        self.toolButton.clicked.connect(self.selectFolder)

    # 폴더 사이즈 확인
    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 get_size(self, path='.'):
        if os.path.isfile(path):
            return os.path.getsize(path)
        elif os.path.isdir(path):
            return self.get_dir_size(path)


    def checkFolderSize(self):
        global folder_size_total

        folder_size_total = 0

        if self.lineEdit_2.text():
            folder = self.lineEdit_2.text()
        else:
            folder = 'F:/Down'


        self.textEdit.clear()

        for item in os.listdir(folder):
            if os.path.isdir(os.path.join(folder, item)):
                try:
                    pass
                    path_ = folder + "/" + item
                    folderOrFileSize = self.get_size(path_)
                    print(type(folderOrFileSize))



                    if folderOrFileSize >= 1073741824:
                        folderOrFileSize = round(folderOrFileSize/1073741824,2)
                        folderOrFileSize = str(folderOrFileSize)+"GB"
                    elif folderOrFileSize >= 1048576:
                        folderOrFileSize = round(folderOrFileSize/1048576,2)
                        folderOrFileSize = str(folderOrFileSize)+"MB"
                    elif folderOrFileSize >= 1024:
                        folderOrFileSize = round(folderOrFileSize/1024,2)
                        folderOrFileSize = str(folderOrFileSize)+"KB"
                    else:
                        folderOrFileSize = str(folderOrFileSize)+"B"





                    print(path_,": \t\t\t", folderOrFileSize)
                    self.textEdit.append(path_+": \t\t\t"+ str(folderOrFileSize))
                except:
                    pass
                    print(path_, "는 시스템폴더로 권한 이슈로 용량체크가 어렵습니다.")
                    self.textEdit.append(path_+" 는 시스템폴더로 권한 이슈로 용량체크가 어렵습니다.")

    def selectFolder(self):
        directory = str(QtWidgets.QFileDialog.getExistingDirectory())
        self.lineEdit_2.setText('{}'.format(directory))
        self.lineEdit_2.returnPressed.connect(self.checkFolderSize)


app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")

 

 

 

 

 

O 소스 다운로드 및 실행

 

 
 - 소스파일 다운로드 후 cmd 또는 파워쉘 등에서 아래와 같이 실행하시기 바랍니다.
( 'folderCheck.ui' 파일은 실행 파일(4.py)과 동일한 경로에 위치 시켜야 합니다.)
 
 > python 4.py

 

 


 
 

O 주요 내용

 

1. 아래와 같이 프로그램 실행 후 폴더를 선택합니다.

 

 

 

 

 

 

 2. 확인 버튼을 누르면(또는 라인에디트가 선택된 상태에서 엔터를 누르면) (2)와 같이 폴더별 용량이 표시됩니다.

 

 

 

 3. qt designer에서의 모습은 이렇습니다.

 

 

 

 

 

 4. 소스를 살펴보면 관련 모듈을 임포트하고, qt designer로 만든 UI를 MyWindow클래스에서 사용하도록 상속해 줍니다.

class MyWindow(QMainWindow, form_class):

 

그리고 툴버튼을 클릭하면 폴더를 선택할 수 있도록 selectFolder()함수를 호출하고,

푸시버튼을 클릭하거나, 라이에디트에서 엔터를 누르면 폴더크기를 구하는 checkFolderSize()함수를 호출합니다.

 

 

 

 아래는 이미 이전 글에서 학습한 내용으로 파일 및 폴더 크기를 구하는 get_size()함수에 대한 내용입니다. get_size()함수는 인자로 폴더가 주어지면 다시 get_dir_size()함수를 호출하여 폴더의 크기를 구합니다.

 

아래에서 주의해야 할 점은 'self'가 붙여진 위치에 주의하시기 바랍니다. self가 붙지 않으면 에러가 발생하며, 여기서 self는 MyWindow클래스 자신을 의미합니다. 이는 self.get_dir_size() 이 아닌 get_dir_size() <-- 이렇게 사용하는 경우 누구의 함수인지 알 수 없기때문에 오류가 발생합니다.

 

def get_dir_size(self, path='.'):
total += self.get_dir_size(entry.path)
def get_size(self, path='.'):
return self.get_dir_size(path)

 

 

 마지막으로 가장 핵심적인 소스로 기본적인 내용은 아래 '소스'분석' 내용을 참고 하여 주시고 여기서는 주요한 부분만 살펴보겠습니다.

 

폴더를 선택하면 라인에디트로 경로가 나타나는데, 이 값을 읽어서 'folder'변수에 할당 합니다.(만약 선택하지 않고, '확인' 버튼을 누르면 기본적으로 'F:/Down' 폴더내의 하위 폴더들의 크기를 구합니다.)

 

os.listdir(folder): <-- 이것을 사용하면 인자로 주어진 경로(folder)의 첫번째 하위 폴더&파일 목록만 리턴합니다.

for문을 이용하여 folder의 하위목록이 폴더이면 try~ except 구문을 실행합니다.

 

여기서 'folder + "/" + item" 으로 전체 폴더경로를 만들고, 이 경로를 get_size()함수의 인자로 주어(self.get_size(path_) ) 해당 폴더의 크기를 구합니다.

 

 최종 결과 화면에 나타나는 용량 단위를 보기 좋게 하기 위하여 if문을 사용하여 KB, MB, GB 단위로 조정합니다.

(KB는 결과로 나온 숫자/1024, MB는 결과로 나온 숫자/(1024*1024), GB는 결과로 나온 숫자 / (1024*1024*1024) 로 하시면 됩니다.)

 

 그리고 마지막으로 이를 텍스트에디트에 append로 넣어 줍니다.

self.textEdit.append(path_+": \t\t\t"+ str(folderOrFileSize))

 

 

 

 


 

 

O 소스 분석

 


1.form_class = uic.loadUiType("folderCheck.ui")[0] <-- qt designer 로 만든 UI를 form_class변수에 할당
2.class MyWindow(QMainWindow, form_class): <-- form_class를 MyWindow클래스에서 상속하여 사용하겠다.
3.self.setupUi(self) <-- UI를 적용
4.self.pushButton.clicked.connect(self.checkFolderSize) <-- pushButton클릭시 checkFolderSize()함수 호출
5.self.lineEdit_2.returnPressed.connect(self.checkFolderSize) <-- lineEdit_2에서 엔터 시 checkFolderSize()함수 호출
6.self.toolButton.clicked.connect(self.selectFolder) <-- toolButton 클릭시 selectFolder()함수 호출
7.
if self.lineEdit_2.text(): <-- lineEdit_2에 값이 있으면 if문 실행
  folder = self.lineEdit_2.text() <-- lineEdit_2에 값을 읽어서 folder 변수에 할당
else:
  folder = 'F:/Down' <-- lineEdit_2에 값이 없으면 기본적으로 이 폴더 하위의 디렉토리들의 용량을 확인
8.
for item in os.listdir(folder): <-- folder에 목록을 하나씩(item) 돌면서
    if os.path.isdir(os.path.join(folder, item)): <-- 디렉토리이면 try~except 구문 실행
        try:
            path_ = folder + "/" + item <-- 하위 폴더 경로를 만들고,
            folderOrFileSize = self.get_size(path_) <--get_size()함수로 해당 폴더의 크기를 구함
            print(type(folderOrFileSize))

            if folderOrFileSize >= 1073741824: <-- 해당 폴더의 크기가 >  1024*1024*1024 이면 GB로 표시
                folderOrFileSize = round(folderOrFileSize/1073741824,2)
                folderOrFileSize = str(folderOrFileSize)+"GB"
            elif folderOrFileSize >= 1048576: <-- 해당 폴더의 크기가 >  1024*1024 이면 MB로 표시
                folderOrFileSize = round(folderOrFileSize/1048576,2)
                folderOrFileSize = str(folderOrFileSize)+"MB"
            elif folderOrFileSize >= 1024: <-- 해당 폴더의 크기가 >  1024 이면 KB로 표시
                folderOrFileSize = round(folderOrFileSize/1024,2)
                folderOrFileSize = str(folderOrFileSize)+"KB"
            else: <-- 그렇지 않으면 그냥 바이트로 표시
                folderOrFileSize = str(folderOrFileSize)+"B"

            print(path_,": \t\t\t", folderOrFileSize)
            self.textEdit.append(path_+": \t\t\t"+ str(folderOrFileSize))
        except: <-- 폴더의 크기를 계산시 오류가 발생하는 경우(거의 퍼미션 오류)에는 아래와 같이 메시지를 보여줌
            print(path_, "는 시스템폴더로 권한 이슈로 용량체크가 어렵습니다.")
            self.textEdit.append(path_+" 는 시스템폴더로 권한 이슈로 용량체크가 어렵습니다.")

    def selectFolder(self):
        directory = str(QtWidgets.QFileDialog.getExistingDirectory())
        self.lineEdit_2.setText('{}'.format(directory))
        self.lineEdit_2.returnPressed.connect(self.checkFolderSize) <-- 폴더선택 후 라인에디트에서 엔터시 checkFolderSize()함수 호출

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 마지막 글로 폴더 용량체크 프로그램의 GUI 버전을 만드는 방법에 대하여 알아보았습니다.
 
 
 
 
 - 오늘 우리가 배운 내용을 요약 정리해 보면 아래와 같습니다.
 
 
 > 1.파일 및 폴더 크기를 확인하는 함수(self.get_size())를 호출하여 해당 폴더의 크기를 가져옴
folderOrFileSize = self.get_size(path_)
 

 

오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

 

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

728x90
반응형
LIST