다이얼로그 위젯 응용

Siwoo Pak·2024년 2월 29일
0
post-thumbnail
  1. 파일 읽고 쓰기
    1-1)파일 쓰기
f = open("새파일.txt", 'w', encoding='UTF8')
f.close()
  • 파일 접근 모드
파일접근모드설명
r읽기모드 - 파일을 읽기만 할때
w쓰기모드 - 파일에 내용을 쓸 때 사용, 기존 내용 삭제하고 다시 작성
a추가모드 - 파일의 마지막에 새로운 내용을 추가할 때 사용
  • 코드
f = open("새파일.txt", 'w', encoding = 'UTF8')
data = "안녕하세요"
f.write(data)
f.close() #파일스트림은 닫지 않으면 다른 접근할 수 없기 때문에 작업이 끝나면 닫아줘야 한다.

1-2) 파일 읽기

  • 메서드
파일 읽기 메서드설명
readline()파일에 접근해서 제일 처음 한줄만 읽어서 저장하고, 커서를 다음 줄로 내리기
readlines()파일의 모든 내용을 한줄씩 읽어서 한줄씩 리스트에 저장하기
read()파일 내용 전체를 읽어서 하나의 문자열로 저장하기
  • 코드
def read_line():
	f = open("새파일.txt", 'r')
    line = f.readline()
    print(line)
    f.close()
    
def read_lines():
	f = open("새파일.txt", 'r')
	lines = f.readlines()
    print(lines)
    for line in lines:
    	print(line, end="")
    f.close()

def read_all():
	f = open("새파일.txt", 'r')
    line = f.read()
    print(line)
    f.close()
  1. QFileDialog 기본 코드 설명
  • 단일 파일선택
from PySide6.QtWidgets import QFileDialog

dialog = QFileDialog(self)
# 단일 파일 선택모드
dialog.setFileMode(QFileDialog.ExistingFile)
dialog.setNameFilter(self.tr("Data Files(*.csv *.xls *.xlsx);; Images(*.png *.jpg);; All Files(*.*)"))
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec():
	fileNames = dialog.selectedFiles()
  • 다중 파일 선택
from PySide6.QtWidgets import QFileDialog

dialog = QFileDialog(self)
# 다중 파일 선택모드
dialog.setFileMode(QFileDialog.ExistingFiles)
dialog.setNameFilter(self.tr("Data Files(*.csv *.xls *.xlsx);; Images(*.png *.jpg);; All Files(*.*)"))
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec():
	fileNames = dialog.selectedFiles()
  • 디렉토리 선택
from PySide6.QtWidgets import QFileDialog

dialog = QFileDialog(self)
# 디렉토리 선택모드
dialog.setFileMode(QFileDialog.Directory)
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec():
	dirName = dialog.selectedFiles()
  1. 전체 코드
import sys
import os
from PySide6 import QtGui, QtUiTools
from PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog

loader = QtUiTools.QUiLoader()


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        global UI_MAIN
        UI_MAIN = loader.load(resource_path("file_dialog.ui"))

		# 각 버튼에 이벤트 연결    
		UI_MAIN.btn_file.clicked.connect(self.openfile)
        UI_MAIN.btn_files.clicked.connect(self.openfiles)
        UI_MAIN.btn_dir.clicked.connect(self.opendir)
        UI_MAIN.btn_read.clicked.connect(readfile)
        UI_MAIN.btn_write.clicked.connect(writefile)

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("파일 읽고 쓰기")
        self.setWindowIcon(QtGui.QPixmap(resource_path("python_logo.png")))
        self.resize(600, 500)
        self.show()

    def openfile(self):
        UI_MAIN.te_path.clear()
        dialog = QFileDialog(self)
        # 단일 파일 선택모드
        dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
        dialog.setNameFilter(self.tr("Data Files(*.csv *.xls *.xlsx);; Images(*.png *.jpg);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.ViewMode.Detail)
        if dialog.exec():
            fileName = dialog.selectedFiles()
            # line editor의 경우 setText()메서드를 썼으나, text editor의 경우 insertPlainText()메서를 사용함.
            UI_MAIN.te_path.insertPlainText(str(fileName))

    def openfiles(self):
        UI_MAIN.te_path.clear()
        dialog = QFileDialog(self)
        # 다중 파일 선택모드
        dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
        dialog.setNameFilter(self.tr("Data Files(*.csv *.xls *.xlsx);; Images(*.png *.jpg);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.ViewMode.Detail)
        if dialog.exec():
            fileNames = dialog.selectedFiles()
            # line editor의 경우 setText()메서드를 썼으나, 
            # text editor의 경우 insertPlainText()메서를 사용함.
            UI_MAIN.te_path.insertPlainText(str(fileNames))

    def opendir(self):
        UI_MAIN.te_path.clear()
        dialog = QFileDialog(self)
        # 디렉토리 선택모드
        dialog.setFileMode(QFileDialog.Directory)
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec():
            dirName = dialog.selectedFiles()
            UI_MAIN.te_path.insertPlainText(str(dirName))


def readfile():
    path = eval(UI_MAIN.te_path.toPlainText())
    f = open(path[0], 'r', encoding='UTF8')
    lines = f.readlines()
    for line in lines:
        UI_MAIN.te_contents.insertPlainText(line)
    f.close()


def writefile():
    # toPlainText()는 읽어오는
    path = eval(UI_MAIN.te_path.toPlainText())
    f = open(path[0], 'w', encoding='UTF8')
    data = UI_MAIN.te_contents.toPlainText()
    f.write(data)
    f.close()
    # 파일 안에 작업이 끝난후 te_contents 내용을 지운다.
    UI_MAIN.te_contents.clear()

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


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    sys.exit(app.exec())
  1. 실행화면
  • 기본화면
  • 단일 파일 선택 버튼 클릭시 화면
  • 파일 선택 후 화면
  • 읽어오기 버튼 클릭 후 화면
  • 내용 작성후 쓰기 버튼 클릭

profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글