본문 바로가기
  • ▒ 네모의 쉽게 배우는 네트워크 | 개발 ▒
파이썬 개발/Qypt5

PyQt5 - QFileDialog.getOpenFileName 파일 선택후 파일명 가져와서 라인 에디터에 입력하기

by 너l모 2022. 8. 9.
반응형

※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!


 ο 목차

     


    ※ 코드 보는 방법 참고

    ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력

    ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력

    ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력

    ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력


    안녕하세요, 네모입니다 :D

    파일 내용 탐색 후 선택한 파일명을 지정된 라인 에디터에 입력하는 코드를 작성해보려 합니다~

     

    궁금하신점 있으면 언제든 댓글 주세요

     

    1. 주요 코드 개요 

    1) 파일 탐색(QFileDialog) 

    - 푸시 버튼 생성

    - 푸시 버튼 누르면 파일 탐색창 열기(현재 Python 파일이 있는 디렉토리 경로)

    - 파일 선택시 파일명을 라인 에디트로 리턴

     

    2) 라인 에디트(QLineEdit)  코드

    - 사용자 임의 수정 불가능하게 설정

    - 파일 탐색창으로부터 전달받은 파일명을 지정된 라인 에디트에 출력

     

    2. 전체 코드

    # -*- coding: utf-8 -*-
    
    from PyQt5 import QtCore, QtWidgets
    import sys
    
    class Python_Install(QtWidgets.QWidget) :
        def __init__(self):
            super().__init__()
            self.setWindowTitle('main_window')
            self.resize(800, 600)
            self.initUI()
    
        def initUI(self):
            # Subject Label
            self.lb_sbj = QtWidgets.QLabel(self)
            self.lb_sbj.setText('파일 탐색 테스트 윈도우')
            self.lb_sbj.setGeometry(QtCore.QRect(50, 70, 631, 18))
            font1 = self.lb_sbj.font()
            font1.setPointSize(10)
            font1.setFamily('Times New Roman')
            font1.setBold(True)
            self.lb_sbj.setFont(font1)
            self.lb_sbj.adjustSize()
            # add GroupBox
            self.gb = QtWidgets.QGroupBox(self)
            self.gb.setGeometry(QtCore.QRect(40, 120, 731, 331))
            self.gb.setTitle('파일 업로드')
            # 주요 코드
            self.LB_host = QtWidgets.QLabel(self.gb)
            self.LB_host.setGeometry(QtCore.QRect(50, 70, 121, 18))
            self.LB_host.setText('파일명 :')
            self.LE1 = QtWidgets.QLineEdit(self.gb)
            self.LE1.setGeometry(QtCore.QRect(200, 60, 301, 25))
            self.LE1.setReadOnly(True)
            self.FC1 = QtWidgets.QPushButton(self.gb)
            self.FC1.setGeometry(QtCore.QRect(510, 60, 112, 34))
            self.FC1.setText('파일 선택')
            # 푸시 버튼 클릭시 파일 탐색기 슬롯과 연결
            self.FC1.clicked.connect(lambda: self.File_Choose(self.LE1))
    
    	# 파일 탐색기 슬롯
        def File_Choose(self, X):
            file, check = QtWidgets.QFileDialog.getOpenFileName(self, '호스트 파일 선택창', "", "All Files (*);;Text Files (*.txt)")
            if check:
                X.setText(file)
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        mw = Python_Install()
        mw.show()
        sys.exit(app.exec_())

     

    3. 코드 상세 분석

    1) 파일탐색(QFileDialog) 슬롯(slot)

    -  "파일탐색 및 라인 에디트에 파일명 쓰기" 슬롯 코드

    def File_Choose(self, X):
        file, check = QtWidgets.QFileDialog.getOpenFileName(self, '호스트 파일 선택창', '', 'All Files (*);;Text Files (*.txt)')
        
        if check:
            X.setText(file)

    - "X" 인자는 파일명을 입력할 라인 에디트 인스턴스 값을 전달하여 사용

     

    2)  getOpenFileName 메소드 분석

    - QFileDialog 위젯 클래스의 메소드

    - 첫번째 인자(self) : 부모 위젯으로 값이 설정되는 경우 설정된 부모 위젯의 중앙에서 파일 탐색 창이 열림. 일반적으로 "None"으로 하거나 "self" 사용

    - 두번째 인자('호스트 파일 선택창') : 파일 탐색 윈도우 왼쪽 상단에 표시되는 이름. 

    - 세번째 인자('') : 파일 탐색기 시작 디렉토리 설정. 빈 값을 설정하는 경우 현재 디렉토리에서 파일 탐색기가 열림.

    - 네번째 인자('All Files (*);;Text Files (*.txt)') : 하단 오른쪽의 파일 필터값을 설정하는 인자.

    - getOpenFileName 메소드의 각 인자별 설정 내용 참고 ↓

     

    3) 슬롯에 self 외의 추가 인자 전달

    - 해당 코드 내용 참고 ↓

    self.FC1.clicked.connect(lambda: self.File_Choose(self.LE1))

    - 위의 코드와 같이 File_Choose라는 슬롯에 추가 인자를 전달하는 경우 'lambda:' 함수 반드시 추가해서 사용해야 함

    ※ Qt의 신호-슬롯 전달 매커니즘에서는 추가 인수를 직접 전달하는 방법을 지정하고 있지 않기 때문에 lambda 함수를 활용해서 추가 인수를 전달해주어야 함 

     

    4) 라인 에디트 - 사용자 임의 수정 제한하기

    - 해당 코드 내용 참고 ↓

    self.LE1.setReadOnly(True)

    - setReadOnly 메소드 값을 True 로 설정하여 사용자의 "쓰기" 권한을 제한

    4. 코드 실행 결과

    - 메인 윈도우

    - 파일 탐색기 실행

    - 결과 확인

     


    ※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다. 

     

     

     

    반응형

    댓글