前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员梦见自己死了,被阎王爷拉去做个地府生死簿管理系统,基于pythonTK原生实现桌面客户端1.0版本!

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

原创
作者头像
菜菜有点菜
修改2024-04-20 15:40:14
3420
修改2024-04-20 15:40:14
举报
文章被收录于专栏:白菜博客白菜博客

缘起

2019年圈子内有一个段子火了,因为赶进度,做项目996时间工作的程序员工作压力特别大,晚上睡觉的生活做了一个梦,梦见自己见阎王爷了,阎王爷让他为生死簿做个后台管理系统。

公司:听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员……

996程序员做的梦:

于是乎 就有了这篇文章!~~~

程序员还阳

项目进行中,程序员真的把系统做出来了,并且偷偷地在系统上留了一个后门,不仅回到了阳间,还将自己的寿命修改为+∞。

项目展示

生死簿可以看到阳寿未尽、孤魂野鬼、已经转世投胎人的名单。通过查询后台数据,我们发现,孙猴子不是物理删库,他是获取了阎王爷的超级管理员权限,直接把自己的名字,从生死簿中给删除了。

基于pythonTK原生实现桌面客户端1.0版本!使用列表字典嵌套组织数据对象

面向过程项目代码拆解

环境:py3.7

数据初始化前期准备

代码语言:python
复制
import tkinter as tk
from tkinter import messagebox
import pygame
from random import randint

全局变量初始化

代码语言:python
复制
# 初始化全局变量
shengsibooks = []
count = 0
image = None
gongdeText = None

# 临时存储 搜索回填的数据
user_data =  {"编号": None,"姓名": None, "性别": None, '年龄':None , "出生日期": None, "死亡日期": None, '生死状态': None, '因果报应': None}

# 初始化pygame.mixer
pygame.mixer.init()

生成模拟数据

代码语言:python
复制
# 生成生死簿数据
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
复制
# 登录界面
    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
复制
# 登录函数
    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
复制
# 显示主界面
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
复制
# 首页模块
def index(parent_frame):
    # 清空父框架中的内容
    for widget in parent_frame.winfo_children():
        widget.destroy()

    tk.Label(parent_frame, text='可视化大屏').pack()

添加

代码语言:python
复制
# 添加模块
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
复制
# 编辑模块
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
复制
# 搜索模块
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['姓名']}, \n\n年龄: {houzi['年龄']}, \n\n性别: {houzi['性别']}, \n\n出生日期: {houzi['出生日期']}, \n\n死亡日期: {houzi['死亡日期']}, \n\n生死状态: {houzi['生死状态']}, \n\n因果报应: {houzi['因果报应']}"
                # 在已有标签的位置更新文本内容
                tk.Label(parent_frame, text=label_text, pady=5).pack()
                return
        messagebox.showinfo(title="提示", message='未找到编号为' + id + '的用户')

删除

代码语言:python
复制
# 删除模块
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
复制
# 电子木鱼
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
复制
# 木鱼敲击声
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
复制
####################### 界面布局
# 首页模块
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
复制
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['姓名']}, \n\n年龄: {houzi['年龄']}, \n\n性别: {houzi['性别']}, \n\n出生日期: {houzi['出生日期']}, \n\n死亡日期: {houzi['死亡日期']}, \n\n生死状态: {houzi['生死状态']}, \n\n因果报应: {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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缘起
  • 程序员还阳
  • 项目展示
  • 基于pythonTK原生实现桌面客户端1.0版本!使用列表字典嵌套组织数据对象
  • 面向过程项目代码拆解
    • 数据初始化前期准备
      • 全局变量初始化
      • 生成模拟数据
    • 登录窗口绘制
      • 登录函数
        • 首页
          • 首页
            • 添加
              • 修改
                • 查询
                  • 删除
                  • 电子木鱼
                    • 事件方法
                      • 饼图
                      • 完整代码
                      • 项目打包
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档