본문으로 바로가기
반응형

QFileDialog 는 앱에서 파일을 찾아 추가하거나 내용을 읽을 때 사용합니다. 그리고 수정한 내용을 파일로 저장할 때도 이용합니다. 오늘 샘플로 구현할 내용은 버튼을 클릭해서 파일 다이얼로그 창을 띄운 후 사용자가 선택한 파일을 읽어옵니다. 그리고 화면에 있는 TextEdit 위젯에 파일의 내용을 표시할 것입니다.

 

파일 다이얼로그를 실행할 버튼을 추가합니다. QMainWindow 에 위젯의 위치를 지정하기 위해 setGeometry() 함수를 사용했습니다. 파라미터 값은 차례대로 x, y, width, height 값을 나타냅니다.

# QButton 위젯 생성 - FileDialog 을 띄위기 위한 버튼
self.button = QPushButton('QFileDialog Open', self)
self.button.clicked.connect(self.filedialog_open)
self.button.setGeometry(10, 10, 200, 50)

 

읽어올 파일의 경로를 표시할 QLabel 객체를 초기화 함수에 추가합니다.

# QLabel 설정
self.pathLabel = QLabel(self)
self.pathLabel.setGeometry(10, 60, 400, 50)

 

다음은 QTextEdit 에 파일에서 읽은 내용을 표시할 것입니다. HTML 일 경우 소스가 아닌 디자인된 화면이 나타납니다.

# QTextEdit 파일 읽은 내용 표시
self.textEdit = QTextEdit(self)
self.textEdit.setGeometry(10, 110, 400, 200)

 

파일 다이얼로그를 Open 해서 사용자가 선택하면 내용을 읽어오는 함수는 다음과 같습니다. QFileDialog 객체를 생성하고 getOpenFileName() 함수를 이용해서 사용자가 선택한 파일의 정보를 반환받습니다.

fname = QFileDialog.getOpenFileName(self, 'Open File', '',
                                    'All File(*);; html File(*.html *.htm)')

 

화면에 표시할 파일 종류를 지정하는 필터 파라미터는 'All File(*);; html File(*.html *.htm)' 입니다. 두 가지 종류를 추가했는데 ;(세미콜론) 으로 구분합니다. 그림처럼 파일 다이얼로그에는 2가지의 선택 옵션이 있습니다. html File(*.html *.htm) 을 선택하면 파일 다이얼로그 목록에 확장자가 html 이나 htm 만 나타납니다.

 

위에서 QFileDialog 로 사용자가 선택한 파일의 정보를 반환 받아 fname 변수에 저장했습니다. fname object type 은 튜플(tuple) 입니다. 튜플은 순서가 있는 객체의 집합입니다. 그래서 인덱스로 접근이 가능합니다. 첫 번째 인덱스에는 파일 경로가 담겨져 있는데, if 로 값이 없으면 파일을 선택하지 않았습니다. “ 라는 메시지를 띄웁니다.

 

첫 번째 인덱스(fname[0])에 담겨있는 파일 Path 값으로 내용을 읽어오기 위해 open(fname[0], 'r', encoding='UTF8') 함수를 사용했습니다. open 파라미터에 반드시 encoding='UTF8' 입력합니다. 읽어온 파일의 내용은 QTextEdit 에 삽입합니다.

if fname[0]:
    # 튜플 데이터에서 첫 번째 인자 값이 주소이다.
    self.pathLabel.setText(fname[0])
    print('filepath : ', fname[0])
    print('filesort : ', fname[1])

    # 텍스트 파일 내용 읽기
    f = open(fname[0], 'r', encoding='UTF8') # Path 정보로 파일을 읽는다.
    with f:
        data = f.read()
        self.textEdit.setText(data)

else:
    QMessageBox.about(self, 'Warning', '파일을 선택하지 않았습니다.')

 

파일 다이얼로그를 여는 함수의 전체 내용은 다음과 같습니다. 해당 함수는 QPushButton 에 연결되어 있습니다. 버튼을 클릭하면 filedialog_open() 함수를 실행합니다.

def filedialog_open(self):
    fname = QFileDialog.getOpenFileName(self, 'Open File', '',
                                        'All File(*);; html File(*.html *.htm)')
    if fname[0]:
        # 튜플 데이터에서 첫 번째 인자 값이 주소이다.
        self.pathLabel.setText(fname[0])
        print('filepath : ', fname[0])
        print('filesort : ', fname[1])

        # 텍스트 파일 내용 읽기
        f = open(fname[0], 'r', encoding='UTF8') # Path 정보로 파일을 읽는다.
        with f:
            data = f.read()
            self.textEdit.setText(data)

    else:
        QMessageBox.about(self, 'Warning', '파일을 선택하지 않았습니다.')

 

전체 소스는 다음과 같습니다. 버튼을 클릭해서 파일 다이얼로그 함수를 실행한 후 사용자가 선택한 파일의 경로와 내용을 읽어 화면에 표시하는 기능입니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QFileDialog, QMainWindow, \
    QApplication, QPushButton, QMessageBox, QLabel, QTextEdit


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 420, 320)  # x, y, w, h
        self.setWindowTitle('QFileDialog Example Window')

        # QButton 위젯 생성 - FileDialog 을 띄위기 위한 버튼
        self.button = QPushButton('QFileDialog Open', self)
        self.button.clicked.connect(self.filedialog_open)
        self.button.setGeometry(10, 10, 200, 50)

        # QLabel 설정
        self.pathLabel = QLabel(self)
        self.pathLabel.setGeometry(10, 60, 400, 50)

        # QTextEdit 파일 읽은 내용 표시
        self.textEdit = QTextEdit(self)
        self.textEdit.setGeometry(10, 110, 400, 200)

    def filedialog_open(self):
        fname = QFileDialog.getOpenFileName(self, 'Open File', '',
                                            'All File(*);; html File(*.html *.htm)')
        if fname[0]:
            # 튜플 데이터에서 첫 번째 인자 값이 주소이다.
            self.pathLabel.setText(fname[0])
            print('filepath : ', fname[0])
            print('filesort : ', fname[1])

            # 텍스트 파일 내용 읽기
            f = open(fname[0], 'r', encoding='UTF8') # Path 정보로 파일을 읽는다.
            with f:
                data = f.read()
                self.textEdit.setText(data)
        else:
            QMessageBox.about(self, 'Warning', '파일을 선택하지 않았습니다.')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

반응형