학습 로그/Python3

D+41[Python] Resource & 메모장 예제 실습

goodjob^^ 2026. 6. 5. 19:33

ㅇ 일 자 : 2026년 6월 5일(금)

1. Resource 이해하기 

1.1. GUI 프로그램 리소스?  Graphical User Interface
       GUI 프로그램에서 리소스(Resource)란 프로그램 코드(로직) 자체를 제외한 시각적 요소와 외부 데이터를 통칭, 주로 이미지, 아이콘, 폰트, 오디오, 텍스트(문구) 등이 포함되며, 프로그램 실행 시 불러와 화면에 렌더링되거나 동작을 돕는 데이터 자원이다.
 

2. Python 환경에서 리소스 예제 실습

 
3. PyQT 리소스 디자인 "메모장" 예제 실습

    (1) .ui 파일에서 디자인 요소를 입력 : 텍스트, 개체이름, 도구설명, 아이콘테마, 확인, 단축키 누르기, 메뉴역할 등

 
    (2) 그림아이콘도 액션 애디터에서 선택하여 설정 가능

 
    (3) 액션 애디터에서 텍스트만 입력하면 name 자동입력, 단축키(Shortcut)는 입력칸에 단축키를 키보드로 입력시 자동입력됨

 
    (4) 액션 요소들은  Property Editor (노란 항목들)에서 세부 사항을 클릭하여 각각 수정할 수 있다. 

 
4. Python 환경에서 "메모장" 예제 실습 (이미지 미포함)

메모장 만들기 예제 실습 화면 (이미지 미포함)

 

메모장 만들기 예제 실습 화면 (이미지를  코드에 포함하여 작성한 경우)

 
※ 소스 코드
① dmainwindow.py

# "" 메모장 이미지 포함 예제 실습 패키지 임"""

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from ui_form import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = MainWindow()
    widget.show()
    sys.exit(app.exec())

 
② ui_form.py         ※ 프로그램에서 기호 및 이모티콘 이미지가 어떤 로직에 의해 구현되는지 이해하고, 인공지능 응용 참고 

# "" 메모장 이미지 포함 예제 실습 패키지 임"""

## Form generated from reading UI file 'form.ui'
## Created by: Qt User Interface Compiler version 6.10.1

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
    QCursor, QFont, QFontDatabase, QGradient,
    QIcon, QImage, QKeySequence, QLinearGradient,
    QPainter, QPalette, QPixmap, QRadialGradient,
    QTransform)
