본문 바로가기

Study Information Technology

PyQt5로 프로젝트 작업 및 마감일 관리와 시각화 데스크탑 애플리케이션 개발하기

728x90
반응형

PyQt5로 프로젝트 작업 및 마감일 관리와 시각화 데스크탑 애플리케이션 개발하기

Overview

PyQt5는 파이썬에서 Qt 프레임워크를 사용할 수 있게 해주는 라이브러리로, 강력한 GUI 애플리케이션을 만드는 데 유용합니다. 이 문서에서는 PyQt5를 사용하여 프로젝트 작업과 마감일을 관리하고 시각화하는 데스크탑 애플리케이션을 개발하는 방법을 자세히 설명하겠습니다. 이 애플리케이션은 작업을 추가하고, 마감일을 설정하며, 작업 목록을 시각적으로 표시할 수 있어야 합니다.

1. PyQt5 설치 및 환경 설정

PyQt5 설치

먼저, PyQt5를 설치해야 합니다. PyQt5는 PyPI에 있으므로, pip 명령어로 간편하게 설치할 수 있습니다.

pip install pyqt5

설치가 완료되면, 기본적인 PyQt5 애플리케이션을 실행할 준비가 된 것입니다.

2. 기본 애플리케이션 구조

애플리케이션 초기화

PyQt5 애플리케이션을 만들기 위해서는 QApplication 클래스와 QWidget 클래스를 활용합니다. 다음은 기본 애플리케이션을 설정하는 코드 예시입니다.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

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

self.setWindowTitle('Task Manager')
self.setGeometry(100, 100, 800, 600)

# 메인 레이아웃 및 버튼 추가
layout = QVBoxLayout()
button = QPushButton('Click Me')
layout.addWidget(button)

container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)

if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())

코드 설명

  • QApplication은 PyQt5 애플리케이션의 인스턴스를 생성합니다.
  • QMainWindow는 기본 윈도우 클래스로, 메뉴, 툴바, 상태바 등 다양한 기능을 제공하는 윈도우입니다.
  • QVBoxLayout은 수직 방향으로 위젯을 배치하는 레이아웃입니다.
  • QPushButton은 클릭 가능한 버튼입니다.

3. 프로젝트 작업 및 마감일 관리

작업 목록 관리

작업 목록을 관리하려면 데이터를 저장하고 조작할 수 있는 구조가 필요합니다. 이를 위해 Python의 list 또는 dict를 사용할 수 있습니다. 예를 들어, 작업을 dict로 저장할 수 있습니다.

self.tasks = {
'Task 1': {'deadline': '2024-09-01', 'status': 'Incomplete'},
'Task 2': {'deadline': '2024-10-15', 'status': 'Incomplete'}
}

작업 추가 및 제거

작업을 추가하거나 제거하려면, 버튼 클릭 이벤트를 처리하는 핸들러를 작성해야 합니다.

from PyQt5.QtWidgets import QLineEdit, QDateEdit

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

self.tasks = {}

self.setWindowTitle('Task Manager')
self.setGeometry(100, 100, 800, 600)

layout = QVBoxLayout()

# Task input fields
self.task_input = QLineEdit()
self.date_input = QDateEdit()
self.date_input.setCalendarPopup(True)

add_button = QPushButton('Add Task')
add_button.clicked.connect(self.add_task)

layout.addWidget(self.task_input)
layout.addWidget(self.date_input)
layout.addWidget(add_button)

self.task_list = QTextEdit()
layout.addWidget(self.task_list)

container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)

def add_task(self):
task_name = self.task_input.text()
deadline = self.date_input.date().toString('yyyy-MM-dd')

if task_name and deadline:
self.tasks[task_name] = {'deadline': deadline, 'status': 'Incomplete'}
self.update_task_list()
self.task_input.clear()
else:
print("Please enter task name and deadline.")

def update_task_list(self):
self.task_list.clear()
for task, details in self.tasks.items():
self.task_list.append(f"Task: {task}, Deadline: {details['deadline']}, Status: {details['status']}")

