QFileDialog - 파일, 디렉토리 탐색 창

 

 

QFileDialog - 파일, 디렉토리 탐색 창

 

특정 파일을 찾는 경우는 File Dialog를 사용하여 파일 및 디렉토리의 경로를 찾을 수 있다.

 

Python에서 File Dialog를 만드는 두 가지 방법을 소개한다.

 

1. QFileDialog

2. tkinter

 

동일한 기능을 하는 코드이나 결과 값을 받는 타입이 다르므로, 손에 맞는 코드를 사용하면 된다.

 

기본 코드는 아래와 같다.

 

1. QFileDialog

 

QFileDialog 모듈을 이용한 다이얼로그 방식은 static functions non static functions의 두 가지 방법이 있다.

 

1) Static Functions

 

a) 단일 파일 선택

from PySide2.QtWidgets import QFileDialog

 

fileName = QFileDialog.getOpenFileName(self, self.tr("Open Data files"), "./", self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))

 

b) 다중 파일 선택

from PySide2.QtWidgets import QFileDialog

 

fileNames = QFileDialog.getOpenFileNames(self, self.tr("Open Data files"), "./", self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))

 

c) 디렉토리 선택

from PySide2.QtWidgets import QFileDialog

 

dirName = QFileDialog.getExistingDirectory(self, self.tr("Open Data files"), "./", QFileDialog.ShowDirsOnly)

 

d) 파일 저장 이름 선택

from PySide2.QtWidgets import QFileDialog

 

fileName = QFileDialog.getSaveFileName(self, self.tr("Save Data files"), "./", self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))

 

 

# File Dialog 창 이름 : self.tr("Open Data files")

# File Dialog 초기 경로 : "./"

# File Dialog에서 보여줄 파일 종류 : self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)") - 서로 다른 종류는 두 개의 세미콜론(;;)으로 구분한다.

 

QFileDialog는 파일 경로의 결과를 두 개의 값을 튜플로 반환한다. 첫번째 값은 파일 경로, 두번째 값은 파일 종류이다.


2) Non static Functions

 

a) 단일 파일 선택

from PySide2.QtWidgets import QFileDialog

 

dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.ExistingFile)
dialog.setNameFilter(self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec_():
    fileName = dialog.selectedFiles()

 

b) 다중 파일 선택

from PySide2.QtWidgets import QFileDialog

 

dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.ExistingFiles)
dialog.setNameFilter(self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec_():
    fileNames = dialog.selectedFiles()

 

c) 디렉토리 선택

from PySide2.QtWidgets import QFileDialog

 

dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.Directory)
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec_():
    dirName = dialog.selectedFiles()

 

 

 

2. tkinter

 

a) 단일 파일 선택

from tkinter import *
from tkinter import filedialog


root = Tk()
root.withdraw()
root.filename = filedialog.askopenfilename(initialdir="./", title="Open Data files", filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("all files", "*.*")))

 

b) 다중 파일 선택

from tkinter import *
from tkinter import filedialog


root = Tk()
root.withdraw()
root.filename = filedialog.askopenfilenames(initialdir="./", title="Open Data files", filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("all files", "*.*")))

 

c) 디렉토리 선택

from tkinter import *
from tkinter import filedialog


root = Tk()
root.withdraw()
root.filename = filedialog.askdirectory(initialdir="./", title="Open Data files")

# File Dialog 초기 경로 : initialdir="./"  

# File Dialog 창 이름 : title="Open Data files" 

# File Dialog에서 보여줄 파일 종류 : filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("all files", "*.*")) 

 

#### root.withdraw() --> 이것을 실행하지 않으면 아래의 그림과 작은 tk 창이 남아있다. 따라서 이 창을 제거해주기 위해서 withdraw()를 실행해준다.

 

 

실제 코드를 연습한다.

 

아래와 같이 간단한 버튼과 결과를 볼수 있는  ui 파일을 만들어 filedialog.ui로 저장한다. 

Static Function - 단일파일 objectName = BTN_filedialog_s1

Static Function - 다중파일 objectName = BTN_filedialog_s2

Static Function - 디렉토리 objectName = BTN_filedialog_s3

 

Nonstatic Function - 단일파일 objectName = BTN_filedialog_ns1

Nonstatic Function - 다중파일 objectName = BTN_filedialog_ns2

Nonstatic Function - 디렉토리 objectName = BTN_filedialog_ns3

 

단일파일 objectName = BTN_tkinter_1

다중파일 objectName = BTN_tkinter_2

디렉토리 objectName = BTN_tkinter_3

