본문 바로가기
파이썬 (Python)/파이썬 GUI + PyQt5

파이썬 Python의 GUI 구현 PyQt5 QFileDialog Class 이용하기 + getOpenFileName + getSaveFileName + getExistingDirectory

by ★√★ 2021. 3. 2.

 안녕하세요, 이번 포스팅은 QFileDialog Class에 대해서 설명을 드릴려고 합니다. 파일 폴더나 디렉토리의 정보를 가지고 코드를 구현하는 클래스입니다. 제가 생각하기에는, User (사용자)의 편의성을 위해서는 꼭 필요한 Class 라고 생각합니다. 

 

 

Pyqt5-QFileDialog 

 

 그럼 QFileDialog Class에 대해서 하나 하나 설명 드리도록 하겠습니다.

 

 

1. QFileDialog Class

 

: 간단하게 말씀드리면, 윈도우에서 탐색기를 불러오는 Class라고 생각하시면 됩니다. 즉, Tree 구조를 가져와서, 보다 쉽게 사용자가 원하는 작업을 할 수 있는 거죠. 하지만, 그 안에서도, 그냥 단순한 탐색기 기능이 아닌, 여러가지 기능을 구현할 수 있는 Class 입니다. 관련 자료 Link는 아래 참조 하시면 됩니다.

 

 [QFileDialog Class 관련 자료 Link]

 

- 일단 오늘 설명드린 사항은 3가지 입니다. 내부 함수가 자체가 너무 많아서, 위에서 공유 드린 Link에 들어가셔서 하나 하나 보시고, 다른 블로그나 유튜브를 통해서 공부해보시길 추천 드립니다.

 

 1) QFileDialog.getOpenFileName : 파일을 여는 함수

 2) QFileDialog.getSaveFileName : 파일을 Save 하는 함수

 3) QFileDialog.getExistingDirectory : 폴더 주소를 가져오는 함수

 

 

2. 예제를 통해서, QFileDialog Class 구현해보기

 

: 위에서 설명 드린 내용은 가장 기본적인 내용을 공유 드린 것이고, 예제를 통해서, QFileDialog Class를 이용하여, 구현해보도록 하겠습니다. 일단 시나리오는 아래 3가지 이며, 예제 코드는 코드 블럭에 정리하였습니다. 

 

 1) QFileDialog.getOpenFileName : 파일을 여는 함수를 이용하여, 실제적으로 선택한 파일을 Open 함

 

# File Oepn 하는 함수를 선언
    def open_funtion(self):
        FileOpen = QFileDialog.getOpenFileName(self, 'Open file', './')

        if FileOpen[0] != "":
            os.system(FileOpen[0])  # 선택한 파일을 Open 하는 명령어 추가.

 

 2) QFileDialog.getSaveFileName : 파일을 Save 하는 함수를 이용하여, 실제적으로 TEXT 파일을 Save 함.

 

 # File Save 하는 함수를 선언
    def save_funtion(self):

        Filesave = QFileDialog.getSaveFileName(self, 'Save file', "","txt files (*.txt)")

        if Filesave[0] != "":
            with open(Filesave[0], 'w') as f:
                f.write("TEST 입니다.")   # TEXT 파일에 "TEST 입니다." 라는 문구를 적어서 저장함.

            buttonReply = QMessageBox.information(
                self, 'QMessage Demonstration Menu', Filesave[0] + " has been saved",
                QMessageBox.Ok
            )
            self.statusBar().showMessage(Filesave[0])
        else:
            buttonReply = QMessageBox.information(
                self, 'QMessage Demonstration Menu', "Any file hasn't been saved",
                QMessageBox.Ok
            )

 

 3) QFileDialog.getExistingDirectory : 선택하는 폴더의 주소를 가져옴.

 

    def folder_funtion(self):
        FileFolder = QFileDialog.getExistingDirectory(self, 'Find Folder')

        buttonReply = QMessageBox.information(
            self, 'QMessage Demonstration Menu', FileFolder + " has been selected",
            QMessageBox.Ok
        )
        self.statusBar().showMessage(FileFolder)

 

 

 

3. QFileDialog Class Code를 UI에 적용해서 구현해보기

 

: 위에서 설명 드린 3개의 함수 코드를 UI에 적용하여, 실제적으로 작은 프로그램을 만들어 보겠습니다. 관련 코드는 아래와 같습니다. 각 코드마다 설명이 필요한 부분은 주석처리 해서 기재하였습니다. 그리고 구현한 내용은 아래 Snap Shot 참조 하시면 됩니다.

 

# FileDialouge Demonstration Menu를 Demonstration하기 위한 라이브러리 / 패키지를 선언함.
import sys
import os
from PyQt5 import QtGui, QtWidgets

