【python】Tkinter通讯录

python通讯录

tkinter库,文件读写,面向对象等

一.前期准备
【python】Tkinter通讯录_第1张图片
1.功能:电话薄由登录窗口和主窗口等6个窗口组成,达成添加,删除,修改查询联系人电话的功能。
2.准备知识:面向对象、文件读写、python的tkinter库

二、代码及实例效果图
登录信息和电话信息为excel文件,以逗号文件格式保存
每个点作为一个py文件
1.登录窗口
(1)登录窗口上放有三个框架、用户名及密码的标签和入口文本框、ok按钮。通过写逗号文件将登录信息写入,正确输入后点击ok按钮可进入主界面。

import tkinter as tk #导入tkinter库
from tkinter import messagebox	#导入tkinter库中的自带弹窗
#import pickle
'''导入二进制文件操作'''
#import os
'''导入其他py文件
import os
os.system("python a.py")
'''
import csv	
'''导入逗号文件方法'''	
from mainWin import window2   #导入另一个py文件中的类
#定义窗口类,父类名为tk.Tk
class window1(tk.Tk):
    def __init__(self):
        super().__init__()    #先写继承语句,在定义窗口上组件
        self.resizable(0, 0)  #不能调整窗口大小
        self.title('login')
        self.geometry('400x200')
        frm1=tk.Frame(self)			#框架
        frm1.pack(expand=True)
        frm2 = tk.Frame(self)
        frm2.pack(expand=True)
        frm3 = tk.Frame(self)
        frm3.pack(expand=True)
        l1=tk.Label(frm1,text='name:',bg='red',width=5)		#标签
        l2=tk.Label(frm2,text='key:',bg='red',width=5)
        #l1.place(x=10,y=10)
        #l2.place(x=10,y=50)
        l1.pack(side='left')
        l2.pack(side='left')
        self.var1=tk.StringVar()		#定义字符串变量
        self.var2=tk.StringVar()
        e1=tk.Entry(frm1,show=None,textvariable=self.var1)		#入口文本框
        e2=tk.Entry(frm2,show=None,textvariable=self.var2)
        #e1.place(x=60,y=10)
        #e2.place(x=60,y=50)
        e1.pack(side='left',padx=3)
        e2.pack(side='left',padx=3)
        b = tk.Button(frm3, text='OK', command=self.ok)	#按钮
        #b.place(x=50, y=90)
        b.pack(side='left')
        #插入图片
        '''photo = tk.PhotoImage(file='e:/python2/python/二维码/乔巴.gif')
        Lab = tk.Label(self,text='123',compound='center', width=200, height=100, image=photo)
        Lab.pack()'''
        #读逗号文件
        with open("e:/python2/python/tkinter库/a.csv", "r") as f:
                self.reader = csv.reader(f)
                self.d=[self.row for self.row in self.reader]	
                '''每行自动以列表形式读出'''
                print(self.d)
    #定义按钮操作函数
    def ok(self):
        v1=self.var1.get()		
        v2=self.var2.get()
        c=[v1,v2]
        if c in self.d:
            tk.messagebox.showinfo(message='welcome!')
            self.destroy()
            w2= window2().mainloop()     #调用另一个py文件中的类
            #self.wait_window(w2)
        else:
            tk.messagebox.showerror(message='error!')
#实例化
if __name__=='__main__':
    w1=window1()
    w1.mainloop()

(2)例:以上代码中设置了三个登录账户:[a,111],[b,222],[c,333]
本立中输入[a,111],然后点击ok按钮,登录窗口销毁,进入主菜单窗口。
【python】Tkinter通讯录_第2张图片

2.主菜单窗口
(1)主菜单由一个文本框,滚动条,及四个按钮组成。点击按钮出现对应功能的窗口。

