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

写在前面
刚开始学习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模块

最后放几张截图吧~

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值