ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글(2022.12.10 - [분류 전체보기] - 파이썬 GUI/윈도우 폴더 용량체크 프로그램 만들기 - 3.파일 및 폴더 용량 체크2)에 이은 4번째 마지막 글로 폴더 용량체크 프로그램의 GUI 버전을 만드는 방법에 대하여 설명합니다.
O 완성된 프로그램 실행 화면
(1) 폴더선택 후 라인에디트가 선택된 상태에서 (2)엔터 또는 (3)확인 버튼을 누르면 결과 화면과 같이 폴더별 용량을 계산하여 텍스트에디트에 보여줍니다.
![](https://blog.kakaocdn.net/dn/WsT8A/btrTh6zrktW/WwTJpiVc9LEXAbdBNr3rKK/img.png)
ㅁ 세부 내용
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 소스 다운로드 및 실행
O 주요 내용
1. 아래와 같이 프로그램 실행 후 폴더를 선택합니다.
![](https://blog.kakaocdn.net/dn/byt9Me/btrTjFuAIpw/XrxGip4IgqORArjnFzdSWk/img.png)
2. 확인 버튼을 누르면(또는 라인에디트가 선택된 상태에서 엔터를 누르면) (2)와 같이 폴더별 용량이 표시됩니다.
![](https://blog.kakaocdn.net/dn/bkodM0/btrTiWDhGJk/P0GmBRci5K52vPBzwL8DN1/img.png)
3. qt designer에서의 모습은 이렇습니다.
![](https://blog.kakaocdn.net/dn/bbmBti/btrTkhHdjRQ/OqD96oUATsGz6NlkVqBGO0/img.png)
4. 소스를 살펴보면 관련 모듈을 임포트하고, qt designer로 만든 UI를 MyWindow클래스에서 사용하도록 상속해 줍니다.
class MyWindow(QMainWindow, form_class):
그리고 툴버튼을 클릭하면 폴더를 선택할 수 있도록 selectFolder()함수를 호출하고,
푸시버튼을 클릭하거나, 라이에디트에서 엔터를 누르면 폴더크기를 구하는 checkFolderSize()함수를 호출합니다.
![](https://blog.kakaocdn.net/dn/xpfJJ/btrThzB4SQJ/03jdEFJsDHL2Kye6btQ0H1/img.png)
아래는 이미 이전 글에서 학습한 내용으로 파일 및 폴더 크기를 구하는 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)
![](https://blog.kakaocdn.net/dn/U8zJD/btrTgdfKPpR/gkzBr6DKdCySKQE8oCuCLk/img.png)
마지막으로 가장 핵심적인 소스로 기본적인 내용은 아래 '소스'분석' 내용을 참고 하여 주시고 여기서는 주요한 부분만 살펴보겠습니다.
폴더를 선택하면 라인에디트로 경로가 나타나는데, 이 값을 읽어서 '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))
![](https://blog.kakaocdn.net/dn/beyoPs/btrThH7MOxu/MlFHOZwKAViz4mKJXCLyh0/img.png)
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,윈도우 폴더 용량 체크 프로그램 만들기' 카테고리의 다른 글
파이썬 GUI/윈도우 폴더 용량체크 프로그램 만들기 - 3.파일 및 폴더 용량 체크2 (0) | 2023.01.06 |
---|---|
파이썬 GUI/윈도우 폴더 용량체크 프로그램 만들기 - 2.파일 및 폴더 용량 체크1 (0) | 2023.01.06 |
파이썬 GUI/윈도우 폴더 용량체크 프로그램 만들기 - 1.소개편 (0) | 2023.01.06 |