程序员梦见自己死了,被阎王爷拉去做个地府生死簿管理系统,基于pythonTK原生实现桌面客户端1.0版本!

2024-04-20 15:40:14 浏览数 (4)

缘起

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

1 人点赞