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_())
'파이썬 > PyQt5' 카테고리의 다른 글
파이썬(Python) PyQt5 QComboBox 로 콤보박스 기능 구현 하기 (0) | 2021.11.08 |
---|---|
파이썬(Python) PyQt5 파일 다이얼로그 QColorDialog사용하기 (0) | 2021.11.05 |
파이썬(Python) PyQt5 QMessageBox 구현하기 (0) | 2021.11.02 |
파이썬(Python) PyQt5 레이아웃 QGridLayout 구현하기 (0) | 2021.11.02 |
파이썬(Python) PyQt5 QLineEdit 한 줄 입력 라인에디터 사용법 (0) | 2021.11.02 |