QFileDialog - 파일, 디렉토리 탐색 창 > Pyside6 - GUI for Python

본문 바로가기

사이트 내 전체검색

이전으로Pyside6 - GUI for Python

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

페이지정보

글쓴이 관리자 조회 38,426 조회 날짜 19-12-04 15:15 / U:22-12-05 02:04
댓글 0댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

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

 

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

 

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

 

1. QFileDialog

2. tkinter

 

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

 

기본 코드는 아래와 같다.

 

1. QFileDialog

 

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

 

1) Static Functions

 

a) 단일 파일 선택

from PySide6.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 PySide6.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 PySide6.QtWidgets import QFileDialog

 

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

 

d) 파일 저장 이름 선택

from PySide6.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 PySide6.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 PySide6.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 PySide6.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()를 실행해준다.

1269731307_1575499538.0997.png

 

 

실제 코드를 연습한다.

 

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

2921058436_1580351033.5783.png

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 PySide6 import QtUiTools, QtGui
from PySide6.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())

 

 

결과

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

 

실행

2921058436_1580351033.5783.png

 

 

QFileDialog로 실행한 결과

 

1) Static function 단일파일

2921058436_1580352249.1501.png

 

2921058436_1580352255.9492.png

 

 

2) Static function 다중파일

2921058436_1580352268.74.png

 

2921058436_1580352283.1216.png

 

 

3) Static function 디렉토리

2921058436_1580352291.3994.png

 

2921058436_1580352296.3708.png

 

 

4) Nonstatic function 단일파일

2921058436_1580352327.6147.png

 

2921058436_1580352336.7086.png

 

 

5) Nonstatic function 다중파일

2921058436_1580352346.0951.png

 

2921058436_1580352362.7923.png

 

 

6) Nonstatic function 디렉토리

2921058436_1580352380.3115.png

 

2921058436_1580352406.7755.png

 

 

tkinter로 실행한 결과

 

1) 단일파일

2921058436_1580352423.1549.png

 

2921058436_1580352427.738.png

 

 

2) 다중파일

2921058436_1580352434.7611.png

 

2921058436_1580352439.7537.png

 

 

3) 디렉토리

2921058436_1580352449.3405.png

 

2921058436_1580352456.2889.png

 

 

 

 

출처 : 

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

댓글목록

댓글이 없습니다

게시물 검색
총 12 건 , 1 페이지
올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구
Copyright © JBMPA.com All rights reserved.
사이트 언어 선택
PC 보기