缘起
2019年圈子内有一个段子火了,因为赶进度,做项目996时间工作的程序员工作压力特别大,晚上睡觉的生活做了一个梦,梦见自己见阎王爷了,阎王爷让他为生死簿做个后台管理系统。
公司:听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员……
996程序员做的梦:
于是乎 就有了这篇文章!~~~
程序员还阳
项目进行中,程序员真的把系统做出来了,并且偷偷地在系统上留了一个后门,不仅回到了阳间,还将自己的寿命修改为 ∞。
项目展示
生死簿可以看到阳寿未尽、孤魂野鬼、已经转世投胎人的名单。通过查询后台数据,我们发现,孙猴子不是物理删库,他是获取了阎王爷的超级管理员权限,直接把自己的名字,从生死簿中给删除了。
基于pythonTK原生实现桌面客户端1.0版本!使用列表字典嵌套组织数据对象
面向过程项目代码拆解
环境:py3.7
数据初始化前期准备
库
代码语言:python代码运行次数:0复制import tkinter as tk
from tkinter import messagebox
import pygame
from random import randint
全局变量初始化
代码语言:python代码运行次数:0复制# 初始化全局变量
shengsibooks = []
count = 0
image = None
gongdeText = None
# 临时存储 搜索回填的数据
user_data = {"编号": None,"姓名": None, "性别": None, '年龄':None , "出生日期": None, "死亡日期": None, '生死状态': None, '因果报应': None}
# 初始化pygame.mixer
pygame.mixer.init()
生成模拟数据
代码语言:python代码运行次数:0复制# 生成生死簿数据
def initdata():
for x in range(1, 10):
id_str = "{:05d}".format(x)
name = f"猴{x}"
chusheng = '{}年{}月{}日'.format(randint(1930, 1980), randint(1, 12), randint(1, 28))
siwang = '{}年{}月{}日'.format(randint(1981, 2000), randint(1, 12), randint(1, 28))
sex = ""
SSStaus = '死'
if x % 2 == 0:
sex = "男"
else:
sex = "女"
desc = '生前善良,但心存私心,需在轮回中修行'
age = randint(18, 25)
houzi = {"编号": id_str,"姓名": name, "性别": sex, '年龄':age , "出生日期": chusheng, "死亡日期": siwang, '生死状态': SSStaus, '因果报应': desc}
shengsibooks.append(houzi)
登录窗口绘制
代码语言:python代码运行次数:0复制# 登录界面
root = tk.Tk()
# 获取屏幕宽高
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 计算窗口位置
x = (screen_width - 500) // 2 # 500是窗口宽度
y = (screen_height - 300) // 2 # 300是窗口高度
# 设置窗口位置
root.geometry('500x300 {} {}'.format(x, y))
root.title('地府生死簿管理系统')
# 获取账号密码
username = tk.StringVar()
password = tk.StringVar()
page = tk.Frame(root)
page.pack()
tk.Label(page, text='登录地府管理系统', font=('宋体', 14)).grid(row=0, columnspan=3, pady=10) #文字标签的columnspan设置为3,会跨越3列
tk.Label(page).grid(row=0, column=0)
tk.Label(page, text='账号:').grid(row=1, column=1, pady=10)
tk.Entry(page, textvariable=username).grid(row=1, column=2)
tk.Label(page, text='密码:').grid(row=2, column=1, pady=10)
tk.Entry(page, textvariable=password).grid(row=2, column=2)
登录函数
代码语言:python代码运行次数:0复制# 登录函数
def login():
name = username.get()
pwd = password.get()
if name == 'admin' and pwd == '123456':
messagebox.showinfo(title="提示", message='登录成功')
root.destroy() # 登录成功后关闭登录窗口
show_main_window() # 打开主界面
else:
messagebox.showwarning(title="提示", message='请检查账号密码是否正确')
tk.Button(page, text='立即登录', command=login).grid(row=3, column=1, pady=10)
tk.Button(page, text='安全退出', command=root.quit).grid(row=3, column=3, pady=10)
首页
代码语言:python代码运行次数:0复制# 显示主界面
def show_main_window():
main_window = tk.Tk()
# 获取屏幕宽高
screen_width = main_window.winfo_screenwidth()
screen_height = main_window.winfo_screenheight()
# 计算窗口位置
x = (screen_width - 1000) // 2 # 1000是窗口宽度
y = (screen_height - 600) // 2 # 500是窗口高度
# 设置窗口位置
main_window.geometry('1000x600 {} {}'.format(x, y))
main_window.title('地府生死簿管理系统')
main_frame = tk.Frame(main_window)
main_frame.pack(pady=20)
# 默认显示初始化页面
init_page(main_frame)
# 菜单栏
tabbar = tk.Menu(main_window)
tabbar.add_command(label='首页', command=lambda: index(main_frame))
tabbar.add_command(label='添加', command=lambda: add_page(main_frame))
tabbar.add_command(label='编辑', command=lambda: edit_page(main_frame))
tabbar.add_command(label='搜索', command=lambda: search_page(main_frame))
tabbar.add_command(label='删除', command=lambda: del_page(main_frame))
tabbar.add_command(label='控制终端', command=lambda: cmd(main_frame))
tabbar.add_command(label='赛博木鱼', command=lambda: gongde(main_frame))
tabbar.add_command(label='关于', command=lambda: create_about_page(main_frame))
main_window.config(menu=tabbar)
tk.Label(main_frame, text='欢迎登录地府生死簿管理系统', font=('宋体', 14)).pack()
# 展示所有的生死簿数据
for houzi in shengsibooks:
tk.Label(main_frame, text=houzi, pady=5).pack()
tk.Button(main_frame, text='退出', command=main_window.quit).pack()
main_window.mainloop()
首页
可视化数据大屏幕与数据统计还没做,后续补上
代码语言:python代码运行次数:0复制# 首页模块
def index(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
tk.Label(parent_frame, text='可视化大屏').pack()
添加
代码语言:python代码运行次数:0复制# 添加模块
def add_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
add_frame = tk.Frame(parent_frame)
# StringVar来存储输入框中的内容
id_str = tk.StringVar()
name = tk.StringVar()
sex = tk.StringVar()
age = tk.StringVar()
chusheng = tk.StringVar()
siwang = tk.StringVar()
SSStaus = tk.StringVar()
desc = tk.StringVar()
tk.Label(add_frame).grid(row=0, column=0)
tk.Label(add_frame, text='姓名:').grid(row=1, column=1, pady=5)
tk.Entry(add_frame, textvariable=name).grid(row=1, column=2)
tk.Label(add_frame, text='性别:').grid(row=2, column=1, pady=5)
tk.Entry(add_frame, textvariable=sex).grid(row=2, column=2)
tk.Label(add_frame, text='年龄:').grid(row=3, column=1, pady=5)
tk.Entry(add_frame, textvariable=age).grid(row=3, column=2)
tk.Label(add_frame, text='出生日期:').grid(row=4, column=1, pady=5)
tk.Entry(add_frame, textvariable=chusheng).grid(row=4, column=2)
tk.Label(add_frame, text='死亡日期:').grid(row=5, column=1, pady=5)
tk.Entry(add_frame, textvariable=siwang).grid(row=5, column=2)
tk.Label(add_frame, text='生死状态:').grid(row=6, column=1, pady=5)
tk.Entry(add_frame, textvariable=SSStaus).grid(row=6, column=2)
tk.Label(add_frame, text='因果报应:').grid(row=6, column=1, pady=5)
tk.Entry(add_frame, textvariable=desc).grid(row=6, column=2)
tk.Label(add_frame, text='编号:').grid(row=7, column=1, pady=5)
tk.Entry(add_frame, textvariable=id_str).grid(row=7, column=2)
add_button = tk.Button(add_frame, text="添加", padx=5,
command=lambda: add(id_str.get(),name.get(), sex.get(), age.get(), chusheng.get(), siwang.get(), SSStaus,
desc.get()))
add_button.grid(row=8, column=1, pady=5)
add_frame.pack()
# 添加函数
def add(id_str, name, sex, age, chusheng, siwang, SSStaus, desc):
houzi = {"编号": id_str, "姓名": name, "性别": sex, '年龄': age, "出生日期": chusheng, "死亡日期": siwang,
'生死状态': SSStaus,
'因果报应': desc}
# 遍历生死簿,检查是否有相同编号的记录存在
for nb in shengsibooks:
if nb["编号"] == id_str:
# 如果找到相同编号的记录,提示添加失败并返回
messagebox.showwarning(title="提示", message=name '添加失败,编号已存在')
return
# 如果循环结束仍未找到相同编号的记录,则将新记录添加到列表中
shengsibooks.append(houzi)
# 提示用户添加成功
messagebox.showinfo(title="提示", message=name '添加成功')
修改
代码语言:python代码运行次数:0复制# 编辑模块
def edit_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
edit_frame = tk.Frame(parent_frame)
search_id = tk.StringVar()
# 添加搜索框
tk.Label(edit_frame, text='搜索ID:').grid(row=0, column=0, pady=5)
search_entry = tk.Entry(edit_frame, textvariable=search_id)
search_entry.grid(row=0, column=1)
# 添加搜索按钮
tk.Button(edit_frame, text="搜索", padx=5, command=lambda: search_info(search_id.get())).grid(row=0, column=2, pady=5)
id_str = tk.StringVar()
name = tk.StringVar()
sex = tk.StringVar()
age = tk.StringVar()
chusheng = tk.StringVar()
siwang = tk.StringVar()
SSStaus = tk.StringVar()
desc = tk.StringVar()
# 添加其他输入框和标签
tk.Label(edit_frame).grid(row=0, column=0)
tk.Label(edit_frame, text='姓名:').grid(row=1, column=1, pady=5)
name_entry = tk.Entry(edit_frame, textvariable=name)
name_entry.grid(row=1, column=2)
tk.Label(edit_frame, text='性别:').grid(row=2, column=1, pady=5)
sex_entry = tk.Entry(edit_frame, textvariable=sex)
sex_entry.grid(row=2, column=2)
tk.Label(edit_frame, text='年龄:').grid(row=3, column=1, pady=5)
age_entry = tk.Entry(edit_frame, textvariable=age)
age_entry.grid(row=3, column=2)
tk.Label(edit_frame, text='出生日期:').grid(row=4, column=1, pady=5)
chusheng_entry = tk.Entry(edit_frame, textvariable=chusheng)
chusheng_entry.grid(row=4, column=2)
tk.Label(edit_frame, text='死亡日期:').grid(row=5, column=1, pady=5)
siwang_entry = tk.Entry(edit_frame, textvariable=siwang)
siwang_entry.grid(row=5, column=2)
tk.Label(edit_frame, text='生死状态:').grid(row=6, column=1, pady=5)
SSStaus_entry = tk.Entry(edit_frame, textvariable=SSStaus)
SSStaus_entry.grid(row=6, column=2)
tk.Label(edit_frame, text='因果报应:').grid(row=7, column=1, pady=5)
desc_entry = tk.Entry(edit_frame, textvariable=desc)
desc_entry.grid(row=7, column=2)
tk.Label(edit_frame, text='编号:').grid(row=8, column=1, pady=5)
id_str_entry = tk.Entry(edit_frame, textvariable=id_str)
id_str_entry.grid(row=8, column=2)
add_button = tk.Button(edit_frame, text="添加", padx=5,
command=lambda: edit(id_str.get(), name.get(), sex.get(), age.get(), chusheng.get(),
siwang.get(), SSStaus,
desc.get()))
add_button.grid(row=8, column=1, pady=5)
edit_frame.pack()
# 数据回填
def fill_data(data):
name.set(data['姓名'])
sex.set(data['性别'])
age.set(data['年龄'])
chusheng.set(data['出生日期'])
siwang.set(data['死亡日期'])
SSStaus.set(data['生死状态'])
desc.set(data['因果报应'])
id_str.set(data['编号'])
# 数据查询并回填
def search_info(id_str):
for nb in shengsibooks:
if nb["编号"] == id_str:
fill_data(nb) # nb对象丢过去进行回填
return
messagebox.showinfo(title="提示", message='未找到编号为' id_str '的记录')
# 修改
def edit(id_str, name, sex, age, chusheng, siwang, SSStaus, desc):
# 遍历生死簿,寻找与输入编号匹配的记录
for nb in shengsibooks:
if nb["编号"] == id_str:
# 检查每个字段是否被修改,如果有修改则更新对应字段值
if nb['姓名'] != name:
nb['姓名'] = name
if nb['性别'] != sex:
nb['性别'] = sex
if nb['年龄'] != age:
nb['年龄'] = age
if nb['出生日期'] != chusheng:
nb['出生日期'] = chusheng
if nb['死亡日期'] != siwang:
nb['死亡日期'] = siwang
if nb['生死状态'] != SSStaus:
nb['生死状态'] = SSStaus
if nb['因果报应'] != desc:
nb['因果报应'] = desc
# 提示用户修改成功
messagebox.showinfo(title="提示", message='修改成功')
return
# 如果找不到匹配的记录,提示用户未找到
messagebox.showinfo(title="提示", message='未找到编号为' id_str '的用户')
查询
代码语言:python代码运行次数:0复制# 搜索模块
def search_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
id = tk.StringVar()
# 按照姓名搜索
search_frame = tk.Frame(parent_frame)
search_label = tk.Label(search_frame, text="按照编号搜索:",padx=10)
search_label.pack(side="left")
search_entry = tk.Entry(search_frame, textvariable=id)
search_entry.pack(side="left")
search_button = tk.Button(search_frame, text="搜索", padx=10, command=lambda: shaixuan(parent_frame, shengsibooks, id.get()))
search_button.pack(side="left")
search_frame.pack()
def shaixuan(parent_frame, shengsibooks, id):
for widget in parent_frame.winfo_children():
if isinstance(widget, tk.Label):
# 只更新标签的文本内容,,销毁一下标签
widget.destroy()
for houzi in shengsibooks:
if houzi["编号"] == id:
label_text = f"姓名: {houzi['姓名']}, nn年龄: {houzi['年龄']}, nn性别: {houzi['性别']}, nn出生日期: {houzi['出生日期']}, nn死亡日期: {houzi['死亡日期']}, nn生死状态: {houzi['生死状态']}, nn因果报应: {houzi['因果报应']}"
# 在已有标签的位置更新文本内容
tk.Label(parent_frame, text=label_text, pady=5).pack()
return
messagebox.showinfo(title="提示", message='未找到编号为' id '的用户')
删除
代码语言:python代码运行次数:0复制# 删除模块
def del_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
del_frame = tk.Frame(parent_frame)
id_str = tk.StringVar()
tk.Label(del_frame).grid(row=0, column=0)
tk.Label(del_frame, text='请输入编号:').grid(row=1, column=1, pady=5)
tk.Entry(del_frame, textvariable=id_str).grid(row=1, column=2)
# 删除函数
def del_info():
for nb in shengsibooks:
if nb["编号"] == id_str.get():
shengsibooks.remove(nb)
messagebox.showinfo(title="提示", message= nb["编号"] '删除成功')
return
messagebox.showinfo(title="提示", message='未找到编号为' id_str.get() '的用户')
add_button = tk.Button(del_frame, text="删除", padx=5, command=del_info)
add_button.grid(row=8, column=1, pady=5)
del_frame.pack()
电子木鱼
代码语言:python代码运行次数:0复制# 电子木鱼
def gongde(parent_frame):
global image, count, gongdeText
for widget in parent_frame.winfo_children():
widget.destroy()
# 更新显示的文本
gongdeText = tk.Label(parent_frame, text=str(count), font=("宋体", 100))
gongdeText.pack()
tk.Label(parent_frame, text='功德', font=("宋体", 50)).pack()
# 加载图片文件
image = tk.PhotoImage(file="my.png")
label = tk.Label(parent_frame, image=image)
label.pack()
label.bind("<Button-1>", on_image_click)
tk.Label(parent_frame, text='敲电子木鱼,见机甲佛祖,修赛博真经。', font=("宋体", 20)).pack()
事件方法
代码语言:python代码运行次数:0复制# 木鱼敲击声
def on_image_click(event):
global count
count = 1
# 更新标签显示的文本 ,功德 1 佛祖保佑你!!
gongdeText.config(text=str(count))
# 播放声音
pygame.mixer.music.load("sound.wav")
pygame.mixer.music.play()
饼图
代码语言:python代码运行次数:0复制####################### 界面布局
# 首页模块
def index(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
# 创建一个Frame来容纳图表
chart_frame = tk.Frame(parent_frame)
chart_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
# 标题
title_label = tk.Label(chart_frame, text='男女比例展示', font=('Microsoft YaHei',30))
title_label.pack()
# 获取男女数量
male_count, female_count = initdata()
# 绘制饼图
fig = Figure(figsize=(5, 4), dpi=100)
ax = fig.add_subplot(111)
labels = ['male', 'female']
sizes = [male_count, female_count]
colors = ['#ff9999', '#66b3ff']
explode = (0.1, 0) # 突出显示男性部分
ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
ax.axis('equal') # 保持圆形
ax.set_title('male:female')
# 创建画布并将图表放入其中
canvas = FigureCanvasTkAgg(fig, master=chart_frame)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
完整代码
代码语言:python代码运行次数:1复制import tkinter as tk
from tkinter import messagebox
import pygame
from random import randint
# 初始化全局变量
shengsibooks = []
count = 0
image = None
gongdeText = None
# 临时存储 搜索回填的数据
user_data = {"编号": None, "姓名": None, "性别": None, '年龄': None, "出生日期": None, "死亡日期": None,
'生死状态': None, '因果报应': None}
# 初始化pygame.mixer
pygame.mixer.init()
################ 数据模型与方法
# 生成生死簿数据
def initdata():
for x in range(1, 10):
id_str = "{:05d}".format(x)
name = f"猴{x}"
chusheng = '{}年{}月{}日'.format(randint(1930, 1980), randint(1, 12), randint(1, 28))
siwang = '{}年{}月{}日'.format(randint(1981, 2000), randint(1, 12), randint(1, 28))
sex = ""
SSStaus = '死'
if x % 2 == 0:
sex = "男"
else:
sex = "女"
desc = '生前善良,但心存私心,需在轮回中修行'
age = randint(18, 25)
houzi = {"编号": id_str, "姓名": name, "性别": sex, '年龄': age, "出生日期": chusheng, "死亡日期": siwang,
'生死状态': SSStaus, '因果报应': desc}
shengsibooks.append(houzi)
# 木鱼敲击声
def on_image_click(event):
global count
count = 1
# 更新标签显示的文本 ,功德 1 佛祖保佑你!!
gongdeText.config(text=str(count))
# 播放声音
pygame.mixer.music.load("sound.wav")
pygame.mixer.music.play()
####################### 界面布局
# 首页模块
def index(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
tk.Label(parent_frame, text='可视化大屏').pack()
# 初始化页面
def init_page(parent_frame):
for widget in parent_frame.winfo_children():
widget.destroy()
# 关于模块
def create_about_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
tk.Label(parent_frame, text='系统名称:地府生死簿管理系统', font=(20), pady=20).pack()
tk.Label(parent_frame, text='关于我:Cat00011cat', font=(20), pady=20).pack()
tk.Label(parent_frame, text='主页:http://thecat.top', font=(20), pady=20).pack()
# 添加模块
def add_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
add_frame = tk.Frame(parent_frame)
# StringVar来存储输入框中的内容
id_str = tk.StringVar()
name = tk.StringVar()
sex = tk.StringVar()
age = tk.StringVar()
chusheng = tk.StringVar()
siwang = tk.StringVar()
SSStaus = tk.StringVar()
desc = tk.StringVar()
tk.Label(add_frame).grid(row=0, column=0)
tk.Label(add_frame, text='姓名:').grid(row=1, column=1, pady=5)
tk.Entry(add_frame, textvariable=name).grid(row=1, column=2)
tk.Label(add_frame, text='性别:').grid(row=2, column=1, pady=5)
tk.Entry(add_frame, textvariable=sex).grid(row=2, column=2)
tk.Label(add_frame, text='年龄:').grid(row=3, column=1, pady=5)
tk.Entry(add_frame, textvariable=age).grid(row=3, column=2)
tk.Label(add_frame, text='出生日期:').grid(row=4, column=1, pady=5)
tk.Entry(add_frame, textvariable=chusheng).grid(row=4, column=2)
tk.Label(add_frame, text='死亡日期:').grid(row=5, column=1, pady=5)
tk.Entry(add_frame, textvariable=siwang).grid(row=5, column=2)
tk.Label(add_frame, text='生死状态:').grid(row=6, column=1, pady=5)
tk.Entry(add_frame, textvariable=SSStaus).grid(row=6, column=2)
tk.Label(add_frame, text='因果报应:').grid(row=6, column=1, pady=5)
tk.Entry(add_frame, textvariable=desc).grid(row=6, column=2)
tk.Label(add_frame, text='编号:').grid(row=7, column=1, pady=5)
tk.Entry(add_frame, textvariable=id_str).grid(row=7, column=2)
add_button = tk.Button(add_frame, text="添加", padx=5,
command=lambda: add(id_str.get(), name.get(), sex.get(), age.get(), chusheng.get(),
siwang.get(), SSStaus,
desc.get()))
add_button.grid(row=8, column=1, pady=5)
add_frame.pack()
# 添加函数
def add(id_str, name, sex, age, chusheng, siwang, SSStaus, desc):
houzi = {"编号": id_str, "姓名": name, "性别": sex, '年龄': age, "出生日期": chusheng, "死亡日期": siwang,
'生死状态': SSStaus,
'因果报应': desc}
# 遍历生死簿,检查是否有相同编号的记录存在
for nb in shengsibooks:
if nb["编号"] == id_str:
# 如果找到相同编号的记录,提示添加失败并返回
messagebox.showwarning(title="提示", message=name '添加失败,编号已存在')
return
# 如果循环结束仍未找到相同编号的记录,则将新记录添加到列表中
shengsibooks.append(houzi)
# 提示用户添加成功
messagebox.showinfo(title="提示", message=name '添加成功')
# 编辑模块
def edit_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
edit_frame = tk.Frame(parent_frame)
search_id = tk.StringVar()
# 添加搜索框
tk.Label(edit_frame, text='搜索ID:').grid(row=0, column=0, pady=5)
search_entry = tk.Entry(edit_frame, textvariable=search_id)
search_entry.grid(row=0, column=1)
# 添加搜索按钮
tk.Button(edit_frame, text="搜索", padx=5, command=lambda: search_info(search_id.get())).grid(row=0, column=2,
pady=5)
id_str = tk.StringVar()
name = tk.StringVar()
sex = tk.StringVar()
age = tk.StringVar()
chusheng = tk.StringVar()
siwang = tk.StringVar()
SSStaus = tk.StringVar()
desc = tk.StringVar()
# 添加其他输入框和标签
tk.Label(edit_frame).grid(row=0, column=0)
tk.Label(edit_frame, text='姓名:').grid(row=1, column=1, pady=5)
name_entry = tk.Entry(edit_frame, textvariable=name)
name_entry.grid(row=1, column=2)
tk.Label(edit_frame, text='性别:').grid(row=2, column=1, pady=5)
sex_entry = tk.Entry(edit_frame, textvariable=sex)
sex_entry.grid(row=2, column=2)
tk.Label(edit_frame, text='年龄:').grid(row=3, column=1, pady=5)
age_entry = tk.Entry(edit_frame, textvariable=age)
age_entry.grid(row=3, column=2)
tk.Label(edit_frame, text='出生日期:').grid(row=4, column=1, pady=5)
chusheng_entry = tk.Entry(edit_frame, textvariable=chusheng)
chusheng_entry.grid(row=4, column=2)
tk.Label(edit_frame, text='死亡日期:').grid(row=5, column=1, pady=5)
siwang_entry = tk.Entry(edit_frame, textvariable=siwang)
siwang_entry.grid(row=5, column=2)
tk.Label(edit_frame, text='生死状态:').grid(row=6, column=1, pady=5)
SSStaus_entry = tk.Entry(edit_frame, textvariable=SSStaus)
SSStaus_entry.grid(row=6, column=2)
tk.Label(edit_frame, text='因果报应:').grid(row=7, column=1, pady=5)
desc_entry = tk.Entry(edit_frame, textvariable=desc)
desc_entry.grid(row=7, column=2)
tk.Label(edit_frame, text='编号:').grid(row=8, column=1, pady=5)
id_str_entry = tk.Entry(edit_frame, textvariable=id_str)
id_str_entry.grid(row=8, column=2)
add_button = tk.Button(edit_frame, text="添加", padx=5,
command=lambda: edit(id_str.get(), name.get(), sex.get(), age.get(), chusheng.get(),
siwang.get(), SSStaus,
desc.get()))
add_button.grid(row=8, column=1, pady=5)
edit_frame.pack()
# 数据回填
def fill_data(data):
name.set(data['姓名'])
sex.set(data['性别'])
age.set(data['年龄'])
chusheng.set(data['出生日期'])
siwang.set(data['死亡日期'])
SSStaus.set(data['生死状态'])
desc.set(data['因果报应'])
id_str.set(data['编号'])
# 数据查询并回填
def search_info(id_str):
for nb in shengsibooks:
if nb["编号"] == id_str:
fill_data(nb) # nb对象丢过去进行回填
return
messagebox.showinfo(title="提示", message='未找到编号为' id_str '的记录')
# 修改
def edit(id_str, name, sex, age, chusheng, siwang, SSStaus, desc):
# 遍历生死簿,寻找与输入编号匹配的记录
for nb in shengsibooks:
if nb["编号"] == id_str:
# 检查每个字段是否被修改,如果有修改则更新对应字段值
if nb['姓名'] != name:
nb['姓名'] = name
if nb['性别'] != sex:
nb['性别'] = sex
if nb['年龄'] != age:
nb['年龄'] = age
if nb['出生日期'] != chusheng:
nb['出生日期'] = chusheng
if nb['死亡日期'] != siwang:
nb['死亡日期'] = siwang
if nb['生死状态'] != SSStaus:
nb['生死状态'] = SSStaus
if nb['因果报应'] != desc:
nb['因果报应'] = desc
# 提示用户修改成功
messagebox.showinfo(title="提示", message='修改成功')
return
# 如果找不到匹配的记录,提示用户未找到
messagebox.showinfo(title="提示", message='未找到编号为' id_str '的用户')
# 搜索模块
def search_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
id = tk.StringVar()
# 按照姓名搜索
search_frame = tk.Frame(parent_frame)
search_label = tk.Label(search_frame, text="按照编号搜索:", padx=10)
search_label.pack(side="left")
search_entry = tk.Entry(search_frame, textvariable=id)
search_entry.pack(side="left")
search_button = tk.Button(search_frame, text="搜索", padx=10,
command=lambda: shaixuan(parent_frame, shengsibooks, id.get()))
search_button.pack(side="left")
search_frame.pack()
def shaixuan(parent_frame, shengsibooks, id):
for widget in parent_frame.winfo_children():
if isinstance(widget, tk.Label):
# 只更新标签的文本内容,,销毁一下标签
widget.destroy()
for houzi in shengsibooks:
if houzi["编号"] == id:
label_text = f"姓名: {houzi['姓名']}, nn年龄: {houzi['年龄']}, nn性别: {houzi['性别']}, nn出生日期: {houzi['出生日期']}, nn死亡日期: {houzi['死亡日期']}, nn生死状态: {houzi['生死状态']}, nn因果报应: {houzi['因果报应']}"
# 在已有标签的位置更新文本内容
tk.Label(parent_frame, text=label_text, pady=5).pack()
return
messagebox.showinfo(title="提示", message='未找到编号为' id '的用户')
# 删除模块
def del_page(parent_frame):
# 清空父框架中的内容
for widget in parent_frame.winfo_children():
widget.destroy()
del_frame = tk.Frame(parent_frame)
id_str = tk.StringVar()
tk.Label(del_frame).grid(row=0, column=0)
tk.Label(del_frame, text='请输入编号:').grid(row=1, column=1, pady=5)
tk.Entry(del_frame, textvariable=id_str).grid(row=1, column=2)
# 删除函数
def del_info():
for nb in shengsibooks:
if nb["编号"] == id_str.get():
shengsibooks.remove(nb)
messagebox.showinfo(title="提示", message=nb["编号"] '删除成功')
return
messagebox.showinfo(title="提示", message='未找到编号为' id_str.get() '的用户')
add_button = tk.Button(del_frame, text="删除", padx=5, command=del_info)
add_button.grid(row=8, column=1, pady=5)
del_frame.pack()
# 电子木鱼
def gongde(parent_frame):
global image, count, gongdeText
for widget in parent_frame.winfo_children():
widget.destroy()
# 更新显示的文本
gongdeText = tk.Label(parent_frame, text=str(count), font=("宋体", 100))
gongdeText.pack()
tk.Label(parent_frame, text='功德', font=("宋体", 50)).pack()
# 加载图片文件
image = tk.PhotoImage(file="my.png")
label = tk.Label(parent_frame, image=image)
label.pack()
label.bind("<Button-1>", on_image_click)
tk.Label(parent_frame, text='敲电子木鱼,见机甲佛祖,修赛博真经。', font=("宋体", 20)).pack()
# 控制终端
def cmd(parent_frame):
for widget in parent_frame.winfo_children():
widget.destroy()
tk.Label(parent_frame, text='控制台').pack()
# 显示主界面
def show_main_window():
main_window = tk.Tk()
# 获取屏幕宽高
screen_width = main_window.winfo_screenwidth()
screen_height = main_window.winfo_screenheight()
# 计算窗口位置
x = (screen_width - 1000) // 2 # 1000是窗口宽度
y = (screen_height - 600) // 2 # 500是窗口高度
# 设置窗口位置
main_window.geometry('1000x600 {} {}'.format(x, y))
main_window.title('地府生死簿管理系统')
main_frame = tk.Frame(main_window)
main_frame.pack(pady=20)
# 默认显示初始化页面
init_page(main_frame)
# 菜单栏
tabbar = tk.Menu(main_window)
tabbar.add_command(label='首页', command=lambda: index(main_frame))
tabbar.add_command(label='添加', command=lambda: add_page(main_frame))
tabbar.add_command(label='编辑', command=lambda: edit_page(main_frame))
tabbar.add_command(label='搜索', command=lambda: search_page(main_frame))
tabbar.add_command(label='删除', command=lambda: del_page(main_frame))
tabbar.add_command(label='控制终端', command=lambda: cmd(main_frame))
tabbar.add_command(label='赛博木鱼', command=lambda: gongde(main_frame))
tabbar.add_command(label='关于', command=lambda: create_about_page(main_frame))
main_window.config(menu=tabbar)
tk.Label(main_frame, text='欢迎登录地府生死簿管理系统', font=('宋体', 14)).pack()
# 展示所有的生死簿数据
for houzi in shengsibooks:
tk.Label(main_frame, text=houzi, pady=5).pack()
tk.Button(main_frame, text='退出', command=main_window.quit).pack()
main_window.mainloop()
#################### 程序主入口
if __name__ == '__main__':
# 数据初始化
initdata()
print(shengsibooks)
for houzi in shengsibooks:
print("编号:", houzi["编号"])
print("姓名:", houzi["姓名"])
print("年龄:", houzi["年龄"])
print("性别:", houzi["性别"])
print("出生日期:", houzi["出生日期"])
print("死亡日期:", houzi["死亡日期"])
print("因果报应:", houzi["因果报应"])
# 登录界面
root = tk.Tk()
# 获取屏幕宽高
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 计算窗口位置
x = (screen_width - 500) // 2 # 500是窗口宽度
y = (screen_height - 300) // 2 # 300是窗口高度
# 设置窗口位置
root.geometry('500x300 {} {}'.format(x, y))
root.title('地府生死簿管理系统')
# 获取账号密码
username = tk.StringVar()
password = tk.StringVar()
page = tk.Frame(root)
page.pack()
tk.Label(page, text='登录地府管理系统', font=('宋体', 14)).grid(row=0, columnspan=3,
pady=10) # 文字标签的columnspan设置为3,会跨越3列
tk.Label(page).grid(row=0, column=0)
tk.Label(page, text='账号:').grid(row=1, column=1, pady=10)
tk.Entry(page, textvariable=username).grid(row=1, column=2)
tk.Label(page, text='密码:').grid(row=2, column=1, pady=10)
tk.Entry(page, textvariable=password).grid(row=2, column=2)
# 登录函数
def login():
name = username.get()
pwd = password.get()
if name == 'admin' and pwd == '123456':
messagebox.showinfo(title="提示", message='登录成功')
root.destroy() # 登录成功后关闭登录窗口
show_main_window() # 打开主界面
else:
messagebox.showwarning(title="提示", message='请检查账号密码是否正确')
tk.Button(page, text='立即登录', command=login).grid(row=3, column=1, pady=10)
tk.Button(page, text='安全退出', command=root.quit).grid(row=3, column=3, pady=10)
# 主循环
root.mainloop()
项目打包
pyinstaller