파이썬 실습/GUI 메모장 만들기

파이썬 GUI/윈도우 메모장 프로그램 만들기

파기차차 2022. 12. 12. 06:42
728x90
반응형
SMALL
728x90
반응형
ㅁ 개요

 

O 프로그램 소개
 

 - 이번 프로그램은 파이썬으로 간단한 GUI/윈도우 메모장 프로그램을 만들어 보겠습니다.

메모장의 기본기능인 파일 저장, 다른 이름으로 저장, 파일 오픈, 나가기 등 기본 기능만 존재하는 간단한 프로그램입니다.

 

(본 블로그의 내용은 유튜브 동영상(

파이썬 GUI Window 메모장(memo, notepad) 프로그램 만들기-1.소개편 (GUI/Window notepad program by Python-1.intro)

파이썬 GUI Window 메모장(memo, notepad) 프로그램 만들기2.기본메뉴편 (GUI/Window notepad program by Python-2.basicMenu)

파이썬 GUI Window 메모(memo, notepad) 프로그램 만들기 3.핵심메뉴편 (GUI/Window notepad program by Python-3.core Menu)

)에서 더욱 자세히 보실 수 있습니다.)

 

 

 

O 완성된 프로그램 실행 화면
 
 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

(1) 메뉴는 크게 2가지로 'File' 과 'Help' 메뉴가 존재합니다.

(2) 다시 'File'메뉴의 하위 메뉴로 'Open', 'Save', 'Save as', 'Quit' 가 존재하고, 'Help'메뉴의 하위 메뉴로 'About' 가 있습니다.

 

 

 

 

 

 

 

 

 

 


 

ㅁ 세부 내용
 
O 완성된 소스

 

from importlib.resources import path
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (QMainWindow, QApplication, QPlainTextEdit, QAction, qApp, QMessageBox, QFileDialog)

def about_dialog():
    text = "<center>" \
        "<h1>Simple Notepad</h1>"\
        "&#8291;" \
        "</center>" \
        "<p>version 1.0 <br>" \
        "Created by pagichacha<br />" \
        "MIT License</p>"
    QMessageBox.about(window, "About Simple Notepad", text)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.text_widget = QPlainTextEdit()
        self.setCentralWidget(self.text_widget)

        self.title = 'Simple NotePad'
        self.window_icon = 'pagichacha3.png'
        self.left = 300
        self.top = 100
        self.width = 700
        self.height = 800

        self.quit_action = QAction('&Quit', self)
        self.about_action = QAction('&About', self)
        self.open_action = QAction('&Open', self)
        self.save_action = QAction('&Save', self)
        self.save_as_action = QAction('&Save as', self)

        print("5")

        self.file_path = None

        self.create_actions()
        self.init_ui()

    def create_menubar(self):
        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)

        self.file_menu.addAction(self.open_action)
        self.file_menu.addAction(self.save_action)
        self.file_menu.addAction(self.save_as_action)
        self.file_menu.addAction(self.quit_action)
        self.help_menu.addAction(self.about_action)

    def create_actions(self):
        pass
        self.quit_action.setShortcut('Ctrl+Q')
        self.quit_action.triggered.connect(qApp.quit)

        self.about_action.setShortcut('Ctrl+A')
        self.about_action.triggered.connect(about_dialog) 

        self.open_action.setShortcut('Ctrl+O')
        self.open_action.triggered.connect(self.open_file)

        self.save_action.setShortcut('Ctrl+S')
        self.save_action.triggered.connect(self.save_file)

        self.save_as_action.triggered.connect(self.save_as_file)

    def open_file(self):
        global path
        path = QFileDialog.getOpenFileName(window, "Open")[0]
        print(path,"++++++++++++++++++++++++++ 9")
        self.title="test"
        if path:
            # self.text_widget.setPlainText(path+"\n"+open(path).read())
            self.text_widget.setPlainText(open(path).read())
            self.title = path
            self.file_path = path

    def save_file(self):
        # print(self.file_path,"+++++++++++++++++ 10")
        if self.file_path is None:
            print("1")
            self.save_as_file()
            print("2")
        else:
            with open(self.file_path, "w") as f:
                f.write(self.text_widget.toPlainText())
            self.text_widget.document().setModified(False)
            print("7")


    def save_as_file(self):
        pass
        path = QFileDialog.getSaveFileName(window, 'Save As')[0] 
        print(path)
        print("3")
        if path:
            self.file_path = path
            print("5")
            self.save_file()
            print("6")



    def init_ui(self):
        self.file_menu = self.menuBar().addMenu("&File")
        self.help_menu = self.menuBar().addMenu("&Help")
        self.create_menubar()

        self.setWindowTitle(self.title)
        self.setWindowIcon(QIcon(self.window_icon))
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setFixedSize(self.width, self.height)

        
        self.show()
        print("4")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    print("1")
    window = MainWindow()
    print("2")
    sys.exit(app.exec_())
    print("3")

 

