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模块

最后放几张截图吧~

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

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

请将下面这段代码中的每一行添加代码注释,并描述功能或者作用 from tkinter import * from tkinter import messagebox from pypylon import pylon from pypylon import genicam import tkinter as tk import serial import crcmod import traceback import cv2 as cv import numpy as np import glob import os import collections import datetime import math import requests import time import winsound import base64 import logging from binascii import a2b_hex import http import re import binascii from http import client from http import HTTPStatus import pickle as pkl import webbrowser import json import threading import queue import linecache import sys import pandas as pd import warnings warnings.filterwarnings("ignore") from pega_inference.v1.sample_client import SampleClient from pega_inference.v1.client.predict_enum import InferenceModelType from keras import backend as K #Sample code for pega-m2mSDK(multi logtype(Master, Vision)) from pega_m2m.m2m_v2 import M2M from pega_m2m.m2m_enum_v2 import M2MStr from pega_m2m import m2m_info #Sample code for Pega_DataCollector import os import shutil ###孪生网络 import tensorflow as tf from PIL import Image, ImageTk import siamese_KB import siamese_label import siamese_CPU import siamese_quyu model_KB = siamese_KB.Siamese() model_label = siamese_label.Siamese() model_CPU = siamese_CPU.Siamese() model_quyu = siamese_quyu.Siamese() ### ----------設置變數 test_status = '測試結果' Total_index = 0 FPY_index = 0 Fail_index = 0 Pass_index = 0 #获取当前时间 today = time.strftime('%Y-%m-%d',time.localtime()) def set_entered(value): global is_entered is_entered = value is_entered = False ### ----------sfis class Sfisws: def __init__(self, host=None, url=None): self.__programid = "TSP_ZDHSB" self.__pwd = "1mQ`@e" #_header為sfis xml上實際維護資料, 可查詢sfis function的xml檔案 self.__header = {"Content-type": "text/xml", "charset": "UTF-8", "Accept": "text/plain", "action":"http://www.pegatroncorp.com/SFISWebService/GetDatabaseInformation"} self.__host = host
最新发布
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值