1.Python自学之路-Tkinter/PIL/numpy/pickle/

使用Tkinter、pickle、numpy和PIL等库构建了一个个人信息管理系统,实现了用户信息的录入、显示和删除功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面
刚开始学习Tkinter,看了一些资料感觉还是自己动手能够学习的更快,所以有了下面的这个自己想出来的个人信息管理系统;
最开始只是想用tkinter的一些基本方法弄弄就算了,最后一发不可收拾,很多库函数都是重新查资料找的,用的不好,大家见笑~~
1.定义Tkinter主界面(包括3个按键);
2.根据3个按键创建对应函数的功能;
3.用pickle新建几个文件保存到文件中;
4.显示个人界面将这些数据显示出来,其中图像存储和显示用到了numpy,PIL;
5.删除个人信息用了Tkinter的Listbox方法
6.录入个人信息用到了filedialog
全部代码如下,第一次写这么长的代码

#coding=UTF-8
# __author__ = "晒晒小木桩"

import tkinter as tk
import pickle
import bisect
import os
from PIL import Image, ImageTk
from tkinter import filedialog
import numpy
from tkinter import messagebox

root = tk.Tk()
root.title("个人信息系统")
root.geometry("400x220")
root.resizable(0, 0)
photo = Image.open("Background.jpg")
photo_tk = ImageTk.PhotoImage(photo)
tk.Label(root,image=photo_tk).place(x=0,y=0)
personal_number = 0  #每次打开初始化显示第一个用户

#获取存放用户数据的数据库,保存到新列表(需要在执行文件根目录创建1个名为personal_info.pkl的文件)
if os.path.getsize("personal_info.pkl") > 0:
    with open("personal_info.pkl", "rb") as file:
        personal_info = pickle.load(file)
        file.close()
else:
    list_create = []
    with open("personal_info.pkl", "wb") as file:
        pickle.dump(list_create, file)
        file.close()

#------------------------------------------------------------------------------------------------------
def login():
    #新建录入窗口
    window_login=tk.Toplevel()
    window_login.title("录入信息")
    window_login.geometry("350x350")
    window_login.resizable(0,0)

    #新建个人信息标题
    tk.Label(window_login,text="姓名:", heigh=2).grid(row=0,column=0,sticky="E", ipadx=40, ipady=10)
    tk.Label(window_login,text="名族:", heigh=2).grid(row=1,column=0,sticky="E", ipadx=40, ipady=10)
    tk.Label(window_login, text="手机号:", heigh=2).grid(row=2,column=0,sticky="E", ipadx=40, ipady=10)
    tk.Label(window_login, text="身份证号:", heigh=2).grid(row=3,column=0,sticky="E", ipadx=40, ipady=10)

    #新建录入框
    e1 = tk.Entry(window_login)
    e1.grid(row=0, column=1)
    e2 = tk.Entry(window_login)
    e2.grid(row=1, column=1)
    e3 = tk.Entry(window_login)
    e3.grid(row=2, column=1)
    e4 = tk.Entry(window_login)
    e4.grid(row=3, column=1)
    e5 = tk.Entry(window_login)
    e5.grid(row=4, column=1)

    #新建添加照片的选项
    def photo_insert():
        global photo_array
        photo_path=tk.filedialog.askopenfilename(parent=window_login)
        e5.insert("end",photo_path)
    tk.Label(window_login,text="注:照片格式必须为.gif,大小为200x200").grid(row=6, column=0, columnspan=4, sticky="W", ipadx=40, ipady=10)
    tk.Button(window_login,text="请选择照片",command=photo_insert).grid(row=4, column=0)

    #执行按下确认按键后的操作
    def sure():
        global personal_info
        p5 = Image.open(e5.get())
        p6 = p5.convert("RGB")
        photo_array = numpy.asarray(p6)
        bisect.insort(personal_info, (e1.get(), e2.get(), e3.get(), e4.get(), photo_array))
        with open("personal_info.pkl", "wb") as file:
            pickle.dump(personal_info, file)
            file.close()
        e1.delete(0, "end")
        e2.delete(0, "end")
        e3.delete(0, "end")
        e4.delete(0, "end")
        e5.delete(0, "end")
        tk.messagebox.showinfo(title="录入成功", message="个人信息已经录入成功了!")

    #确认录入信息
    tk.Button(window_login, text="确认录入", command=sure).grid(row=5, column=0, columnspan=3)