O 소스 다운로드
 

 

notepad9.py
0.00MB

 

 

 

 

 

 

 

 - 위의 소스파일 다운로드 후 cmd,  파워쉘, vscode 등에서 아래와 같이 실행하시기 바랍니다.
 > python notepad9.py

 

 


 

O 주요 내용

 

 

 

1.윈도우 창 띄우는 코드로 모듈 임포트 및 클래스를 선언하고, app객체를 만들고, exec_()함수로 윈도우창을 지속적으로 띄웁니다.

 

윈도우 창을 띄우는 실행 순서 다음과 같습니다.

 

1) app = QApplication(sys.argv) <-- 메인 내에서 app객체 생성

2) window = MainWindow() <-- MainWindow()클래스의 window객체 생성

3) self.init_ui() <-- 초기화 함수 내의 init_ui()함수 호출

4) self.show() <-- ui 창을 띄움

 

 

 

 

 

2. 아래 빨간 박스의 코드로 윈도우 창을 중앙에 위치 시킵니다.

 

 

 

 

3. UI에 addMenu()를 이용하여 File와 Help 메뉴를 추가해 줍니다.

 

self.file_menu = self.menuBar().addMenu("&File")
self.help_menu = self.menuBar().addMenu("&Help")

 

 

 

 

 

4. 윈도우의 기본적인 제목, 아이콘, 좌우 크기, 상하 높이를 지정해 주고,

지정한 내용을 반영합니다.(setWindowTitle() 등의 함수로 설정 반영)

 

 

 

 

5. File 메뉴의 하위 메뉴로 Quit 메뉴 UI를 추가해 주고, 클릭했을 때 메모장이 종료될 수 있도록 기능을 정의해 줍니다.

 

1) self.quit_action = QAction('&Quit', self) <-- 변수 할당
2) self.file_menu.addAction(self.quit_action) <-- addAction()함수로 서브 메뉴(Quit) 추가
3) self.quit_action.setShortcut('Ctrl+Q') <-- 단축키 기능 정의
    self.quit_action.triggered.connect(qApp.quit) <-- Quit 메뉴 클릭 시 qApp.quit에 의해 창 종료(닫힘)

 

 

 

 

6. 위의 내용과 유사하게 Help 메뉴의 하위 메뉴로 About 메뉴 UI를 추가해 주고, 클릭했을 때 메모장의 정보를 보여줄 수 있도록 기능을 정의해 줍니다.

 

 

1) self.about_action = QAction('&About', self) <-- 변수할당
2) self.help_menu.addAction(self.about_action) <-- addAction()함수로 서브 메뉴(About) 추가
3) self.about_action.setShortcut('Ctrl+A') <-- 단축키 기능 정의
    self.about_action.triggered.connect(about_dialog) <-- About 메뉴 클릭 시 about_dialog() 함수 호출(창에 대한 기본 정보 안내창 띄워 줌)

 

 

 

 

7. Help > About 메뉴 클릭 시 아래와 같이 메모장의 기본 정보(제목, 본문내용, 버전 등)를 보여 줍니다.

 

 

 

8. File 메뉴의 하위 메뉴에 다시 Open 메뉴 UI를 추가해 주고, 클릭했을 때 기존 파일을 불러올 수 있도록 기능을 정의해 줍니다.

 

1) self.open_action = QAction('&Open', self) <-- 변수 할당
2) self.file_menu.addAction(self.open_action) <-- addAction()함수로 서브 메뉴(Open) 추가
3) self.open_action.setShortcut('Ctrl+O') <-- 단축키 기능 정의
    self.open_action.triggered.connect(self.open_file) <-- Open 메뉴 클릭 시 open_file() 함수 호출(기존 파일을 불러올 수 있는 창을 띄워줌)



 

 

9. File 메뉴의 하위 메뉴에 다시 'Save'와 'Save as' 메뉴 UI를 추가해 줍니다.

 

1) self.save_action = QAction('&Save', self) <-- 변수 할당

    self.save_as_action = QAction('&Save as', self) <-- 변수 할당
2) self.file_menu.addAction(self.save_action) <-- addAction()함수로 서브 메뉴(Save) 추가
    self.file_menu.addAction(self.save_as_action) <-- addAction()함수로 서브 메뉴(Save as) 추가

 

 

 

10. Save 및 Save as 메뉴 클릭시 기존 파일 저장 또는 새로운 파일로 저장 등을 할수 있도록 기능을 정의해 줍니다.

 