from PySide6.QtWidgets import (QApplication, QMainWindow, QMenu, QMenuBar,
    QSizePolicy, QStatusBar, QWidget)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(700, 500)
        self.actionNew = QAction(MainWindow)
        self.actionNew.setObjectName(u"actionNew")
        self.actionOpen = QAction(MainWindow)
        self.actionOpen.setObjectName(u"actionOpen")
        self.actionSave = QAction(MainWindow)
        self.actionSave.setObjectName(u"actionSave")
        self.actionPrint = QAction(MainWindow)
        self.actionPrint.setObjectName(u"actionPrint")
        self.actionPrint_Preview = QAction(MainWindow)
        self.actionPrint_Preview.setObjectName(u"actionPrint_Preview")
        self.actionExport_PDF = QAction(MainWindow)
        self.actionExport_PDF.setObjectName(u"actionExport_PDF")
        self.actionClose = QAction(MainWindow)
        self.actionClose.setObjectName(u"actionClose")
        self.actionUndo = QAction(MainWindow)
        self.actionUndo.setObjectName(u"actionUndo")
        self.actionRedo = QAction(MainWindow)
        self.actionRedo.setObjectName(u"actionRedo")
        self.actionCut = QAction(MainWindow)
        self.actionCut.setObjectName(u"actionCut")
        self.actionCopy = QAction(MainWindow)
        self.actionCopy.setObjectName(u"actionCopy")
        self.actionPaste = QAction(MainWindow)
        self.actionPaste.setObjectName(u"actionPaste")
        self.actionBold = QAction(MainWindow)
        self.actionBold.setObjectName(u"actionBold")
        self.actionItalic = QAction(MainWindow)
        self.actionItalic.setObjectName(u"actionItalic")
        self.actionUnderline = QAction(MainWindow)
        self.actionUnderline.setObjectName(u"actionUnderline")
        self.actionLeft = QAction(MainWindow)
        self.actionLeft.setObjectName(u"actionLeft")
        self.actionRight = QAction(MainWindow)
        self.actionRight.setObjectName(u"actionRight")
        self.actionCenter = QAction(MainWindow)
        self.actionCenter.setObjectName(u"actionCenter")
        self.actionJustify = QAction(MainWindow)
        self.actionJustify.setObjectName(u"actionJustify")
        self.actionFont = QAction(MainWindow)
        self.actionFont.setObjectName(u"actionFont")
        self.actionColor = QAction(MainWindow)
        self.actionColor.setObjectName(u"actionColor")
        self.actionAbout_App = QAction(MainWindow)
        self.actionAbout_App.setObjectName(u"actionAbout_App")
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 700, 22))
        self.menuFile = QMenu(self.menubar)
        self.menuFile.setObjectName(u"menuFile")
        self.menuEdit = QMenu(self.menubar)
        self.menuEdit.setObjectName(u"menuEdit")
        self.menuFormat = QMenu(self.menubar)
        self.menuFormat.setObjectName(u"menuFormat")
        self.menuAbout = QMenu(self.menubar)
        self.menuAbout.setObjectName(u"menuAbout")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())
        self.menubar.addAction(self.menuFormat.menuAction())
        self.menubar.addAction(self.menuAbout.menuAction())
        self.menuFile.addAction(self.actionNew)
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addAction(self.actionSave)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionPrint)
        self.menuFile.addAction(self.actionPrint_Preview)
        self.menuFile.addAction(self.actionExport_PDF)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionClose)
        self.menuEdit.addAction(self.actionUndo)
        self.menuEdit.addAction(self.actionRedo)
        self.menuEdit.addSeparator()
        self.menuEdit.addAction(self.actionCut)
        self.menuEdit.addAction(self.actionCopy)
        self.menuEdit.addAction(self.actionPaste)
        self.menuFormat.addAction(self.actionBold)
        self.menuFormat.addAction(self.actionItalic)
        self.menuFormat.addAction(self.actionUnderline)
        self.menuFormat.addSeparator()
        self.menuFormat.addAction(self.actionLeft)
        self.menuFormat.addAction(self.actionRight)
        self.menuFormat.addAction(self.actionCenter)
        self.menuFormat.addAction(self.actionJustify)
        self.menuFormat.addSeparator()
        self.menuFormat.addAction(self.actionFont)
        self.menuFormat.addAction(self.actionColor)
        self.menuAbout.addAction(self.actionAbout_App)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"🖥️ MainWindow", None))
        self.actionNew.setText(QCoreApplication.translate("MainWindow", u"📄 New", None))
#if QT_CONFIG(shortcut)
        self.actionNew.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+N", None))
#endif // QT_CONFIG(shortcut)
        self.actionOpen.setText(QCoreApplication.translate("MainWindow", u"📂 Open", None))
#if QT_CONFIG(shortcut)
        self.actionOpen.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+O", None))
#endif // QT_CONFIG(shortcut)
        self.actionSave.setText(QCoreApplication.translate("MainWindow", u"💾 Save", None))
#if QT_CONFIG(shortcut)
        self.actionSave.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+S", None))
#endif // QT_CONFIG(shortcut)
        self.actionPrint.setText(QCoreApplication.translate("MainWindow", u"🖨️ Print", None))
#if QT_CONFIG(shortcut)
        self.actionPrint.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+P", None))
#endif // QT_CONFIG(shortcut)
        self.actionPrint_Preview.setText(QCoreApplication.translate("MainWindow", u"🔍 Print Preview", None))
#if QT_CONFIG(shortcut)
        self.actionPrint_Preview.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+Shift+P", None))
#endif // QT_CONFIG(shortcut)
        self.actionExport_PDF.setText(QCoreApplication.translate("MainWindow", u"📥 Export PDF", None))
#if QT_CONFIG(shortcut)
        self.actionExport_PDF.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+E", None))
#endif // QT_CONFIG(shortcut)
        self.actionClose.setText(QCoreApplication.translate("MainWindow", u"❌ Close", None))
#if QT_CONFIG(shortcut)
        self.actionClose.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+Q, Return", None))