#------------------------------------------------------------------------------------------------------
def information(): #显示个人信息
    #新建顶级窗口,不允许修改大小
    window_info=tk.Toplevel()
    window_info.title("个人信息")
    window_info.geometry("600x350")
    window_info.resizable(0,0)
    global personal_info
    global personal_number

    #新建个人信息Lable和下划线
    tk.Label(window_info, text="姓名:", heigh=2).grid(row=0, column=0, sticky="E", ipadx=40, ipady=10)
    tk.Label(window_info, text="名族:", heigh=2).grid(row=1, column=0, sticky="E", ipadx=40, ipady=10)
    tk.Label(window_info, text="手机号:", heigh=2).grid(row=2, column=0, sticky="E", ipadx=40, ipady=10)
    tk.Label(window_info, text="身份证号:", heigh=2).grid(row=3, column=0, sticky="E", ipadx=40, ipady=10)
    for i in range(4):
        can = tk.Canvas(window_info, width=150, heigh=40)
        infor_lab = can.create_line(0, 33, 150, 33, fill="black")
        can.grid(row=i, column=1)

    #定义按键后显示个人资料
    str1 = tk.StringVar()
    str2 = tk.StringVar()
    str3 = tk.StringVar()
    str4 = tk.StringVar()
    l1 = tk.Label(window_info, textvariable=str1)
    l1.grid(row=0, column=1)
    l2 = tk.Label(window_info, textvariable=str2)
    l2.grid(row=1, column=1)
    l3 = tk.Label(window_info, textvariable=str3)
    l3.grid(row=2, column=1)
    l4 = tk.Label(window_info, textvariable=str4)
    l4.grid(row=3, column=1)

    def print_info():
        global personal_number, personal_info
        str1.set(personal_info[personal_number][0])
        str2.set(personal_info[personal_number][1])
        str3.set(personal_info[personal_number][2])
        str4.set(personal_info[personal_number][3])
    print_info()

    #如果已经翻到最前面或者最后面有提示
    def detected(str):
        global personal_number
        if str == -1:
            tk.Label(window_info, text="已经是第一个了~~~").grid(row=4, column=0, columnspan=2, ipadx=40, ipady=20)
        if str == 1:
            tk.Label(window_info, text="已经是最后一个了~~~").grid(row=4, column=0, columnspan=2, ipadx=40, ipady=20)
        if str == 0:
            tk.Label(window_info, text="                    ").grid(row=4, column=0, columnspan=2, ipadx=40, ipady=20)
    detected(0)

    #按键后显示下一个人,判断是不是最后一个人
    def next():
        global personal_number
        if personal_number == len(personal_info)-1:
            detected(1)
            photo_display()
        else:
            detected(0)
            personal_number = personal_number + 1
            photo_display()
            print_info()

    #按键显示前一个人,判断是不是第一个人
    def last():
        global personal_number
        if personal_number == 0:
            detected(-1)
            photo_display()
        else:
            detected(0)
            personal_number = personal_number - 1
            photo_display()
            print_info()

    #创建上下翻按键
    tk.Button(window_info,text="上一页",command=last).grid(row=5,column=0,columnspan=2,ipadx=40)
    tk.Button(window_info,text="下一页",command=next).grid(row=5,column=2,columnspan=2,sticky="W",ipadx=40)

    #从数组中导入Tkinter可以显示的照片
    def photo_display():
        global p_tk, personal_number, personal_info
        p_array = personal_info[personal_number][4]
        p_show = Image.fromarray(p_array)
        p_tk = ImageTk.PhotoImage(p_show)
        ck = tk.Canvas(window_info, width=400, heigh=200)
        p1 = ck.create_image(150, 0, anchor='n', image=p_tk)
        ck.grid(row=0, column=2, rowspan=4)
    photo_display()
    window_info.mainloop()