import tkinter as tk
#import pickle
#import os		
import csv
from add_ import addwin
from del_ import delwin
from search_ import searwin
from modify_ import  modwin
class window2(tk.Tk):
    def __init__(self):
        super().__init__()
        self.resizable(0, 0)
        self.title('main window')
        self.geometry('250x200')
        frm=tk.Frame(self)
        frm.pack()
        frm_l=tk.Frame(frm)
        frm_l.pack(side='left')
        frm_r=tk.Frame(frm)
        frm_r.pack(side='right')
        b1 = tk.Button(frm_r, text='add', width=8, height=2, command=self.add)
        b1.pack(pady=1)
        b2 = tk.Button(frm_r, text='del_', width=8, height=2, command=self.del_)
        b2.pack(pady=1)
        b3 = tk.Button(frm_r, text='modify', width=8, height=2, command=self.modify)
        b3.pack(pady=1)
        b4 = tk.Button(frm_r, text='search', width=8, height=2, command=self.search)
        b4.pack(pady=1)
        '''设置滚动条'''
        sb = tk.Scrollbar(frm_l)  '''可设置orient为滚动条的方向,vertical--纵向,hor -横向'''
        self.t = tk.Text(frm_l, width=20, height=12)
        sb.pack(side=tk.RIGHT, fill=tk.Y)	#放置滚动条
        sb.config(command=self.t.yview)		'''将滚动条放到text的y方向'''
        # self.t.config(yscrollcommand=sb.set)
        self.t.pack(side='right')
        self.f1()

    def f1(self):
        with open("e:/python2/python/tkinter库/b.csv", "r") as f:
            self.reader = csv.reader(f)
            self.d = [self.row for self.row in self.reader]
            for i in self.d:
                self.t.insert('end', i)
                self.t.insert('end', '\n')
    def add(self):
        add= addwin()
        self.wait_window(add)      #等待调用窗口完成功能,继续往下执行
        #i=[add.v1,add.v2]         #调用另一个py文件的变量
        #self.t.insert('end', i)
        #self.t.insert('end', '\n')
        self.t.delete(1.0, 'end')       #清空text中内容
        self.f1()
    def del_(self):
        del_=delwin()
        self.wait_window(del_)
        self.t.delete(1.0,'end')
        self.f1()
    def modify(self):
        mod=modwin()
        self.wait_window(mod)
        self.t.delete(1.0, 'end')
        self.f1()
    def search(self):
        sear= searwin()
        self.wait_window(sear)

(2)将逗号文件的内容嵌入文本框,初始有如上4个姓名及电话数据
【python】Tkinter通讯录_第3张图片
3.添加联系人窗口
(1)思路:
先追写逗号文件。
再调回主界面,清空文本框内容,并再次掉读逗号文件且嵌入 文本框的函数


