在開始這個項目之前,我們先了解一下類變量的基礎知識:
一、類變量
1. 實例變量和實例函數
靜態屬性 ==> 實例變量/成員變量
動態屬性 ==> 實例函數(方法)/成員函數(方法)
每一份實例都有自己獨立的一份數據;
對于公共的數據(對每個對象沒有差異的數據),我們把它定義成實例變量是不合理的。我們只需要存儲一份, 應該把它定義成類變量,所有的對象后期調用的時候直接調用類變量就可以了。這樣可以提高運行速度、節約對象實例化的內存資源。
2. 類變量
類變量一般位于類名稱的下面,構造函數的上面;
class Person:
count = 0 # 類變量
def __init__(self,name,age):
self.name = name # 成員變量
self.age = age
Person.count += 1
def say_hello(self): # 成員函數
print("大家好,我是"+self.name+",今年"+self.age+"歲!")
if __name__ == '__main__':
peter = Person("peter","20")
peter.say_hello()
# 想通過一個變量來記錄這個類被實例化多少次
alice = Person("alice", "22")
alice.say_hello()
print(Person.count)
類變量只存儲一份,存儲在類空間中,在每個對象的空間中不需要存儲類變量
3. 類變量的訪問
在類中訪問類變量: 類名.類變量名稱
在對象中訪問類變量:類名.類變量名稱
或者對象名.類變量名稱
推薦:如果訪問類變量,最好還是通過類名.類變量名稱
來進行訪問。
4. 對象變量訪問的順序
如果類變量與實例變量同名,使用對象名.類變量名
訪問,優先訪問的是實例變量。
原則:變量通過對象名.變量名
的方式訪問時,優先在當前對象中查找有沒有該變量名,如果沒有則去類空間中查找該變量名。
二、GUI 界面搭建
我們搭建一個可以統計學生人數的窗體,包括男生人數和女生人數:
from tkinter import *
from tkinter.ttk import *
import os
class StudentGUI(Tk):
def __init__(self):
super().__init__()
self.title("計算學生人數")
self.geometry("602x520+300+100")
self.resizable(0,0)
self["bg"] = "whitesmoke"
# 加載具體的界面控件
self.setuo_UI()
def setuo_UI(self):
# 設置Style
self.style01 = Style()
self.style01.configure("title.TLabel",font=("微軟雅黑",25,"bold"),foreground = "navy")
self.style01.configure("TLabel", font=("微軟雅黑", 18, "bold"))
# 設置Banner
self.Top_image = PhotoImage(file = "."+os.sep+"img"+os.sep+"stu_detail_banner.png")
self.Label_image = Label(self,image = self.Top_image)
self.Label_image.place(x=1,y=1)
self.Label_title = Label(self,text = "統計學生信息",style = "title.TLabel")
self.Label_title.place(x = 380,y = 20 )
# 設置統計區域
self.Label_total = Label(self,text = "總人數:")
self.Label_total.place(x=20,y=95)
self.var_total = StringVar()
self.Entry_total = Entry(self,state=DISABLED,textvariable = self.var_total,width =8,font=("微軟雅黑", 18, "bold"))
self.Entry_total.place(x=90,y=90)
self.Label_man = Label(self, text="男生人數:")
self.Label_man.place(x=210, y=95)
self.var_man = StringVar()
self.Entry_man = Entry(self,state=DISABLED,textvariable = self.var_man,width=8,font=("微軟雅黑", 18, "bold"))
self.Entry_man.place(x=300, y=90)
self.Label_woman = Label(self, text="女生人數:")
self.Label_woman.place(x=410, y=95)
self.vat_woman = StringVar()
self.Entry_woman = Entry(self,state=DISABLED,textvariable = self.vat_woman,width=8,font=("微軟雅黑", 18, "bold"))
self.Entry_woman.place(x=500, y=90)
# 加載表格
self.Tree = Treeview(self,columns=("sno","name","gender","birthday","mobile"),show="headings",height = 20)
self.Tree.column("sno",width=120,anchor="center")
self.Tree.column("name",width=90,anchor="center")
self.Tree.column("gender",width=90,anchor="center")
self.Tree.column("birthday",width=130,anchor="center")
self.Tree.column("mobile",width=150,anchor="center")
self.Tree.heading("sno",text="學號")
self.Tree.heading("name", text="姓名")
self.Tree.heading("gender", text="性別")
self.Tree.heading("birthday", text="出生日期")
self.Tree.heading("mobile", text="手機號碼")
self.Tree.place(x=10,y=130)
if __name__ == '__main__':
this_gui = StudentGUI()
this_gui.mainloop()
顯示效果:
三、實現數據統計的功能
前面的界面我們已經搭建好啦,現在我們要寫一個student模塊來實現數據統計的功能。
學生列表、男生人數、女生人數,我們將其作為類變量存儲在Student類中,我們定義一個load_student
函數用來讀取文件中的學生信息,并實現男生女生人數的統計功能
def load_student(self):
try:
# 讀取文件
with open(file = Student.file_path,mode="r",encoding="UTF-8") as fd:
# 逐行讀取
current_line = fd.readline()
while current_line:
student_info = current_line.split(",")
# 判斷男女
if student_info[2] == "男":
Student.male_number += 1
else:
Student.female_number += 1
# 把當前學生添加到類變量student_list[]中
Student.student_list.append(student_info)
# 讀取下一行
current_line = fd.readline()
except:
showinfo("系統消息","讀取消息出現異常!")
為了防止每次實例化這個類的時候,類變量收到干擾;我們定義一個機制:在Student類的構造方法中,在調用load_student
方法前先判斷一下,如果類變量student_list
數據為空,則需要導入,否則不導入數據。
def __init__(self):
if len(Student.student_list) == 0:
self.load_student()
四、完成GUI界面數據的加載
現在我們把GUI與后臺的功能做一個整合,這里我們定義一個控制程序start.py
,作為程序的入口;
import studentgui
if __name__ == '__main__':
this_window = studentgui.StudentGUI()
this_window.mainloop()
現在已經可以從程序入口打開GUI了,但是還沒有顯示人數、表格中的數據也沒有顯示。所以我們需要在studentgui
中再添加一個load_student_info
函數,將功能函數獲取到結果加載到GUI界面中。這里主要做兩件事:
1. 填充人數
先實例化操作學生的類,
this_student = student.Student()
沒有實例變量,實例化還有什么用?實際上,如果不實例化的話,Student
類中的數據是無法導入到StudentGUI
中來用的。
實例化完成后,在StudentGUI中直接給顯示學生人數的變量設置值即可:
self.var_man.set(student.Student.male_number)
self.var_woman.set(student.Student.female_number)
self.var_total.set(int(student.Student.male_number)+int(student.Student.female_number))
2. 導入數據到表格
給GUI界面的TreeView表格填充數據,填充之前先將TreeView清空:
for i in self.Tree.get_children():
self.Tree.delete(i)
然后判斷傳遞過來的student_list
里是否有數據,如果沒有數據則彈出警示框,有數據則使用insert
方法逐行插入數據:
if len(student.Student.student_list) == 0:
showinfo("系統消息","沒有數據加載")
else:
# 獲取student.Student.student_list的數據
list_student = student.Student.student_list
# 遍歷list_student逐條插入
for index in range(len(list_student)):
self.Tree.insert("",index,values=(
list_student[index][0],list_student[index][1],list_student[index][2],
list_student[index][3],list_student[index][4]))
至此,我們的項目已經基本完成了