- 이번 프로그램은 파이썬으로 간단한 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)
)에서 더욱 자세히 보실 수 있습니다.)
(1) 메뉴는 크게 2가지로 'File' 과 'Help' 메뉴가 존재합니다.
(2) 다시 'File'메뉴의 하위 메뉴로 'Open', 'Save', 'Save as', 'Quit' 가 존재하고, 'Help'메뉴의 하위 메뉴로 'About' 가 있습니다.
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>"\
"⁣" \
"</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")
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')으로 잘 저장된 것을 볼 수 있습니다.
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()함수를 호출
> 3. 파일 Open, Save, Save as 등의 세부 작동 방법 학습(Save와 Save as 기능이 핵심)
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.
감사합니다.