import tkinter as tk
import pickle
import os
import csv
#from mainWin import window2
#父类为tk.Toplevel
'''
说明:
主窗类,继承了 tk.Tk
弹窗类,继承了 tk.Toplevel
要点:
弹窗,显式地保存父窗口,显式地修改父窗口数据,显式地更新父窗口部件,最后销毁弹窗
主窗,待弹窗运行后,通过wait_window方法,返回 None
'''
class addwin(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.resizable(0, 0)
        self.title('add window')
        self.geometry('250x150')
        l1=tk.Label(self,text='name:',bg='green',width=5)
        l2=tk.Label(self,text='tel:',bg='green',width=5)
        l1.place(x=10,y=10)
        l2.place(x=10,y=50)
        self.var1=tk.StringVar()
        self.var2=tk.StringVar()
        e1=tk.Entry(self,show=None,textvariable=self.var1)
        e2=tk.Entry(self,show=None,textvariable=self.var2)
        e1.place(x=60,y=10)
        e2.place(x=60,y=50)
        b1 = tk.Button(self, text='add', width=8, height=1, command=self.add)
        b1.place(x=40, y=90)
        b2 = tk.Button(self, text='cancel', width=8, height=1, command=self.cancel)
        b2.place(x=130, y=90)
    def add(self):
        self.v1 = self.var1.get()
        self.v2 = self.var2.get()
        data = [self.v1, self.v2]
        f1 = open("e:/python2/python/tkinter库/b.csv", "a", newline='')  #写逗号文件,追加
        csv_writer = csv.writer(f1)
        csv_writer.writerow(data)
        #window2().f1()
        self.destroy()
    def cancel(self):
        self.destroy()

(2)例:此窗口由姓名、电话的标签及入口文本框构成。点击添加,本窗口销毁,并将联系人加入主界面文本框。点击取消,窗口销毁。
如下图,将张三及其电话号码添加。
【python】Tkinter通讯录_第4张图片

4.删除联系人窗口
(1)思路:
先覆写逗号文件。
再调回主界面,清空文本框内容,并再次掉读逗号文件且嵌入 文本框的函数

import tkinter as tk
import pickle
import csv
class delwin(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.resizable(0, 0)
        self.title('del_ window')
        self.geometry('250x150')
        l1=tk.Label(self,text='name:',bg='blue',width=5)
        l2=tk.Label(self,text='tel:',bg='blue',width=5)
        l1.place(x=10,y=10)
        l2.place(x=10,y=50)
        self.var1=tk.StringVar()
        self.var2=tk.StringVar()
        e1=tk.Entry(self,show=None,textvariable=self.var1)
        e2=tk.Entry(self,show=None,textvariable=self.var2)
        e1.place(x=60,y=10)
        e2.place(x=60,y=50)
        b1 = tk.Button(self, text='del_', width=8, height=1, command=self.del_)
        b1.place(x=40, y=90)
        b2 = tk.Button(self, text='cancel', width=8, height=1, command=self.cancel)
        b2.place(x=130, y=90)
    def del_(self):
        self.v1 = self.var1.get()
        self.v2 = self.var2.get()
        with open("e:/python2/python/tkinter库/b.csv", "r") as f:
            self.reader = csv.reader(f)
            self.d = [self.row for self.row in self.reader]
            for i in self.d:
                #if self.v1 or self.v2 in i:
                if self.v1 in i or self.v2 in i:    #注意逻辑
                    self.d.remove(i)
        f1 = open("e:/python2/python/tkinter库/b.csv", "w", newline='')  #写逗号文件,覆盖重写
        csv_writer = csv.writer(f1)
        csv_writer.writerows(self.d)
        self.destroy()
    def cancel(self):
        self.destroy()

(2)例:此窗口由姓名、电话的标签及入口文本框构成。输入姓名或电话,点击删除,本窗口销毁,并删除主界面对应联系人。点击取消,窗口销毁。
如下图:输入a,主界面中将a及其电话一起删除。
【python】Tkinter通讯录_第5张图片
5.修改联系人窗口
(1)思路同上:
先覆写逗号文件。
再调回主界面,清空文本框内容,并再次掉读逗号文件且嵌入 文本框的函数

import tkinter as tk
import pickle
import csv
from tkinter import messagebox
class modwin(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.resizable(0, 0)
        self.title('modify window')
        self.geometry('250x205')
        l1=tk.Label(self,text='name:',bg='yellow',width=5)
        l2=tk.Label(self,text='tel:',bg='yellow',width=5)
        l1.place(x=10,y=10)
        l2.place(x=10,y=50)
        self.var1=tk.StringVar()
        self.var2=tk.StringVar()
        e1=tk.Entry(self,show=None,textvariable=self.var1)
        e2=tk.Entry(self,show=None,textvariable=self.var2)
        e1.place(x=60,y=10)
        e2.place(x=60,y=50)
        l3 = tk.Label(self, text='name_:', bg='yellow', width=5)
        l4 = tk.Label(self, text='tel_:', bg='yellow', width=5)
        l3.place(x=10, y=130)
        l4.place(x=10, y=170)
        self.var3 = tk.StringVar()
        self.var4 = tk.StringVar()
        e3= tk.Entry(self, show=None, textvariable=self.var3)
        e4= tk.Entry(self, show=None, textvariable=self.var4)
        e3.place(x=60, y=130)
        e4.place(x=60, y=170)

        b1 = tk.Button(self, text='modify', width=8, height=1, command=self.modify)
        b1.place(x=40, y=90)
        b2 = tk.Button(self, text='cancel', width=8, height=1, command=self.cancel)
        b2.place(x=130, y=90)
    def modify(self):
        self.v1= self.var1.get()
        self.v2= self.var2.get()
        self.v3= self.var3.get()
        self.v4= self.var4.get()
        with open("e:/python2/python/tkinter库/b.csv", "r") as f:
            self.reader = csv.reader(f)
            self.d = [self.row for self.row in self.reader]
            print(self.d)
            for i in self.d:
                if self.v1 in i or self.v2 in i:
                    x=self.d.index(i)
                    i=[self.v3,self.v4]
                    self.d[x]=i
                    print(self.d)
        f1 = open("e:/python2/python/tkinter库/b.csv", "w", newline='')
        csv_writer = csv.writer(f1)
        csv_writer.writerows(self.d)
        self.destroy()
    def cancel(self):
        self.destroy()

(2)例:此窗口由新旧姓名、电话的标签及入口文本框构成。输入旧姓名或旧电话,输入新姓名和电话,点击修改,并修改主界面对应联系人信息。点击取消,窗口销毁。
如下图,将b联系人信息修改为[bb,2222]
【python】Tkinter通讯录_第6张图片
6.查找联系人窗口
(1)思路:
先读逗号文件,再遍历逗号文件并将满足条件联系人信息嵌入下方文本框

import tkinter as tk
import pickle
import csv
from tkinter import messagebox
class searwin(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.resizable(0, 0)
        self.title('modify window')
        self.geometry('250x180')
        l1=tk.Label(self,text='name:',bg='white',width=5)
        l2=tk.Label(self,text='tel:',bg='white',width=5)
        l1.place(x=10,y=10)
        l2.place(x=10,y=50)
        self.var1=tk.StringVar()
        self.var2=tk.StringVar()
        e1=tk.Entry(self,show=None,textvariable=self.var1)
        e2=tk.Entry(self,show=None,textvariable=self.var2)
        e1.place(x=60,y=10)
        e2.place(x=60,y=50)
        b1 = tk.Button(self, text='search', width=8, height=1, command=self.modify)
        b1.place(x=40, y=90)
        b2 = tk.Button(self, text='cancel', width=8, height=1, command=self.cancel)
        b2.place(x=130, y=90)
        self.t=tk.Text(self,width=30,height=2)
        self.t.place(x=10,y=130)
    def modify(self):
        self.v1= self.var1.get()
        self.v2= self.var2.get()
        with open("e:/python2/python/tkinter库/b.csv", "r") as f:
            self.reader = csv.reader(f)
            self.d = [self.row for self.row in self.reader]
            print(self.d)
            for i in self.d:
                if self.v1 in i or self.v2 in i:
                    x=i
                    print(x)
                    self.t.delete(1.0, 'end')
                    self.t.insert('end',x)
    def cancel(self):
        self.destroy()

(2)例:此窗口由姓名、电话的标签及入口文本框、文本框构成。输入姓名或电话,点击搜索,搜索主界面联系人信息并嵌入文本框。点击取消,窗口销毁。
如下图,输入c,则c的电话信息出现在下方文本框
【python】Tkinter通讯录_第7张图片

通讯录知识总结

1.面向对象
(1)封装:
类变量 类名.xxx
成员变量 类内有效 self.xxx or 对象名(类名()).xxx
局部变量 函数内有效 变量名
init初始化
实例化 赋值:类外也可调用并改变成员变量 对象名(类名()).xxx
类外也可调用并改变类变量 类名.xxx
调用函数
(2)继承:
继成所有父类所有属性
people.init(self,n,a,w)
super(Dog,self).init(*args)
(3)多态:
覆写扩写
person.show(self)
抽象类:用于派生子类,子类必须覆写
不能实例化,
2.文件读写
(1)逗号文件CSV库
读:
写:
(2)二进制文件pickle库
读:
写:
(3)text文件
读:
写:
3.界面tkinter库
(1)创建窗口:
(2)标签,按钮:
(3)文本框,入口文本框:
(4)框架:

你可能感兴趣的:(python,pycharm,开发语言)