生活小窍门查询小程序
下面是一个基于Python的生活小窍门查询小程序,专为中老年人设计,具有简洁易用的界面和实用的功能。
import json
import os
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
from datetime import datetime
class LifeHacksApp:
def __init__(self, root):
self.root = root
self.root.title("生活小窍门查询系统")
self.root.geometry("800x600")
self.root.configure(bg="#f0f8ff")
# 创建数据目录
if not os.path.exists("data"):
os.makedirs("data")
# 加载数据
self.tricks_data = self.load_data("data/tricks.json")
self.favorites = self.load_data("data/favorites.json") or []
self.history = self.load_data("data/history.json") or []
# 创建UI
self.create_widgets()
# 显示欢迎信息
self.show_welcome()
def load_data(self, filename):
try:
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as f:
return json.load(f)
except:
pass
return None
def save_data(self, data, filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def create_widgets(self):
# 顶部标题
header = tk.Frame(self.root, bg="#4682b4", height=80)
header.pack(fill="x", padx=10, pady=10)
title_label = tk.Label(header, text="生活小窍门查询系统", font=("微软雅黑", 24, "bold"),
fg="white", bg="#4682b4")
title_label.pack(pady=20)
# 主内容区域
main_frame = tk.Frame(self.root, bg="#f0f8ff")
main_frame.pack(fill="both", expand=True, padx=20, pady=10)
# 左侧分类导航
left_frame = tk.Frame(main_frame, bg="#e6f2ff", bd=2, relief="groove")
left_frame.pack(side="left", fill="y", padx=(0, 10), pady=10)
categories = ["全部技巧", "清洁妙招", "收纳整理", "养生保健", "厨房窍门", "衣物护理", "健康饮食"]
for cat in categories:
btn = tk.Button(left_frame, text=cat, width=15, command=lambda c=cat: self.filter_by_category(c),
bg="#87cefa", fg="#333", font=("微软雅黑", 11), relief="flat")
btn.pack(pady=5, padx=10, ipadx=5, ipady=5)
# 右侧功能区
right_frame = tk.Frame(main_frame, bg="#ffffff", bd=2, relief="groove")
right_frame.pack(side="right", fill="both", expand=True, pady=10)
# 搜索框
search_frame = tk.Frame(right_frame, bg="#ffffff")
search_frame.pack(fill="x", padx=10, pady=10)
self.search_var = tk.StringVar()
search_entry = tk.Entry(search_frame, textvariable=self.search_var, font=("微软雅黑", 12),
width=40, relief="solid", borderwidth=1)
search_entry.pack(side="left", padx=(0, 10))
search_entry.bind("<Return>", lambda event: self.search_tricks())
search_btn = tk.Button(search_frame, text="搜索", command=self.search_tricks,
bg="#5f9ea0", fg="white", font=("微软雅黑", 11))
search_btn.pack(side="left")
# 结果显示区域
result_frame = tk.Frame(right_frame, bg="#ffffff")
result_frame.pack(fill="both", expand=True, padx=10, pady=(0, 10))
self.result_tree = ttk.Treeview(result_frame, columns=("category", "date"), show="headings")
self.result_tree.heading("#0", text="技巧名称", anchor="w")
self.result_tree.heading("category", text="类别")
self.result_tree.heading("date", text="添加时间")
self.result_tree.column("#0", width=300)
self.result_tree.column("category", width=100)
self.result_tree.column("date", width=150)
vsb = ttk.Scrollbar(result_frame, orient="vertical", command=self.result_tree.yview)
hsb = ttk.Scrollbar(result_frame, orient="horizontal", command=self.result_tree.xview)
self.result_tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
self.result_tree.grid(row=0, column=0, sticky="nsew")
vsb.grid(row=0, column=1, sticky="ns")
hsb.grid(row=1, column=0, sticky="ew")
result_frame.grid_columnconfigure(0, weight=1)
result_frame.grid_rowconfigure(0, weight=1)
# 绑定选择事件
self.result_tree.bind("<<TreeviewSelect>>", self.show_trick_detail)
# 底部按钮区
button_frame = tk.Frame(self.root, bg="#f0f8ff")
button_frame.pack(fill="x", padx=20, pady=10)
buttons = [
("收藏技巧", self.add_to_favorites, "#ffa07a"),
("查看收藏", self.view_favorites, "#20b2aa"),
("使用记录", self.view_history, "#9370db"),
("添加新技巧", self.add_new_trick, "#3cb371"),
("退出", self.exit_app, "#cd5c5c")
]
for text, command, color in buttons:
btn = tk.Button(button_frame, text=text, command=command,
bg=color, fg="white", font=("微软雅黑", 11), width=12)
btn.pack(side="left", padx=10, pady=5)
def show_welcome(self):
welcome_msg = (
"欢迎使用生活小窍门查询系统!\n\n"
"本系统收录了各类实用生活技巧,包括清洁、收纳、养生等。\n"
"您可以通过左侧分类浏览,或使用搜索功能查找特定技巧。\n\n"
"提示:选中技巧后可查看详情,并可以收藏常用技巧。"
)
messagebox.showinfo("欢迎使用", welcome_msg)
def filter_by_category(self, category):
self.result_tree.delete(*self.result_tree.get_children())
if category == "全部技巧":
tricks = self.tricks_data
else:
tricks = [t for t in self.tricks_data if t["category"] == category]
for trick in tricks:
self.result_tree.insert("", "end", text=trick["title"],
values=(trick["category"], trick["date"]),
tags=(str(trick["id"]),))
def search_tricks(self):
keyword = self.search_var.get().strip().lower()
if not keyword:
messagebox.showinfo("提示", "请输入搜索关键词")
return
self.result_tree.delete(*self.result_tree.get_children())
results = []
for trick in self.tricks_data:
if (keyword in trick["title"].lower() or
keyword in trick["content"].lower() or
any(keyword in kw.lower() for kw in trick["keywords"])):
results.append(trick)
if not results:
messagebox.showinfo("搜索结果", f"没有找到包含 '{keyword}' 的技巧")
return
for trick in results:
self.result_tree.insert("", "end", text=trick["title"],
values=(trick["category"], trick["date"]),
tags=(str(trick["id"]),))
# 添加到历史记录
self.add_to_history(f"搜索: {keyword}", len(results))
def show_trick_detail(self, event):
selected = self.result_tree.selection()
if not selected:
return
item = self.result_tree.item(selected[0])
trick_id = int(item["tags"][0])
trick = next((t for t in self.tricks_data if t["id"] == trick_id), None)
if not trick:
return
detail_win = tk.Toplevel(self.root)
detail_win.title(trick["title"])
detail_win.geometry("500x400")
detail_win.configure(bg="#f0f8ff")
# 标题
title_label = tk.Label(detail_win, text=trick["title"], font=("微软雅黑", 16, "bold"),
bg="#f0f8ff", fg="#2f4f4f")
title_label.pack(pady=(15, 5), padx=20, anchor="w")
# 类别标签
cat_label = tk.Label(detail_win, text=f"类别: {trick['category']}",
font=("微软雅黑", 11), bg="#f0f8ff", fg="#4682b4")
cat_label.pack(padx=20, anchor="w")
# 日期标签
date_label = tk.Label(detail_win, text=f"添加时间: {trick['date']}",
font=("微软雅黑", 10), bg="#f0f8ff", fg="#696969")
date_label.pack(padx=20, anchor="w")
# 分隔线
ttk.Separator(detail_win, orient="horizontal").pack(fill="x", padx=20, pady=10)
# 内容
content_frame = tk.Frame(detail_win, bg="#ffffff", bd=1, relief="sunken")
content_frame.pack(fill="both", expand=True, padx=20, pady=(0, 15))
content_text = tk.Text(content_frame, wrap="word", font=("微软雅黑", 11),
padx=10, pady=10, bg="#ffffff", fg="#333333")
content_text.insert("1.0", trick["content"])
content_text.config(state="disabled")
content_text.pack(fill="both", expand=True)
# 关键词标签
keywords = ", ".join(trick["keywords"])
kw_label = tk.Label(detail_win, text=f"关键词: {keywords}",
font=("微软雅黑", 10), bg="#f0f8ff", fg="#8b4513")
kw_label.pack(padx=20, anchor="w")
# 添加到历史记录
self.add_to_history(f"查看: {trick['title']}")
def add_to_favorites(self):
selected = self.result_tree.selection()
if not selected:
messagebox.showinfo("提示", "请先选择一个技巧")
return
item = self.result_tree.item(selected[0])
trick_id = int(item["tags"][0])
if trick_id in self.favorites:
messagebox.showinfo("提示", "该技巧已在收藏夹中")
return
self.favorites.append(trick_id)
self.save_data(self.favorites, "data/favorites.json")
messagebox.showinfo("成功", "已添加到收藏夹")
def view_favorites(self):
if not self.favorites:
messagebox.showinfo("收藏夹", "收藏夹为空")
return
fav_win = tk.Toplevel(self.root)
fav_win.title("我的收藏")
fav_win.geometry("500x400")
fav_win.configure(bg="#f0f8ff")
tree = ttk.Treeview(fav_win, columns=("category", "date"), show="headings")
tree.heading("#0", text="技巧名称", anchor="w")
tree.heading("category", text="类别")
tree.heading("date", text="添加时间")
tree.column("#0", width=250)
tree.column("category", width=100)
tree.column("date", width=150)
for fav_id in self.favorites:
trick = next((t for t in self.tricks_data if t["id"] == fav_id), None)
if trick:
tree.insert("", "end", text=trick["title"],
values=(trick["category"], trick["date"]),
tags=(str(trick["id"]),))
tree.pack(fill="both", expand=True, padx=10, pady=10)
tree.bind("<Double-1>", lambda e: self.show_from_favorites(tree))
def show_from_favorites(self, tree):
selected = tree.selection()
if not selected:
return
item = tree.item(selected[0])
trick_id = int(item["tags"][0])
trick = next((t for t in self.tricks_data if t["id"] == trick_id), None)
if trick:
detail_win = tk.Toplevel(self.root)
detail_win.title(trick["title"])
detail_win.geometry("500x400")
detail_win.configure(bg="#f0f8ff")
# 显示技巧详情(与show_trick_detail类似)
# 为节省空间,这里省略具体实现
messagebox.showinfo(trick["title"], f"类别: {trick['category']}\n\n{trick['content']}")
def view_history(self):
if not self.history:
messagebox.showinfo("使用记录", "暂无使用记录")
return
hist_win = tk.Toplevel(self.root)
hist_win.title("使用记录")
hist_win.geometry("500x300")
hist_win.configure(bg="#f0f8ff")
text = tk.Text(hist_win, wrap="word", font=("微软雅黑", 11), padx=10, pady=10)
text.pack(fill="both", expand=True, padx=10, pady=10)
for entry in self.history[-20:]: # 显示最近20条记录
text.insert("end", f"{entry['time']} - {entry['action']}\n")
text.config(state="disabled")
def add_to_history(self, action, count=None):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
entry = {"time": timestamp, "action": action}
if count is not None:
entry["action"] += f" (找到{count}条结果)"
self.history.append(entry)
self.save_data(self.history, "data/history.json")
def add_new_trick(self):
add_win = tk.Toplevel(self.root)
add_win.title("添加新技巧")
add_win.geometry("500x500")
add_win.configure(bg="#f0f8ff")
# 表单字段
fields = [
("标题", "title"),
("类别", "category"),
("内容", "content"),
("关键词(逗号分隔)", "keywords")
]
entries = {}
for i, (label, key) in enumerate(fields):
frame = tk.Frame(add_win, bg="#f0f8ff")
frame.pack(fill="x", padx=20, pady=5)
lbl = tk.Label(frame, text=label+":", width=15, anchor="e",
bg="#f0f8ff", font=("微软雅黑", 11))
lbl.pack(side="left")
if key == "content":
entry = tk.Text(frame, height=6, font=("微软雅黑", 11))
elif key == "keywords":
entry = tk.Entry(frame, font=("微软雅黑", 11))
else:
entry = tk.Entry(frame, font=("微软雅黑", 11))
entry.pack(side="left", fill="x", expand=True)
entries[key] = entry
# 提交按钮
submit_btn = tk.Button(add_win, text="添加技巧",
command=lambda: self.submit_new_trick(entries, add_win),
bg="#3cb371", fg="white", font=("微软雅黑", 11))
submit_btn.pack(pady=15)
def submit_new_trick(self, entries, window):
new_trick = {
"id": max([t["id"] for t in self.tricks_data], default=0) + 1,
"title": entries["title"].get().strip(),
"category": entries["category"].get().strip(),
"content": entries["content"].get("1.0", "end").strip(),
"keywords": [k.strip() for k in entries["keywords"].get().split(",")],
"date": datetime.now().strftime("%Y-%m-%d")
}
if not new_trick["title"] or not new_trick["content"]:
messagebox.showerror("错误", "标题和内容不能为空")
return
self.tricks_data.append(new_trick)
self.save_data(self.tricks_data, "data/tricks.json")
messagebox.showinfo("成功", "新技巧已添加")
window.destroy()
def exit_app(self):
if messagebox.askyesno("退出", "确定要退出程序吗?"):
self.root.destroy()
def initialize_sample_data():
sample_data = [
{
"id": 1,
"title": "去除水壶水垢",
"category": "清洁妙招",
"content": "将白醋倒入水壶中,加水至半满,煮沸后静置30分钟,然后用清水冲洗干净。顽固水垢可重复此过程。",
"keywords": ["水垢", "水壶", "清洁", "白醋"],
"date": "2023-05-10"
},
{
"id": 2,
"title": "衣物折叠收纳法",
"category": "收纳整理",
"content": "1. T恤: 背面朝上,两侧向中间折叠,下摆向上折叠至领口。\n2. 裤子: 平铺后对折再对折。\n3. 袜子: 卷成球状节省空间。\n使用收纳盒分类存放,贴上标签便于查找。",
"keywords": ["衣物", "折叠", "收纳", "整理"],
"date": "2023-05-12"
},
{
"id": 3,
"title": "缓解眼部疲劳",
"category": "养生保健",
"content": "每工作45分钟,远眺20秒放松眼睛。用温热的湿毛巾敷眼5分钟。多吃胡萝卜、蓝莓等护眼食物。保证每天7-8小时睡眠。",
"keywords": ["眼睛", "疲劳", "保健", "休息"],
"date": "2023-05-15"
},
{
"id": 4,
"title": "快速解冻肉类",
"category": "厨房窍门",
"content": "将冷冻肉放入密封袋中,浸泡在冷水中,每30分钟换一次水。比室温解冻快3倍且更安全卫生。切勿用热水解冻!",
"keywords": ["解冻", "肉类", "冷冻", "厨房"],
"date": "2023-05-18"
},
{
"id": 5,
"title": "去除衣服油渍",
"category": "衣物护理",
"content": "立即撒上面粉或小苏打吸附油脂,静置15分钟后刷掉。再用洗洁精涂抹污渍处,正常洗涤即可。陈旧油渍可用汽油轻擦(注意通风)。",
"keywords": ["油渍", "衣服", "清洁", "去污"],
"date": "2023-05-20"
},
{
"id": 6,
"title": "自制健康早餐粥",
"category": "健康饮食",
"content": "材料: 燕麦片50g、小米30g、枸杞10g、红枣5颗、水800ml。做法: 所有材料洗净入锅,大火煮开后转小火煮25分钟。可加少量蜂蜜调味。富含膳食纤维,养胃又营养。",
"keywords": ["早餐", "粥", "健康", "食谱"],
"date": "2023-05-22"
}
]
if not os.path.exists("data/tricks.json"):
with open("data/tricks.json", 'w', encoding='utf-8') as f:
json.dump(sample_data, f, ensure_ascii=False, indent=2)
if __name__ == "__main__":
# 初始化示例数据
initialize_sample_data()
# 启动应用
root = tk.Tk()
app = LifeHacksApp(root)
root.mainloop()
程序功能说明
这个生活小窍门查询小程序具有以下核心功能:
1. 分类浏览:提供清洁妙招、收纳整理、养生保健等分类
2. 关键词搜索:支持按标题、内容和关键词搜索技巧
3. 收藏功能:可收藏常用技巧,方便后续查看
4. 使用记录:自动记录用户查看和搜索的历史
5. 添加新技巧:用户可以添加新的生活小窍门
6. 离线使用:所有数据存储在本地文件中
适用场景
特别为中老年人设计,解决日常生活中的问题:
- 清洁类:去除水垢、油渍清洁等
- 收纳类:衣物折叠收纳方法
- 养生类:缓解眼部疲劳、健康饮食建议
- 厨房类:快速解冻肉类、自制健康早餐
使用说明
1. 首次运行会自动创建示例数据
2. 通过左侧分类导航浏览不同类别的技巧
3. 使用顶部搜索框查找特定技巧
4. 选中技巧后点击"收藏技巧"将其加入收藏夹
5. 点击"查看收藏"管理收藏的技巧
6. 点击"添加新技巧"分享自己的生活经验
技术特点
- 使用Tkinter创建图形用户界面
- 数据存储在JSON文件中,支持离线使用
- 简洁明了的界面设计,适合中老年人使用
- 响应式布局,操作简单直观
要运行此程序,只需安装Python(建议3.6+版本)并运行脚本即可。所有依赖都是Python标准库的一部分。
我是编程小白,请大家多多指教,谢谢!