Python Tkinter 情侣恋爱日记桌面小程序(本地文件存储,无数据库)

一、项目简介

本项目基于 Python 内置TkinterGUI 库开发一款轻量情侣恋爱日记桌面工具,不需要 MySQL、SQLite 等数据库,全部数据存储在本地 txt 文本文件。 适合情侣记录恋爱日记、互相留言,自动计算恋爱在一起天数,内置随机甜蜜情话。所有数据保存在程序同目录下 3 个 txt 文件,移植简单,双击 py 文件直接运行。

技术栈

  • Python3
  • Tkinter(GUI 图形界面,python 自带无需额外 pip 安装)
  • datetime 时间处理
  • os 文件操作
  • random 随机情话

二、实现功能清单

  1. ✅ 自动计算恋爱在一起天数,可修改相恋起始日期(love_config.txt)
  2. ✅ 随机展示甜蜜情话
  3. ✅ 身份选择:男朋友 / 女朋友
  4. ✅ 恋爱日记撰写保存,滚动文本框多行输入
  5. ✅ 双向留言板短留言功能
  6. ✅ 弹窗查看全部历史日记 + 全部留言记录
  7. ✅ 本地 txt 持久化存储:日记、留言、相恋配置,关闭程序数据不丢失
  8. ✅ 消息弹窗提示(保存成功、空内容校验)
  9. ✅ 粉色浪漫主题 UI 界面

三、完整源代码

新建文件 couple_diary.py,复制下面全部代码:

复制代码
import tkinter as tk
from tkinter import scrolledtext, messagebox
from datetime import datetime
import os
import random

# ===================== 全局配置 & 本地文件存储(无数据库) =====================
# 本地保存文件
DIARY_FILE = "diary.txt"
MSG_FILE = "message.txt"
CONFIG_FILE = "love_config.txt"

# 初始化默认相恋日期
def init_config():
    if not os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, "w", encoding="utf-8") as f:
            f.write("2025-01-01")

# 计算恋爱天数
def get_love_days():
    init_config()
    with open(CONFIG_FILE, "r", encoding="utf-8") as f:
        start_day = f.read().strip()
    try:
        start = datetime.strptime(start_day, "%Y-%m-%d")
        now = datetime.now()
        days = (now - start).days
        return days, start_day
    except:
        return 0, "2025-01-01"

# 保存日记
def save_diary(user, content):
    t = datetime.now().strftime("%Y-%m-%d %H:%M")
    line = f"【{user}】{t}\n{content}\n------------------------------------\n"
    with open(DIARY_FILE, "a", encoding="utf-8") as f:
        f.write(line)

# 读取所有日记
def load_diary():
    if not os.path.exists(DIARY_FILE):
        return "暂无恋爱日记,快来记录甜蜜日常吧~"
    with open(DIARY_FILE, "r", encoding="utf-8") as f:
        return f.read()

# 保存留言
def save_msg(user, content):
    t = datetime.now().strftime("%Y-%m-%d %H:%M")
    line = f"[{user}] {t}:{content}\n"
    with open(MSG_FILE, "a", encoding="utf-8") as f:
        f.write(line)

# 读取留言
def load_msg():
    if not os.path.exists(MSG_FILE):
        return "暂无双向留言,快和TA说句话吧~"
    with open(MSG_FILE, "r", encoding="utf-8") as f:
        return f.read()

# 甜蜜情话库
love_words = [
    "双向奔赴,才是恋爱最好的样子",
    "岁岁年年,万喜万般宜",
    "山野千里,你是我藏在心里的浪漫",
    "世界再大,我的偏爱永远是你",
    "爱意不会消失,思念日日递增",
    "和你在一起,晚风都格外温柔"
]

# ===================== 窗口UI & 功能 =====================
root = tk.Tk()
root.title("💕 情侣恋爱日记空间 | 无数据库版")
root.geometry("680x600")
root.configure(bg="#fff0f5")

# 顶部标题
tk.Label(root, text="情侣恋爱日记空间", font=("微软雅黑", 20, "bold"),
         fg="#ff5e87", bg="#fff0f5").pack(pady=10)

# 恋爱天数展示
love_days, start_date = get_love_days()
day_text = tk.Label(root, text=f"💘 我们已经在一起 {love_days} 天 | 起始日:{start_date}",
                    font=("微软雅黑", 11), fg="#d6336c", bg="#fff0f5")
day_text.pack()

# 随机情话
tip = random.choice(love_words)
tk.Label(root, text=f"✨ 今日情话:{tip}", font=("微软雅黑", 9),
         fg="#888", bg="#fff0f5").pack(pady=5)

# 身份选择
frame_top = tk.Frame(root, bg="#fff0f5")
frame_top.pack(pady=8)
tk.Label(frame_top, text="选择身份:", bg="#fff0f5").grid(row=0, column=0)
user_var = tk.StringVar(value="男朋友")
tk.Radiobutton(frame_top, text="男朋友", variable=user_var,
               value="男朋友", bg="#fff0f5").grid(row=0, column=1, padx=10)
tk.Radiobutton(frame_top, text="女朋友", variable=user_var,
               value="女朋友", bg="#fff0f5").grid(row=0, column=2)

# 日记区域
tk.Label(root, text="📝 写下恋爱日记", font=("微软雅黑", 12, "bold"),
         bg="#fff0f5", fg="#ff6688").pack()
diary_input = scrolledtext.ScrolledText(root, width=75, height=6, font=("微软雅黑", 10))
diary_input.pack(pady=5)

def add_diary():
    content = diary_input.get("1.0", tk.END).strip()
    if not content:
        messagebox.showwarning("提示", "日记内容不能为空!")
        return
    user = user_var.get()
    save_diary(user, content)
    diary_input.delete("1.0", tk.END)
    messagebox.showinfo("成功", "💖 日记保存成功!")

tk.Button(root, text="保存日记", command=add_diary,
          bg="#ff87a2", fg="white", width=12).pack(pady=3)

# 留言区域
tk.Label(root, text="💌 双向留言板", font=("微软雅黑", 12, "bold"),
         bg="#fff0f5", fg="#ff6688").pack(pady=8)
msg_frame = tk.Frame(root, bg="#fff0f5")
msg_frame.pack()
msg_input = tk.Entry(msg_frame, width=60, font=("微软雅黑", 10))
msg_input.grid(row=0, column=0)

def add_message():
    content = msg_input.get().strip()
    if not content:
        messagebox.showwarning("提示", "留言不能为空!")
        return
    user = user_var.get()
    save_msg(user, content)
    msg_input.delete(0, tk.END)
    messagebox.showinfo("成功", "💞 留言发送成功!")

tk.Button(msg_frame, text="发送留言", command=add_message,
          bg="#ffb3c1", width=10).grid(row=0, column=1, padx=5)

# 查看全部内容
frame_show = tk.Frame(root, bg="#fff0f5")
frame_show.pack(pady=10)

def show_all():
    diary_data = load_diary()
    msg_data = load_msg()
    info = f"========== 💕 恋爱日记 ==========\n{diary_data}\n\n========== 💌 双向留言 ==========\n{msg_data}"
    win = tk.Toplevel(root)
    win.title("恋爱全部记录")
    win.geometry("600x500")
    st = scrolledtext.ScrolledText(win, font=("微软雅黑", 10))
    st.pack(fill=tk.BOTH, expand=True)
    st.insert(tk.END, info)
    st.config(state=tk.DISABLED)

tk.Button(root, text="查看全部日记&留言", command=show_all,
          bg="#ff7096", fg="white", width=20).pack()

root.mainloop()

四、运行环境 & 运行步骤

环境要求

  • Python 3.7 及以上版本

  • Tkinter 一般 python 自带,如果运行报错:

  • Windows:重装 Python,勾选 tcl/tk 组件

  • Ubuntu:sudo apt install python3-tk

运行步骤

1.将码保存为 couple_diary.py

2.打开终端,cd 到代码所在文件夹

3.执行命令:

复制代码
python couple_diary.py

五、程序操作说明

  1. 选择身份:男朋友 / 女朋友,保存日记、留言会带上身份标记。
  2. 写日记:在大文本框输入恋爱日常,点击保存日记写入本地 txt。
  3. 双向留言:单行输入框写简短留言,点击发送留言。
  4. 查看全部日记 & 留言:弹出新窗口浏览所有历史记录。
  5. 关闭程序数据不会丢失,全部保存在 txt 文本。

六、项目效果说明

1.主窗口粉色浪漫主题,顶部实时显示恋爱天数;每次打开随机一句情话。

2.空输入会弹窗警告,防止保存空白内容。

3."查看全部" 弹窗为只读滚动文本,防止误修改历史记录。

4.文本全部 utf‑8 编码,中文不乱码

七、可拓展优化方向(二次开发建议)

  1. 增加修改相恋日期 UI 窗口,不用手动改 txt 文件
  2. 增加删除日记、删除留言功能
  3. 增加导出为 Word/HTML 备忘录功能
  4. 增加照片插入功能
  5. 打包 exe,不用装 Python 环境双击运行(pyinstaller
  6. 增加密码登录访问情侣空间
  7. 情话库扩充,增加随机壁纸背景

八、小结

本案例适合 Python Tkinter 练手项目,无数据库设计,使用 txt 文件做持久化存储,逻辑简单易懂。适合课程作业、小工具开发学习。Tkinter 实现完整 GUI 交互,文件读写、弹窗组件、子窗口、滚动文本框等常用控件全部覆盖。

相关推荐
PFFstronger1 小时前
从 0 到 1 搭建接口自动化测试框架:分层架构 + 数据驱动 + 接口依赖编排
python·架构·自动化
Andya_net1 小时前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python
weixin_440730501 小时前
playwright浏览器自动化实战笔记3-登陆以及退出登陆流程-多用户操作
笔记·python·自动化
疯狂打码的少年1 小时前
【计算机网络】OSI/RM七层模型(层次结构、各层功能速览)
开发语言·笔记·计算机网络·php
小灰灰搞电子1 小时前
Rust+Slint 实现ModbusRTU从机调试助手源码分享
开发语言·rust·modbusrtu
程序喵大人1 小时前
【C++入门】值类别与表达式 - 03 引用绑定:为什么有些参数能接住临时对象
开发语言·c++·引用绑定
卷无止境2 小时前
测试全绿,功能能跑,代码却烂到没法上线:AI编程助手留下的十个坑
后端·python
子非鱼a2 小时前
【WEB】[RoarCTF 2019]Easy Java
java·开发语言
卷无止境2 小时前
终端里的AI战争,命令行编程代理全景扫描
python·agent