[Python] 纯文本查看 复制代码
import sys
import sqlite3
from datetime import datetime
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette, QColor, QFont
class TaskManager(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
self.init_db()
self.load_tasks()
def init_ui(self):
self.setWindowTitle('学习规划事项--东台市实验中学728 周星宇')
self.setGeometry(100, 100, 1000, 600)
self.setStyleSheet('''
QMainWindow {
background-color: #f5f5f7;
}
QListWidget {
background-color: white;
border-radius: 10px;
padding: 10px;
font-size: 14px;
}
QPushButton {
background-color: #0071e3;
color: white;
border-radius: 6px;
padding: 8px 15px;
font-size: 14px;
}
QPushButton:hover {
background-color: #0077ed;
}
QLineEdit, QTextEdit {
background-color: white;
border: 1px solid #d1d1d1;
border-radius: 6px;
padding: 8px;
font-size: 14px;
}
QLabel {
font-size: 14px;
color: #1d1d1f;
}
''')
# 创建主窗口部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
layout = QHBoxLayout()
# 左侧待完成区
left_widget = QWidget()
left_layout = QVBoxLayout()
left_label = QLabel('待完成事项')
left_label.setFont(QFont('SF Pro Display', 16, QFont.Bold))
self.todo_list = QListWidget()
# 添加新任务区域
add_group = QGroupBox('添加新事项')
add_layout = QVBoxLayout()
self.name_input = QLineEdit()
self.name_input.setPlaceholderText('事项名称')
self.desc_input = QTextEdit()
self.desc_input.setPlaceholderText('事项描述')
self.desc_input.setMaximumHeight(100)
btn_layout = QHBoxLayout()
self.add_btn = QPushButton('添加')
self.add_btn.clicked.connect(self.add_task)
self.edit_btn = QPushButton('编辑')
self.edit_btn.clicked.connect(self.edit_task)
self.delete_btn = QPushButton('删除')
self.delete_btn.clicked.connect(self.delete_task)
btn_layout.addWidget(self.add_btn)
btn_layout.addWidget(self.edit_btn)
btn_layout.addWidget(self.delete_btn)
add_layout.addWidget(self.name_input)
add_layout.addWidget(self.desc_input)
add_layout.addLayout(btn_layout)
add_group.setLayout(add_layout)
left_layout.addWidget(left_label)
left_layout.addWidget(self.todo_list)
left_layout.addWidget(add_group)
left_widget.setLayout(left_layout)
# 右侧完成区
right_widget = QWidget()
right_layout = QVBoxLayout()
right_label = QLabel('已完成事项')
right_label.setFont(QFont('SF Pro Display', 16, QFont.Bold))
self.done_list = QListWidget()
right_layout.addWidget(right_label)
right_layout.addWidget(self.done_list)
right_widget.setLayout(right_layout)
# 添加到主布局
layout.addWidget(left_widget)
layout.addWidget(right_widget)
central_widget.setLayout(layout)
# 添加完成按钮
self.todo_list.itemDoubleClicked.connect(self.complete_task)
def init_db(self):
# 删除旧的数据库文件(如果存在)
import os
if os.path.exists('tasks.db'):
os.remove('tasks.db')
self.conn = sqlite3.connect('tasks.db')
self.cursor = self.conn.cursor()
# 创建新的表结构
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT,
done INTEGER DEFAULT 0,
completed_at TEXT
)
''')
self.conn.commit()
def load_tasks(self):
self.todo_list.clear()
self.done_list.clear()
# 加载待完成事项
self.cursor.execute('SELECT * FROM tasks WHERE done = 0')
for task in self.cursor.fetchall():
item = QListWidgetItem(f"{task[1]}\n{task[2]}")
item.setData(Qt.UserRole, task[0])
self.todo_list.addItem(item)
# 加载已完成事项
self.cursor.execute('SELECT * FROM tasks WHERE done = 1')
for task in self.cursor.fetchall():
item = QListWidgetItem(f"{task[1]}\n{task[2]}\n完成时间: {task[4]}")
item.setData(Qt.UserRole, task[0])
self.done_list.addItem(item)
def add_task(self):
name = self.name_input.text().strip()
desc = self.desc_input.toPlainText().strip()
if not name:
QMessageBox.warning(self, '警告', '请输入事项名称!')
return
self.cursor.execute(
'INSERT INTO tasks (name, description) VALUES (?, ?)',
(name, desc)
)
self.conn.commit()
self.name_input.clear()
self.desc_input.clear()
self.load_tasks()
def edit_task(self):
current = self.todo_list.currentItem()
if not current:
QMessageBox.warning(self, '警告', '请选择要编辑的事项!')
return
task_id = current.data(Qt.UserRole)
name = self.name_input.text().strip()
desc = self.desc_input.toPlainText().strip()
if not name:
QMessageBox.warning(self, '警告', '请输入事项名称!')
return
self.cursor.execute(
'UPDATE tasks SET name = ?, description = ? WHERE id = ?',
(name, desc, task_id)
)
self.conn.commit()
self.name_input.clear()
self.desc_input.clear()
self.load_tasks()
def delete_task(self):
current = self.todo_list.currentItem()
if not current:
QMessageBox.warning(self, '警告', '请选择要删除的事项!')
return
task_id = current.data(Qt.UserRole)
reply = QMessageBox.question(self, '确认', '确定要删除该事项吗?',
QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
self.cursor.execute('DELETE FROM tasks WHERE id = ?', (task_id,))
self.conn.commit()
self.load_tasks()
def complete_task(self, item):
task_id = item.data(Qt.UserRole)
completed_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
self.cursor.execute(
'UPDATE tasks SET done = 1, completed_at = ? WHERE id = ?',
(completed_at, task_id)
)
self.conn.commit()
self.load_tasks()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TaskManager()
window.show()
sys.exit(app.exec_())