from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QFileDialog


class FileDialouge_Demonstration_Main(QMainWindow):
    def __init__(self) :
        super () .__init__ ()
        self.setGeometry(850, 400, 400, 400)   # Window가 등장하는 위치와 Fixedsize아닌 Window Size를 입력할 수 있음.
        self.setFixedSize(450, 400)            # Window Size를 Adjustable 하지 않고, Fixed Type으로 할 경우에 Size를 입력할 수 있음.
        self.setWindowTitle ("FileDialouge Demonstration Main")

        self.b1 = QtWidgets.QPushButton(self)    # Open File Event를 발생하기 위한 Button 생성
        self.b1.setText("Open File Function Button")
        self.b1.move(65, 70)
        self.b1.clicked.connect(self.open_funtion)  # Click 시 Open File Event를 발생하기 위해서 함수 연결.
        self.b1.resize(300, 55)
        self.b1.setFont(QtGui.QFont("Arial", 10, QtGui.QFont.Bold))

        self.b2 = QtWidgets.QPushButton(self)  # Save File Event를 발생하기 위한 Button 생성
        self.b2.setText("Save File Function Button")
        self.b2.move(65, 125)
        self.b2.clicked.connect(self.save_funtion)  # Click 시 Save File Event를 발생하기 위해서 함수 연결.
        self.b2.resize(300, 55)
        self.b2.setFont(QtGui.QFont("Arial", 10, QtGui.QFont.Bold))

        self.b3 = QtWidgets.QPushButton(self)  # Folder Find Event를 발생하기 위한 Button 생성
        self.b3.setText("Folder Find Function Button")
        self.b3.move(65, 180)
        self.b3.clicked.connect(self.folder_funtion)  # Click 시 Folder Find Event를 발생하기 위해서 함수 연결.
        self.b3.resize(300, 55)
        self.b3.setFont(QtGui.QFont("Arial", 10, QtGui.QFont.Bold))
        self.show()

    # File Oepn 하는 함수를 선언
    def open_funtion(self):
        FileOpen = QFileDialog.getOpenFileName(self, 'Open file', './')

        if FileOpen[0] != "":
            os.system(FileOpen[0])  # 선택한 파일을 Open 하는 명령어 추가.

    # File Save 하는 함수를 선언
    def save_funtion(self):

        Filesave = QFileDialog.getSaveFileName(self, 'Save file', "","txt files (*.txt)")

        if Filesave[0] != "":
            with open(Filesave[0], 'w') as f:
                f.write("TEST 입니다.")   # TEXT 파일에 "TEST 입니다." 라는 문구를 적어서 저장함.

            buttonReply = QMessageBox.information(
                self, 'QMessage Demonstration Menu', Filesave[0] + " has been saved",
                QMessageBox.Ok
            )
            self.statusBar().showMessage(Filesave[0])
        else:
            buttonReply = QMessageBox.information(
                self, 'QMessage Demonstration Menu', "Any file hasn't been saved",
                QMessageBox.Ok
            )


    # 선택한 Folder 주소를 가져오는 함수를 선언
    def folder_funtion(self):
        FileFolder = QFileDialog.getExistingDirectory(self, 'Find Folder')

        buttonReply = QMessageBox.information(
            self, 'QMessage Demonstration Menu', FileFolder + " has been selected",
            QMessageBox.Ok
        )
        self.statusBar().showMessage(FileFolder)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileDialouge_Demonstration_Main()
    app.exec_()

 

Save File 함수 수행

 

 

Save File 함수 수행이 정상적으로 됐다는 Message 등장

 

Save한 파일을 열기

 

Save한 파일을 열어보면 "TEST 입니다" 무구를 확인 하실 수 있습니다. 

 

 이상입니다. QFileDialog Class를 이용하여 Folder 주소를 가져오는 함수를 구현하였습니다. 이 부분이 간단한 것이라서, 마지막 버튼 누르시면, Window창 Status Message 항목에 표시가 될 겁니다. 기존에 PyQt5 자료에서 약간은 응용해서 코드를 구현하였습니다.

 

 위에 공유 드린 코드는 제가 나름대로 만든 코드입니다. 즉, 자신만의 코드를 만들봐야 진짜로 공부가 되실 거라고 생각합니다. 처음에는 정말 헷갈리고, 모르겠고, 코드 그냥 갖다가 붙이고 싶고 하는데, 그런 유혹을 참아내셔서, 하나 하나 치면서 해보시길 추천 드립니다. 그럼 오늘도 공부하느라고 수고 하셨습니다. 그럼 이만 마무리 하도록 하겠습니다. 감사합니다.

 

 제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab