写在前面
刚开始学习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模块
最后放几张截图吧~
主界面 ↓
录入信息↓
录入成功提示↓
显示信息↓
删除用户↓