코드 설명

  • QLineEdit는 사용자로부터 텍스트를 입력받는 위젯입니다.
  • QDateEdit는 날짜를 선택할 수 있는 위젯입니다.
  • QTextEdit는 다중 줄 텍스트를 표시할 수 있는 위젯입니다.
  • add_task 메서드는 작업을 추가하고 리스트를 업데이트합니다.
  • update_task_list 메서드는 작업 목록을 QTextEdit에 업데이트합니다.

4. 작업 시각화

작업을 시각화하려면 그래픽적인 표현이 필요합니다. PyQt5의 QGraphicsViewQGraphicsScene을 사용하여 작업을 시각적으로 표시할 수 있습니다.

Gantt 차트 예제

Gantt 차트는 프로젝트 관리에서 작업과 일정을 시각화하는 데 유용합니다. 간단한 Gantt 차트를 PyQt5로 구현할 수 있습니다.

from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsRectItem
from PyQt5.QtCore import QRectF

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

self.tasks = {}

self.setWindowTitle('Task Manager')
self.setGeometry(100, 100, 800, 600)

layout = QVBoxLayout()

self.task_input = QLineEdit()
self.date_input = QDateEdit()
self.date_input.setCalendarPopup(True)

add_button = QPushButton('Add Task')
add_button.clicked.connect(self.add_task)

layout.addWidget(self.task_input)
layout.addWidget(self.date_input)
layout.addWidget(add_button)

# Gantt chart view
self.gantt_view = QGraphicsView()
self.gantt_scene = QGraphicsScene()
self.gantt_view.setScene(self.gantt_scene)
layout.addWidget(self.gantt_view)

container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)

def add_task(self):
task_name = self.task_input.text()
deadline = self.date_input.date().toString('yyyy-MM-dd')

if task_name and deadline:
self.tasks[task_name] = {'deadline': deadline, 'status': 'Incomplete'}
self.update_gantt_chart()
self.task_input.clear()
else:
print("Please enter task name and deadline.")

def update_gantt_chart(self):
self.gantt_scene.clear()
y = 0
for task, details in self.tasks.items():
rect = QGraphicsRectItem(0, y, 200, 30)
rect.setBrush(Qt.blue)
self.gantt_scene.addItem(rect)
y += 40

코드 설명

  • QGraphicsViewQGraphicsScene은 2D 그래픽을 표시할 수 있는 위젯입니다.
  • QGraphicsRectItem은 사각형을 그리는 그래픽 항목입니다.
  • update_gantt_chart 메서드는 Gantt 차트를 업데이트합니다.

5. 데이터 저장 및 로드

작업 데이터를 파일에 저장하고 불러오는 기능도 추가할 수 있습니다. JSON 파일을 사용하여 간단하게 저장할 수 있습니다.

import json

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

self.tasks = {}

self.setWindowTitle('Task Manager')
self.setGeometry(100, 100, 800, 600)

layout = QVBoxLayout()

self.task_input = QLineEdit()
self.date_input = QDateEdit()
self.date_input.setCalendarPopup(True)

add_button = QPushButton('Add Task')
add_button.clicked.connect(self.add_task)

layout.addWidget(self.task_input)
layout.addWidget(self.date_input)
layout.addWidget(add_button)

save_button = QPushButton('Save Tasks')
save_button.clicked.connect(self.save_tasks)

load_button = QPushButton('Load Tasks')
load_button.clicked.connect(self.load_tasks)

layout.addWidget(save_button)
layout.addWidget(load_button)

container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)

def save_tasks(self):
with open('tasks.json', 'w') as file:
json.dump(self.tasks, file)

def load_tasks(self):
try:
with open('tasks.json', 'r') as file:
self.tasks = json.load(file)
self.update_task_list()
except FileNotFoundError:
print("No saved tasks found.")

코드 설명

  • save_tasks 메서드는 현재 작업 목록을 JSON 파일로 저장합니다.
  • `
728x90
반응형