1) self.save_action.setShortcut('Ctrl+S') <-- 단축키 기능 정의
    self.save_action.triggered.connect(self.save_file) <-- Save 메뉴 클릭 시 save_file() 함수 호출(기존 파일 저장)

    self.save_as_action.triggered.connect(self.save_as_file) <-- Save as 메뉴 클릭 시 save_as_file() 함수 호출(새 파일 저장)

 

2) save_file()함수는 아래와 같은 기능을 합니다.

self.file_path is None: 이면 즉, 패스(경로)에 값이 없다는 것은 기존파일에 저장하는 것이 아니라 새로운 파일에 저장하는 것이므로 save_file_as() 함수를 호출 합니다.

만약 기존 파일을 연 것이라면 self.file_path 경로에 존재하는 파일(현재 작성중인 파일)을 쓰기 모드로 열어서 메모장의 본문 내용을 저장합니다.

 

 

 

 

11. 아래 그림은 'Save' 메뉴 클릭 시 새 파일인 경우 즉, 패스가 없으므로('self.file_path is None:') save_as_file() 함수를 호출한 것을 보여줍니다.

 

 

 

 

12. 아래 화면의 경우에는 바로 'Save as' 메뉴를 클릭한 것으로 직접 save_file_as()함수를 호출한 모습입니다.

 

 

 

13. 새 파일 저장 시(즉, file_path가 None일때) 아래와 같이 작동합니다.(아래 빨간 글씨 참조)

 

 

 

14. 아래 그림 처럼 'Save as' 메뉴를 클릭하여 저장 시 다른 이름('ddd')으로 잘 저장된 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 


 

 
O 소스 분석
 


1.app = QApplication(sys.argv) <-- 메인 내에서 app객체 생성
2.window = MainWindow() <-- MainWindow()클래스의 window객체 생성
3.self.init_ui() <-- 초기화 함수 내의 init_ui()함수 호출
4.self.show() <-- ui 창을 띄움
5.self.file_menu = self.menuBar().addMenu("&File") <-- UI에 addMenu()를 이용하여 File와 Help 메뉴 추가
  self.help_menu = self.menuBar().addMenu("&Help")

6.
self.title = 'Simple NotePad' <--윈도우의 기본적인 제목, 아이콘, 좌우 크기, 상하 높이를 지정해 주고,
self.setWindowTitle(self.title) <-- 지정한 내용을 반영(setWindowTitle() 등의 함수로 설정 반영)

7.self.quit_action = QAction('&Quit', self) <-- 변수 할당
8.self.file_menu.addAction(self.quit_action) <-- addAction()함수로 서브 메뉴(Quit) 추가
9.self.quit_action.setShortcut('Ctrl+Q') <-- 단축키 기능 정의
  self.quit_action.triggered.connect(qApp.quit) <-- Quit 메뉴 클릭 시 qApp.quit에 의해 창 종료(닫힘)

10.
def save_file(self):
    if self.file_path is None: <-- file_path가 None이면 즉, 기존파일을 오픈하게 아니라 새로운 파일을 저장하는 경우임
        self.save_as_file() <-- save_as_file() 함수 호출(새 파일 저장이므로)
    else:
        with open(self.file_path, "w") as f: <-- 기존파일이면 파일을 쓰기 모드로 열어서
            f.write(self.text_widget.toPlainText()) <-- 본문 내용을 저장한다.
        self.text_widget.document().setModified(False)

11.
def save_as_file(self): <-- 새로운 파일을 저장할때 사용
    path = QFileDialog.getSaveFileName(window, 'Save As')[0] <-- Save as모드로 창을 띄워 사용자가 파일이름을 입력할 수 있도록 해주고, 파일 선택시 전체 경로를 path에 저장
    if path: <-- 패스(경로)가 있으면
        self.file_path = path <-- file_path에 저장하고,
        self.save_file() <--다시 save_file()함수를 호출

 


 

ㅁ 정리
 
O 우리가 배운 내용
 - 오늘은 파이썬으로 간단한 GUI/윈도우 메모장 프로그램을 만드는 방법에 대하여 살펴 보았습니다.

 

 - 오늘 우리가 배운 내용을 간단히 정리해 보면 아래와 같습니다.
 
 > 1. 윈도우 창 띄우기 : 실행 순서 학습
 > 2. 메뉴 추가 > 하위 메뉴 추가 >추가된 하위 메뉴에 기능 적용하기(보통 함수가 해당 기능을 수행)

 > 3. 파일 Open, Save, Save as 등의 세부 작동 방법 학습(Save와 Save as 기능이 핵심)

 

 

 

오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

728x90
반응형
LIST