TextBrowser objectName = TBrowser

 

 

 

전체 코드

import sys
import os
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QFileDialog
from tkinter import *
from tkinter import filedialog

 

class MainView(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setupUI()

 

    def setupUI(self):
        global UI_set

 

        UI_set = QtUiTools.QUiLoader().load(resource_path("filedialog.ui"))

 

        # self.tr 메서드는 QMainWindow object를 받아 실행하기 때문에

        # 클래스 내부에 FilesOpen01 ~ FilesOpen06 메서드를 만듬
        UI_set.BTN_filedialog_s1.clicked.connect(self.FilesOpen01)
        UI_set.BTN_filedialog_s2.clicked.connect(self.FilesOpen02)
        UI_set.BTN_filedialog_s3.clicked.connect(self.FilesOpen03)

 

        UI_set.BTN_filedialog_ns1.clicked.connect(self.FilesOpen04)
        UI_set.BTN_filedialog_ns2.clicked.connect(self.FilesOpen05)
        UI_set.BTN_filedialog_ns3.clicked.connect(self.FilesOpen06)

 

        UI_set.BTN_tkinter_1.clicked.connect(FileOpen01)
        UI_set.BTN_tkinter_2.clicked.connect(FileOpen02)
        UI_set.BTN_tkinter_3.clicked.connect(FileOpen03)

 

        self.setCentralWidget(UI_set)
        self.setWindowTitle("GUI Program Test")
        self.setWindowIcon(QtGui.QPixmap(resource_path("./images/jbmpa.png")))
        self.resize(730, 420)
        self.show()

 

    # static function 단일 파일
    def FilesOpen01(self):
        fileName = QFileDialog.getOpenFileName(self, self.tr("Open Data files"), "./",
                                          self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        UI_set.TBrowser.setText(str(fileName))

 

    # static function 다중 파일
    def FilesOpen02(self):
        fileNames = QFileDialog.getOpenFileNames(self, self.tr("Open Data files"), "./",
                                          self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        UI_set.TBrowser.setText(str(fileNames))

 

    # static function 디렉토리
    def FilesOpen03(self):
        dirName = QFileDialog.getExistingDirectory(self, self.tr("Open Data files"), "./",
                                                  QFileDialog.ShowDirsOnly)
        UI_set.TBrowser.setText(str(dirName))

 

    # Non static function 단일 파일
    def FilesOpen04(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFile)
        dialog.setNameFilter(self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileName = dialog.selectedFiles()
            UI_set.TBrowser.setText(str(fileName))

 

    # Non static function 다중 파일
    def FilesOpen05(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFiles)
        dialog.setNameFilter(self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileNames = dialog.selectedFiles()
            UI_set.TBrowser.setText(str(fileNames))

 

    # Non static function 단일 파일
    def FilesOpen06(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.Directory)
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            dirName = dialog.selectedFiles()
            UI_set.TBrowser.setText(str(dirName))

 

# tkinter 단일 파일
def FileOpen01():
    root = Tk()
    root.withdraw()
    root.filename = filedialog.askopenfilename(initialdir="./", title="Open Data files",
                                               filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("all files", "*.*")))

    UI_set.TBrowser.setText(str(root.filename))

 

# tkinter 다중 파일
def FileOpen02():
    root = Tk()
    root.withdraw()
    root.filename = filedialog.askopenfilenames(initialdir="./", title="Open Data files",
                                               filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("all files", "*.*")))

    UI_set.TBrowser.setText(str(root.filename))

 

# tkinter 디렉토리 파일
def FileOpen03():
    root = Tk()
    root.withdraw()
    root.filename = filedialog.askdirectory(initialdir="./", title="Open Data files")

    UI_set.TBrowser.setText(str(root.filename))

 

# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함

def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

 

결과

결과로 받는 값의 데이터 타입이 모두 다르므로 그에 맞춰 후작업을 코딩하면 된다.

 

실행

 

 

QFileDialog로 실행한 결과

 

1) Static function 단일파일

 

 

 

2) Static function 다중파일

 

 

 

3) Static function 디렉토리

 

 

 

4) Nonstatic function 단일파일

 

 

 

5) Nonstatic function 다중파일

 

 

 

6) Nonstatic function 디렉토리

 

 

 

tkinter로 실행한 결과

 

1) 단일파일

 

 

 

2) 다중파일

 

 

 

3) 디렉토리

 

 

 

 

 

출처 : 

QFileDialog - https://doc.qt.io/qtforpython/PySide2/QtWidgets/QFileDialog.html

+ Recent posts