赞
踩
一.前期准备
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按钮,登录窗口销毁,进入主菜单窗口。
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个姓名及电话数据
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)例:此窗口由姓名、电话的标签及入口文本框构成。点击添加,本窗口销毁,并将联系人加入主界面文本框。点击取消,窗口销毁。
如下图,将张三及其电话号码添加。
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及其电话一起删除。
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]
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的电话信息出现在下方文本框
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)框架:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。