#endif // QT_CONFIG(shortcut)
        self.actionUndo.setText(QCoreApplication.translate("MainWindow", u"↩️ Undo", None))
#if QT_CONFIG(shortcut)
        self.actionUndo.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+Z", None))
#endif // QT_CONFIG(shortcut)
        self.actionRedo.setText(QCoreApplication.translate("MainWindow", u"↪️ Redo", None))
#if QT_CONFIG(shortcut)
        self.actionRedo.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+Y", None))
#endif // QT_CONFIG(shortcut)
        self.actionCut.setText(QCoreApplication.translate("MainWindow", u"✂️ Cut", None))
#if QT_CONFIG(shortcut)
        self.actionCut.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+X", None))
#endif // QT_CONFIG(shortcut)
        self.actionCopy.setText(QCoreApplication.translate("MainWindow", u"📄 Copy", None))
#if QT_CONFIG(shortcut)
        self.actionCopy.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+C", None))
#endif // QT_CONFIG(shortcut)
        self.actionPaste.setText(QCoreApplication.translate("MainWindow", u"📋 Paste", None))
#if QT_CONFIG(shortcut)
        self.actionPaste.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+V", None))
#endif // QT_CONFIG(shortcut)
        self.actionBold.setText(QCoreApplication.translate("MainWindow", u"<b>B</b> Bold", None))
#if QT_CONFIG(shortcut)
        self.actionBold.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+B", None))
#endif // QT_CONFIG(shortcut)
        self.actionItalic.setText(QCoreApplication.translate("MainWindow", u"<i>I</i> Italic", None))
#if QT_CONFIG(shortcut)
        self.actionItalic.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+I", None))
#endif // QT_CONFIG(shortcut)
        self.actionUnderline.setText(QCoreApplication.translate("MainWindow", u"<u>U</u> Underline", None))
#if QT_CONFIG(shortcut)
        self.actionUnderline.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+E", None))
#endif // QT_CONFIG(shortcut)
        self.actionLeft.setText(QCoreApplication.translate("MainWindow", u"⬅️ Left", None))
#if QT_CONFIG(shortcut)
        self.actionLeft.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+L", None))
#endif // QT_CONFIG(shortcut)
        self.actionRight.setText(QCoreApplication.translate("MainWindow", u"➡️ Right", None))
#if QT_CONFIG(shortcut)
        self.actionRight.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+R", None))
#endif // QT_CONFIG(shortcut)
        self.actionCenter.setText(QCoreApplication.translate("MainWindow", u"↕️ Center", None))
#if QT_CONFIG(shortcut)
        self.actionCenter.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+K", None))
#endif // QT_CONFIG(shortcut)
        self.actionJustify.setText(QCoreApplication.translate("MainWindow", u"↔️ Justify", None))
#if QT_CONFIG(shortcut)
        self.actionJustify.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+J", None))
#endif // QT_CONFIG(shortcut)
        self.actionFont.setText(QCoreApplication.translate("MainWindow", u"🔤 Font", None))
        self.actionColor.setText(QCoreApplication.translate("MainWindow", u"🎨 Color", None))
        self.actionAbout_App.setText(QCoreApplication.translate("MainWindow", u"ℹ️ About App", None))
        self.menuFile.setTitle(QCoreApplication.translate("MainWindow", u"📁 File", None))
        self.menuEdit.setTitle(QCoreApplication.translate("MainWindow", u"📝 Edit", None))
        self.menuFormat.setTitle(QCoreApplication.translate("MainWindow", u"🛠️ Format", None))
        self.menuAbout.setTitle(QCoreApplication.translate("MainWindow", u"❓ About", None))

 
5. 가상환경 채팅 환경설정 (Ollama) 및 준비
    가. 환경설정 (터미널에서 설정하기 실습) 
         ollama -v (버젼 확인), sudo systemctl status ollama(실행상태 확인), ollama pull llama3.2:3b (실습모델 다운로드),
         ollama run llama3.2:3b (터미널 모델 응답 확인), curl 활용 api/chat 호출 결과 확인, test_ollama.py (호출 결과 확인)
    나. 파이썬 환경에서 가상환경 폴더 설정
    다. 환경설정 후 모델응답 확인 화면               

실습모델 환경설정 및 인공지능 기업질문 채팅 화면