#------------------------------------------------------------------------------------------------------
def delete():
    #定义可以删除个人信息的Listbox
    global personal_info
    delete_info = tk.Toplevel()
    var_str = tk.StringVar()
    list1 = tk.Listbox(delete_info)

    #把个人信息列表导入一个新列表
    new_list = []
    for x in personal_info:
        new_list.append(x)
        list1.insert("end", x[0])
        list1.pack()

    #删除当前选中的信息
    def dele():
        global personal_info,personal_number
        list_number=list1.index(list1.curselection())
        new_list.remove(new_list[list_number])
        personal_number = 0
        list1.delete(list_number)
        with open("personal_info.pkl", "wb") as file:
            personal_info=new_list
            pickle.dump(new_list, file)
            file.close()

    #删除全部信息
    def dele_all():
        global personal_info,personal_number
        personal_number = 0
        new_list = []
        list1.delete(0,"end")
        with open("personal_info.pkl", "wb") as file:
            personal_info=new_list
            pickle.dump(new_list, file)
            file.close()

    tk.Button(delete_info,text="删除",command=dele).pack()
    tk.Button(delete_info,text="删除全部",command=dele_all).pack()
    delete_info.mainloop()

#设置顶级按键窗口
tk.Label(root, text="个 人 信 息 系 统", font=("微软雅黑",10), bg="green").place(x=150, y=10)
tk.Button(root, text="录入", command=login, width=10).place(x=160, y=75)
tk.Button(root, text="查看", command=information, width=10).place(x=160, y=125)
tk.Button(root, text="删除", command=delete, width=10).place(x=160, y=175)
root.mainloop()

上面代码部分参考了很多人的文章,全部列表如下,谢谢大家~~~
1.Tkinter讲解
2.图片保存为RGB
3.Numpy介绍
4.PIL和Numpy
5.OS模块

最后放几张截图吧~

主界面 ↓
主界面
录入信息↓
录入信息
录入成功提示↓
录入成功提示
显示信息↓

显示信息删除用户↓
删除用户

