一,案例描述
实现GUI界面下学生添加功能的实现
1. 指定 学号,姓名,性别,手机号码,邮箱地址的输入
2. 完成功能的实现并绑定提交按钮
3. 将添加的学生信息写入到文件
4. 通过上述案例分别用 类方法 / 实例方法 / 静态方法 三种方式实现相同的案例
二,类方法的实现
1. 类方法特点:
1. 类方法前要使用关键字@classmethod
2. 方法中不能使用self,要使用cls
3. 类方法能够访问到类变量但是无法访问到实例变量跟实例方法
4. 调用要通过"类名.方法名"来访问.
5. 类方法存储在类空间中,没有绑定到对象
2. 代码实现:
(1)GUI_类
from tkinter import *
importtkinter.ttk as ttkfrom tkinter.messagebox import *
from GUI_类方法案例.add_student importAdd_studentclassAdd_Student(Tk):#类变量
file_path = R"C:\Users\Administrator\PycharmProjects\untitled1\GUI_类方法案例\resource\test01.txt"input_data= [] #存储输入的每个元素存入列表
def __init__(self):
super().__init__()
self.title("添加学生信息")
self.geometry("450x430+170+60")
self.resizable(0, 0)
self["bg"] = "lightblue"
#自动添加界面
self.setUp_UI()defsetUp_UI(self):
self.Style01=ttk.Style()
self.Style01.configure("TLabel",foreground = "RoyalBlue")
self.Style01.configure("TButton",font = ("微软雅黑",16,"bold"),foreground = "RoyalBlue")
self.label01= ttk.Label(self,text ="学号:",font = ("微软雅黑",16,"bold"))
self.label01.place(x=80,y=80)
self.var_no=StringVar()
self.entry01= ttk.Entry(self,textvariable =self.var_no,font = ("微软雅黑",16,"bold"))
self.entry01.place(x=150,y=80,width = 120)
self.label02= ttk.Label(self,text ="姓名:",font = ("微软雅黑",16,"bold"))
self.label02.place(x=80,y=140)
self.var_name=StringVar()
self.entry02= ttk.Entry(self,textvariable =self.var_name,font = ("微软雅黑",16,"bold"))
self.entry02.place(x=150,y=140,width = 120)
self.label03= ttk.Label(self,text ="性别:",font = ("微软雅黑",16,"bold"))
self.label03.place(x=80,y=200)
self.var_genter=StringVar()
self.entry03= ttk.Entry(self,textvariable =self.var_genter,font = ("微软雅黑",16,"bold"))
self.entry03.place(x=150,y=200,width = 120)
self.label04= ttk.Label(self,text ="手机号码:",font = ("微软雅黑",16,"bold"))
self.label04.place(x=40,y=260)
self.var_mobile=StringVar()
self.entry04= ttk.Entry(self,textvariable =self.var_mobile,font = ("微软雅黑",16,"bold"))
self.entry04.place(x=150,y=260,width = 240)
self.label05= ttk.Label(self,text ="邮箱地址:",font = ("微软雅黑",16,"bold"))
self.label05.place(x=40,y=310)
self.var_email=StringVar()
self.entry05= ttk.Entry(self,textvariable =self.var_email,font = ("微软雅黑",16,"bold"))
self.entry05.place(x=150,y=310,width = 240)
self.submit= ttk.Button(self,text = "提交",style = "TButton",command =self.check_input)
self.submit.place(x=280,y=360,width = 100)defcheck_input(self):"""判断输入是否合规
:return:"""
#1. 获取所有输入的值
stu_no =self.var_no.get()
stu_name=self.var_name.get()
stu_genter=self.var_genter.get()
stu_mobile=self.var_mobile.get()
stu_email=self.var_email.get()#2. 把输入的值存入类变量list中
Add_Student.input_data.append(stu_no)
Add_Student.input_data.append(stu_name)
Add_Student.input_data.append(stu_genter)
Add_Student.input_data.append(stu_mobile)
Add_Student.input_data.append(stu_email)#3.实例化Add_student类
current =Add_student(stu_no,stu_name,stu_genter,stu_mobile,stu_email)#4.通过实例化,判断check_all()方法中的每一项输入是否合规
check_result = Add_student.check_all() #类名.类方法名 (这里的Add_student是类方法案例中的)
if check_result == 1:
showinfo("系统消息","学号不符合要求.【要求:95开头的6位数字】")elif check_result == 2:
showinfo("系统消息", "姓名不符合要求.【要求:2-10个汉字】")elif check_result == 3:
showinfo("系统消息", "性别不符合要求.【要求:只能填写男或女】")elif check_result == 4:
showinfo("系统消息", "手机号码不符合要求.【要求:11位数字】")elif check_result == 5:
showinfo("系统消息", "邮箱不符合要求.")else:#如果符合要求将输入的数据写入到文件.并关闭窗口
with open(Add_Student.file_path,mode="w",encoding="UTF-8") as fd:
fd.write("")
with open(Add_Student.file_path,mode="a",encoding="UTF-8") as fd:for item inAdd_Student.input_data:
temp= item + " "fd.write(temp)
showinfo("系统消息","文件添加成功!")
self.close_window()defclose_window(self):
self.destroy()
add_stu_gui.py
(2)add_Student 类
importreclassAdd_student():"""类方法特点: 1.类方法前要使用关键字@classmethod
2. 方法中不能使用self,要使用cls
3. 类方法能够访问到类变量但是无法访问到实例变量跟实例方法
4. 调用要通过"类名.方法名"来访问
5. 类方法存储在类空间中,没有绑定到对象"""no= "" #类变量
name = "" #类变量
genter = "" #类变量
mobile = "" #类变量
email = "" #类变量
def __init__(self,stu_no:str,stu_name:str,stu_gender:str,stu_mobile:str,stu_email:str):
Add_student.no=stu_no
Add_student.name=stu_name
Add_student.genter=stu_gender
Add_student.mobile=stu_mobile
Add_student.email=stu_email#自动运行
self.check_all()
@classmethoddefcheck_stuno(cls):#校验输入的学号是否合规
partten = re.compile(R"^95\d{4}$") #学号为95开头的6位数字
match_result =partten.match(cls.no)if match_result isNone:returnFalseelse:returnTrue
@classmethoddefcheck_stuname(cls):#校验输入的姓名是否合规
if len(cls.name.strip())>=2 and len(cls.name.strip())<=10: #判断输入字符串的长度是否在2-10之间(去除空格)
#如果在范围中再判断输入是否为汉字
for index inrange(len(cls.name.strip())):if cls.name[index] < "\u4E00" or cls.name[index] > "\u9FA5": #如果输入不在汉字asc码范围中则不是汉子
returnFalseif index == len(cls.name.strip()) -1:returnTrueelse:returnFalse
@classmethoddefcheck_stugenter(cls):#如果输入包含在 ["男","女"]中则为真,反之为假
if cls.genter.strip() in ["男","女"]:returnTrueelse:returnFalse
@classmethoddefcheck_stumobile(cls):#同上通过正则匹配11位数字,如果输入11数字则为真,反之为假
partten = re.compile(R"^[1][35789]\d{9}$") #学号为95开头的6位数字
match_result =partten.match(cls.mobile)if match_result isNone:returnFalseelse:returnTrue
@classmethoddefcheck_stuemail(cls):#同上。只是正则匹配的是邮箱地址而已
partten = re.compile(R"^(\w)+(.\w+)*@(\w)+((.\w+)+)$") #学号为95开头的6位数字
match_result =partten.match(cls.email)if match_result isNone:returnFalseelse:returnTrue
@classmethoddefcheck_all(cls):#把情况细化。分别定义学号,姓名,性别,手机号码,邮箱地址为几。便于获取判断
if notcls.check_stuno():return 1
elif notcls.check_stuname():return 2
elif notcls.check_stugenter():return 3
elif notcls.check_stumobile():return 4
elif notcls.check_stuemail():return 5
else:return 0
add_student.py
(3)start_app类
from GUI_类方法案例.add_stu_gui importAdd_Studentif __name__ == "__main__":
show_gui=Add_Student()
show_gui.mainloop()
start_app.py
三,静态方法的实现
1. 静态方法特点:
1. 静态方法前要使用关键字@staticmethod
2. 静态方法中不能使用任何资源(类变量,实例变量都不能使用)(cls,self不能使用)
3. 调用要通过"类名.方法名"来访问
4. 静态类方法存储在类空间中
5. 静态方法相当于一个工具拿来即用
2. 代码实现:
(1)GUI_类
from tkinter import *
importtkinter.ttk as ttkfrom tkinter.messagebox import *
from GUI_静态方法案例.add_student importAdd_studentclassAdd_Student(Tk):#类变量
file_path = R"C:\Users\Administrator\PycharmProjects\untitled1\GUI_静态方法案例\resource\test01.txt"input_data= [] #存储输入的每个元素存入列表
def __init__(self):
super().__init__()
self.title("添加学生信息")
self.geometry("450x430+170+60")
self.resizable(0, 0)
self["bg"] = "lightblue"
#自动添加界面
self.setUp_UI()defsetUp_UI(self):
self.Style01=ttk.Style()
self.Style01.configure("TLabel",foreground = "RoyalBlue")
self.Style01.configure("TButton",font = ("微软雅黑",16,"bold"),foreground = "RoyalBlue")
self.label01= ttk.Label(self,text ="学号:",font = ("微软雅黑",16,"bold"))
self.label01.place(x=80,y=80)
self.var_no=StringVar()
self.entry01= ttk.Entry(self,textvariable =self.var_no,font = ("微软雅黑",16,"bold"))
self.entry01.place(x=150,y=80,width = 120)
self.label02= ttk.Label(self,text ="姓名:",font = ("微软雅黑",16,"bold"))
self.label02.place(x=80,y=140)
self.var_name=StringVar()
self.entry02= ttk.Entry(self,textvariable =self.var_name,font = ("微软雅黑",16,"bold"))
self.entry02.place(x=150,y=140,width = 120)
self.label03= ttk.Label(self,text ="性别:",font = ("微软雅黑",16,"bold"))
self.label03.place(x=80,y=200)
self.var_genter=StringVar()
self.entry03= ttk.Entry(self,textvariable =self.var_genter,font = ("微软雅黑",16,"bold"))
self.entry03.place(x=150,y=200,width = 120)
self.label04= ttk.Label(self,text ="手机号码:",font = ("微软雅黑",16,"bold"))
self.label04.place(x=40,y=260)
self.var_mobile=StringVar()
self.entry04= ttk.Entry(self,textvariable =self.var_mobile,font = ("微软雅黑",16,"bold"))
self.entry04.place(x=150,y=260,width = 240)
self.label05= ttk.Label(self,text ="邮箱地址:",font = ("微软雅黑",16,"bold"))
self.label05.place(x=40,y=310)
self.var_email=StringVar()
self.entry05= ttk.Entry(self,textvariable =self.var_email,font = ("微软雅黑",16,"bold"))
self.entry05.place(x=150,y=310,width = 240)
self.submit= ttk.Button(self,text = "提交",style = "TButton",command =self.check_input)
self.submit.place(x=280,y=360,width = 100)defcheck_input(self):"""判断输入是否合规
:return:"""
#1. 获取所有输入的值
stu_no =self.var_no.get()
stu_name=self.var_name.get()
stu_genter=self.var_genter.get()
stu_mobile=self.var_mobile.get()
stu_email=self.var_email.get()#2. 把输入的值存入类变量list中
Add_Student.input_data.append(stu_no)
Add_Student.input_data.append(stu_name)
Add_Student.input_data.append(stu_genter)
Add_Student.input_data.append(stu_mobile)
Add_Student.input_data.append(stu_email)if notAdd_student.check_stuno(stu_no):
showinfo("系统消息", "学号不符合要求.【要求:95开头的6位数字】")elif notAdd_student.check_stuname(stu_name):
showinfo("系统消息", "姓名不符合要求.【要求:2-10个汉字】")elif notAdd_student.check_stugenter(stu_genter):
showinfo("系统消息", "性别不符合要求.【要求:只能填写男或女】")elif notAdd_student.check_stumobile(stu_mobile):
showinfo("系统消息", "手机号码不符合要求.【要求:11位数字】")elif notAdd_student.check_stuemail(stu_email):
showinfo("系统消息", "邮箱不符合要求.")else:#如果符合要求将输入的数据写入到文件.并关闭窗口
with open(Add_Student.file_path, mode="w", encoding="UTF-8") as fd:
fd.write("")
with open(Add_Student.file_path, mode="a", encoding="UTF-8") as fd:for item inAdd_Student.input_data:
temp= item + " "fd.write(temp)
showinfo("系统消息", "文件添加成功!")
self.close_window()defclose_window(self):
self.destroy()
add_stu_gui.py
(2)add_Student 类
importreclassAdd_student():"""静态方法特点: 1.静态方法前要使用关键字@staticmethod
2. 静态方法中不能使用任何资源(类变量,实例变量都不能使用)(cls,self不能使用)
3. 调用要通过"类名.方法名"来访问
4. 静态类方法存储在类空间中
5. 静态方法相当于一个工具拿来即用"""@staticmethoddefcheck_stuno(no):#校验输入的学号是否合规
partten = re.compile(R"^95\d{4}$") #学号为95开头的6位数字
match_result =partten.match(no)if match_result isNone:returnFalseelse:returnTrue
@staticmethoddefcheck_stuname(name):#校验输入的姓名是否合规
if len(name.strip())>=2 and len(name.strip())<=10: #判断输入字符串的长度是否在2-10之间(去除空格)
#如果在范围中再判断输入是否为汉字
for index inrange(len(name.strip())):if name[index] < "\u4E00" or name[index] > "\u9FA5": #如果输入不在汉字asc码范围中则不是汉子
returnFalseif index == len(name.strip()) -1:returnTrueelse:returnFalse
@staticmethoddefcheck_stugenter(genter):#如果输入包含在 ["男","女"]中则为真,反之为假
if genter.strip() in ["男","女"]:returnTrueelse:returnFalse
@staticmethoddefcheck_stumobile(mobile):#同上通过正则匹配11位数字,如果输入11数字则为真,反之为假
partten = re.compile(R"^[1][35789]\d{9}$") #学号为95开头的6位数字
match_result =partten.match(mobile)if match_result isNone:returnFalseelse:returnTrue
@staticmethoddefcheck_stuemail(email):#同上。只是正则匹配的是邮箱地址而已
partten = re.compile(R"^(\w)+(.\w+)*@(\w)+((.\w+)+)$") #学号为95开头的6位数字
match_result =partten.match(email)if match_result isNone:returnFalseelse:return True
add_student.py
(3)start_app 类
from GUI_静态方法案例.add_stu_gui importAdd_Studentif __name__ == "__main__":
show_gui=Add_Student()
show_gui.mainloop()
start_app.py
四,实例方法的实现
1. 实例方法特点:
1. 实例方法创建关键字使用的是self
2. 调用通过实例化过后类名.方法名来访问,也可以通过对象名.方法名来访问.(推荐: 对象名.方法名)
3. 实例方法每实例化一次band一次地址给对象(对象只是通过地址来访问实例方法)
4. 实例变量不同.每实例化一次开辟一块内存空间给对象
2. 代码实现:
(1)GUI_类
from tkinter import *
importtkinter.ttk as ttkfrom tkinter.messagebox import *
from GUI_实例方法案例.add_student importAdd_studentclassAdd_Student(Tk):#类变量
file_path = R"C:\Users\Administrator\PycharmProjects\untitled1\GUI_实例方法案例\resource\test01.txt"input_data= [] #存储输入的每个元素存入列表
def __init__(self):
super().__init__()
self.title("添加学生信息")
self.geometry("450x430+170+60")
self.resizable(0, 0)
self["bg"] = "lightblue"
#自动添加界面
self.setUp_UI()defsetUp_UI(self):
self.Style01=ttk.Style()
self.Style01.configure("TLabel",foreground = "RoyalBlue")
self.Style01.configure("TButton",font = ("微软雅黑",16,"bold"),foreground = "RoyalBlue")
self.label01= ttk.Label(self,text ="学号:",font = ("微软雅黑",16,"bold"))
self.label01.place(x=80,y=80)
self.var_no=StringVar()
self.entry01= ttk.Entry(self,textvariable =self.var_no,font = ("微软雅黑",16,"bold"))
self.entry01.place(x=150,y=80,width = 120)
self.label02= ttk.Label(self,text ="姓名:",font = ("微软雅黑",16,"bold"))
self.label02.place(x=80,y=140)
self.var_name=StringVar()
self.entry02= ttk.Entry(self,textvariable =self.var_name,font = ("微软雅黑",16,"bold"))
self.entry02.place(x=150,y=140,width = 120)
self.label03= ttk.Label(self,text ="性别:",font = ("微软雅黑",16,"bold"))
self.label03.place(x=80,y=200)
self.var_genter=StringVar()
self.entry03= ttk.Entry(self,textvariable =self.var_genter,font = ("微软雅黑",16,"bold"))
self.entry03.place(x=150,y=200,width = 120)
self.label04= ttk.Label(self,text ="手机号码:",font = ("微软雅黑",16,"bold"))
self.label04.place(x=40,y=260)
self.var_mobile=StringVar()
self.entry04= ttk.Entry(self,textvariable =self.var_mobile,font = ("微软雅黑",16,"bold"))
self.entry04.place(x=150,y=260,width = 240)
self.label05= ttk.Label(self,text ="邮箱地址:",font = ("微软雅黑",16,"bold"))
self.label05.place(x=40,y=310)
self.var_email=StringVar()
self.entry05= ttk.Entry(self,textvariable =self.var_email,font = ("微软雅黑",16,"bold"))
self.entry05.place(x=150,y=310,width = 240)
self.submit= ttk.Button(self,text = "提交",style = "TButton",command =self.check_input)
self.submit.place(x=280,y=360,width = 100)defcheck_input(self):"""判断输入是否合规
:return:"""
#1. 获取所有输入的值
stu_no =self.var_no.get()
stu_name=self.var_name.get()
stu_genter=self.var_genter.get()
stu_mobile=self.var_mobile.get()
stu_email=self.var_email.get()#2. 把输入的值存入类变量list中
Add_Student.input_data.append(stu_no)
Add_Student.input_data.append(stu_name)
Add_Student.input_data.append(stu_genter)
Add_Student.input_data.append(stu_mobile)
Add_Student.input_data.append(stu_email)#3.实例化Add_student类
current =Add_student(stu_no,stu_name,stu_genter,stu_mobile,stu_email)#4.通过实例化,判断check_all()方法中的每一项输入是否合规
check_result =current.check_all()if check_result == 1:
showinfo("系统消息","学号不符合要求.【要求:95开头的6位数字】")elif check_result == 2:
showinfo("系统消息", "姓名不符合要求.【要求:2-10个汉字】")elif check_result == 3:
showinfo("系统消息", "性别不符合要求.【要求:只能填写男或女】")elif check_result == 4:
showinfo("系统消息", "手机号码不符合要求.【要求:11位数字】")elif check_result == 5:
showinfo("系统消息", "邮箱不符合要求.")else:#如果符合要求将输入的数据写入到文件.并关闭窗口
with open(Add_Student.file_path,mode="w",encoding="UTF-8") as fd:
fd.write("")
with open(Add_Student.file_path,mode="a",encoding="UTF-8") as fd:for item inAdd_Student.input_data:
temp= item + " "fd.write(temp)
showinfo("系统消息","文件添加成功!")
self.close_window()defclose_window(self):
self.destroy()
add_stu_gui.py
(2)add_Student 类
importreclassAdd_student():def __init__(self,stu_no:str,stu_name:str,stu_gender:str,stu_mobile:str,stu_email:str):
self.no=stu_no
self.name=stu_name
self.genter=stu_gender
self.mobile=stu_mobile
self.email=stu_email#自动运行
self.check_all()defcheck_stuno(self):#校验输入的学号是否合规
partten = re.compile(R"^95\d{4}$") #学号为95开头的6位数字
match_result =partten.match(self.no)if match_result isNone:returnFalseelse:returnTruedefcheck_stuname(self):#校验输入的姓名是否合规
if len(self.name.strip())>=2 and len(self.name.strip())<=10: #判断输入字符串的长度是否在2-10之间(去除空格)
#如果在范围中再判断输入是否为汉字
for index inrange(len(self.name.strip())):if self.name[index] < "\u4E00" or self.name[index] > "\u9FA5": #如果输入不在汉字asc码范围中则不是汉子
returnFalseif index == len(self.name.strip()) -1:returnTrueelse:returnFalsedefcheck_stugenter(self):#如果输入包含在 ["男","女"]中则为真,反之为假
if self.genter.strip() in ["男","女"]:returnTrueelse:returnFalsedefcheck_stumobile(self):#同上通过正则匹配11位数字,如果输入11数字则为真,反之为假
partten = re.compile(R"^[1][35789]\d{9}$") #学号为95开头的6位数字
match_result =partten.match(self.mobile)if match_result isNone:returnFalseelse:returnTruedefcheck_stuemail(self):#同上。只是正则匹配的是邮箱地址而已
partten = re.compile(R"^(\w)+(.\w+)*@(\w)+((.\w+)+)$") #学号为95开头的6位数字
match_result =partten.match(self.email)if match_result isNone:returnFalseelse:returnTruedefcheck_all(self):#把情况细化。分别定义学号,姓名,性别,手机号码,邮箱地址为几。便于获取判断
if notself.check_stuno():return 1
elif notself.check_stuname():return 2
elif notself.check_stugenter():return 3
elif notself.check_stumobile():return 4
elif notself.check_stuemail():return 5
else:return 0
add_student.py
(3)start_app 类
from GUI_实例方法案例.add_stu_gui importAdd_Studentif __name__ == "__main__":
show_gui=Add_Student()
show_gui.mainloop()
start_app.py
友情提醒:不管使用什么方法都可以实现以上的功能。但是对于不同的方法的了解,可以更加清晰的认识代码在内存中如何开辟空间又如何实现功能的。
另外import包的时候不要导错包