Microsoft Windows [版本 10.0.19045.5608] (c) Microsoft Corporation。保留所有权利。 F:\789>BUILD_EXE.PY 正在准备构建环境... 安装依赖... Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Requirement already satisfied: pandas in d:\python\py3.13\lib\site-packages (2.3.0) Requirement already satisfied: openpyxl in d:\python\py3.13\lib\site-packages (3.1.5) Requirement already satisfied: tabulate in d:\python\py3.13\lib\site-packages (0.9.0) Requirement already satisfied: pyinstaller in d:\python\py3.13\lib\site-packages (6.14.1) Requirement already satisfied: pillow in d:\python\py3.13\lib\site-packages (11.2.1) Collecting tkinterdnd2 Downloading https://mirrors.aliyun.com/pypi/packages/08/c3/e04f004a53c00dc01126b6f998264cef672c6883c36aa4bd65845a8eb4c0/tkinterdnd2-0.4.3-py3-none-any.whl (493 kB) Requirement already satisfied: numpy>=1.26.0 in d:\python\py3.13\lib\site-packages (from pandas) (2.3.1) Requirement already satisfied: python-dateutil>=2.8.2 in d:\python\py3.13\lib\site-packages (from pandas) (2.9.0.post0) Requirement already satisfied: pytz>=2020.1 in d:\python\py3.13\lib\site-packages (from pandas) (2025.2) Requirement already satisfied: tzdata>=2022.7 in d:\python\py3.13\lib\site-packages (from pandas) (2025.2) Requirement already satisfied: et-xmlfile in d:\python\py3.13\lib\site-packages (from openpyxl) (2.0.0) Requirement already satisfied: setuptools>=42.0.0 in d:\python\py3.13\lib\site-packages (from pyinstaller) (80.9.0) Requirement already satisfied: altgraph in d:\python\py3.13\lib\site-packages (from pyinstaller) (0.17.4) Requirement already satisfied: pefile!=2024.8.26,>=2022.5.30 in d:\python\py3.13\lib\site-packages (from pyinstaller) (2023.2.7) Requirement already satisfied: pywin32-ctypes>=0.2.1 in d:\python\py3.13\lib\site-packages (from pyinstaller) (0.2.3) Requirement already satisfied: pyinstaller-hooks-contrib>=2025.4 in d:\python\py3.13\lib\site-packages (from pyinstaller) (2025.5) Requirement already satisfied: packaging>=22.0 in d:\python\py3.13\lib\site-packages (from pyinstaller) (25.0) Requirement already satisfied: six>=1.5 in d:\python\py3.13\lib\site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0) Installing collected packages: tkinterdnd2 Successfully installed tkinterdnd2-0.4.3 应用图标已创建 开始打包... 6173 INFO: PyInstaller: 6.14.1, contrib hooks: 2025.5 6173 INFO: Python: 3.13.3 6209 INFO: Platform: Windows-10-10.0.19045-SP0 6209 INFO: Python environment: D:\python\py3.13 6211 INFO: wrote F:\789\TableToMD.spec 6214 INFO: Removing temporary files and cleaning cache in C:\Users\0\AppData\Local\pyinstaller 6216 INFO: Module search paths (PYTHONPATH): ['F:\\789', 'D:\\python\\py3.13\\python313.zip', 'D:\\python\\py3.13\\DLLs', 'D:\\python\\py3.13\\Lib', 'D:\\python\\py3.13', 'D:\\python\\py3.13\\Lib\\site-packages', 'D:\\python\\py3.13\\Lib\\site-packages\\setuptools\\_vendor', 'F:\\789'] 7096 INFO: Appending 'datas' from .spec 7096 INFO: checking Analysis 7097 INFO: Building Analysis because Analysis-00.toc is non existent 7097 INFO: Running Analysis Analysis-00.toc 7097 INFO: Target bytecode optimization level: 0 7098 INFO: Initializing module dependency graph... 7099 INFO: Initializing module graph hook caches... 7137 INFO: Analyzing modules for base_library.zip ... 8830 INFO: Processing standard module hook 'hook-heapq.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 9191 INFO: Processing standard module hook 'hook-encodings.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 11186 INFO: Processing standard module hook 'hook-pickle.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 12917 INFO: Caching module dependency graph... 12954 INFO: Looking for Python shared library... 12974 INFO: Using Python shared library: D:\python\py3.13\python313.dll 12975 INFO: Analyzing F:\789\table_to_md.py 13040 INFO: Processing standard module hook 'hook-pandas.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 15345 INFO: Processing standard module hook 'hook-platform.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 15455 INFO: Processing standard module hook 'hook-sysconfig.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 15522 INFO: Processing standard module hook 'hook-numpy.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 16434 INFO: Processing standard module hook 'hook-difflib.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 16776 INFO: Processing standard module hook 'hook-multiprocessing.util.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 17001 INFO: Processing standard module hook 'hook-xml.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 19675 INFO: Processing pre-safe-import-module hook 'hook-typing_extensions.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\pre_safe_import_module' 19689 INFO: SetuptoolsInfo: initializing cached setuptools info... 24695 INFO: Processing standard module hook 'hook-charset_normalizer.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 25329 INFO: Processing standard module hook 'hook-pytz.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 28322 INFO: Processing standard module hook 'hook-pandas.io.formats.style.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 30856 INFO: Processing standard module hook 'hook-pandas.plotting.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 31746 INFO: Processing standard module hook 'hook-openpyxl.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 31993 INFO: Processing standard module hook 'hook-lxml.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 32622 INFO: Processing standard module hook 'hook-lxml.etree.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 32885 INFO: Processing standard module hook 'hook-xml.etree.cElementTree.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 33332 INFO: Processing standard module hook 'hook-PIL.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 33454 INFO: Processing standard module hook 'hook-PIL.Image.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 34198 INFO: Processing standard module hook 'hook-PIL.ImageFilter.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 35938 INFO: Processing standard module hook 'hook-sqlite3.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 36474 INFO: Processing standard module hook 'hook-pandas.io.clipboard.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 36845 INFO: Processing standard module hook 'hook-dateutil.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 37119 INFO: Processing pre-safe-import-module hook 'hook-six.moves.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\pre_safe_import_module' 37549 INFO: Processing standard module hook 'hook-xml.dom.domreg.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 38305 INFO: Processing pre-find-module-path hook 'hook-tkinter.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\pre_find_module_path' 38309 INFO: TclTkInfo: initializing cached Tcl/Tk info... 38898 INFO: Processing standard module hook 'hook-_tkinter.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 38996 INFO: Processing standard module hook 'hook-tkinterdnd2.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 39036 INFO: Analyzing hidden import 'xlwt' 39037 ERROR: Hidden import 'xlwt' not found 39038 INFO: Processing module hooks (post-graph stage)... 39258 INFO: Processing standard module hook 'hook-lxml.isoschematron.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 39283 WARNING: Hidden import "jinja2" not found! 39592 INFO: Processing standard module hook 'hook-PIL.SpiderImagePlugin.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 39653 INFO: Processing standard module hook 'hook-_tkinter.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks' 39655 INFO: Processing standard module hook 'hook-lxml.objectify.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks' 39673 INFO: Performing binary vs. data reclassification (1560 entries) 40208 INFO: Looking for ctypes DLLs 40268 INFO: Analyzing run-time hooks ... 40273 INFO: Including run-time hook 'pyi_rth_inspect.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks' 40282 INFO: Including run-time hook 'pyi_rth_pkgutil.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks' 40285 INFO: Including run-time hook 'pyi_rth_multiprocessing.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks' 40287 INFO: Including run-time hook 'pyi_rth__tkinter.py' from 'D:\\python\\py3.13\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks' 40338 INFO: Creating base_library.zip... 40379 INFO: Looking for dynamic libraries 41975 INFO: Extra DLL search directories (AddDllDirectory): ['D:\\python\\py3.13\\Lib\\site-packages\\numpy.libs', 'D:\\python\\py3.13\\Lib\\site-packages\\pandas.libs'] 41975 INFO: Extra DLL search directories (PATH): [] 44927 INFO: Warnings written to F:\789\build\TableToMD\warn-TableToMD.txt 45012 INFO: Graph cross-reference written to F:\789\build\TableToMD\xref-TableToMD.html 45081 INFO: checking PYZ 45082 INFO: Building PYZ because PYZ-00.toc is non existent 45082 INFO: Building PYZ (ZlibArchive) F:\789\build\TableToMD\PYZ-00.pyz 46228 INFO: Building PYZ (ZlibArchive) F:\789\build\TableToMD\PYZ-00.pyz completed successfully. 46332 INFO: checking PKG 46332 INFO: Building PKG because PKG-00.toc is non existent 46333 INFO: Building PKG (CArchive) TableToMD.pkg 56140 INFO: Building PKG (CArchive) TableToMD.pkg completed successfully. 56162 INFO: Bootloader D:\python\py3.13\Lib\site-packages\PyInstaller\bootloader\Windows-64bit-intel\run.exe 56162 INFO: checking EXE 56163 INFO: Building EXE because EXE-00.toc is non existent 56163 INFO: Building EXE from EXE-00.toc 56163 INFO: Copying bootloader EXE to F:\789\dist\TableToMD.exe 56203 INFO: Copying icon to EXE 56210 INFO: Copying 0 resources to EXE 56210 INFO: Embedding manifest in EXE 56217 INFO: Appending PKG archive to EXE 56278 INFO: Fixing EXE headers 56752 INFO: Building EXE from EXE-00.toc completed successfully. 56774 INFO: Build complete! The results are available in: F:\789\dist 构建完成! EXE文件在 dist 目录中 运行 TableToMD.exe 启动程序 为什么启动程序没有应用界面呢?
最新发布
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值