使用Python自動統(tǒng)計列表中的男生女生人數(shù)

在開始這個項目之前赡茸,我們先了解一下類變量的基礎(chǔ)知識:

一耀怜、類變量

1. 實例變量和實例函數(shù)

靜態(tài)屬性 ==> 實例變量/成員變量
動態(tài)屬性 ==> 實例函數(shù)(方法)/成員函數(shù)(方法)
每一份實例都有自己獨立的一份數(shù)據(jù);
對于公共的數(shù)據(jù)(對每個對象沒有差異的數(shù)據(jù))倍踪,我們把它定義成實例變量是不合理的瓣窄。我們只需要存儲一份笛厦, 應(yīng)該把它定義成類變量,所有的對象后期調(diào)用的時候直接調(diào)用類變量就可以了俺夕。這樣可以提高運行速度裳凸、節(jié)約對象實例化的內(nèi)存資源贱鄙。

2. 類變量

類變量一般位于類名稱的下面,構(gòu)造函數(shù)的上面姨谷;

class Person:
    count = 0   # 類變量
    def __init__(self,name,age):
        self.name = name    # 成員變量
        self.age = age
        Person.count += 1
    def say_hello(self):    # 成員函數(shù)
        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. 對象變量訪問的順序

如果類變量與實例變量同名言缤,使用對象名.類變量名訪問,優(yōu)先訪問的是實例變量禁灼。
原則:變量通過對象名.變量名的方式訪問時管挟,優(yōu)先在當(dāng)前對象中查找有沒有該變量名,如果沒有則去類空間中查找該變量名弄捕。

二僻孝、GUI 界面搭建

我們搭建一個可以統(tǒng)計學(xué)生人數(shù)的窗體,包括男生人數(shù)和女生人數(shù):

from tkinter import *
from tkinter.ttk import *
import os

class StudentGUI(Tk):

    def __init__(self):
        super().__init__()
        self.title("計算學(xué)生人數(shù)")
        self.geometry("602x520+300+100")
        self.resizable(0,0)
        self["bg"] = "whitesmoke"
        # 加載具體的界面控件
        self.setuo_UI()

    def setuo_UI(self):
        # 設(shè)置Style
        self.style01 = Style()
        self.style01.configure("title.TLabel",font=("微軟雅黑",25,"bold"),foreground = "navy")
        self.style01.configure("TLabel", font=("微軟雅黑", 18, "bold"))
        # 設(shè)置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 = "統(tǒng)計學(xué)生信息",style = "title.TLabel")
        self.Label_title.place(x = 380,y = 20 )
        # 設(shè)置統(tǒng)計區(qū)域
        self.Label_total = Label(self,text = "總?cè)藬?shù):")
        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="男生人數(shù):")
        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="女生人數(shù):")
        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="學(xué)號")
        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()
顯示效果:
屏幕快照 2020-08-16 下午9.49.42.png

三守谓、實現(xiàn)數(shù)據(jù)統(tǒng)計的功能

前面的界面我們已經(jīng)搭建好啦穿铆,現(xiàn)在我們要寫一個student模塊來實現(xiàn)數(shù)據(jù)統(tǒng)計的功能。
學(xué)生列表斋荞、男生人數(shù)荞雏、女生人數(shù),我們將其作為類變量存儲在Student類中平酿,我們定義一個load_student函數(shù)用來讀取文件中的學(xué)生信息凤优,并實現(xiàn)男生女生人數(shù)的統(tǒng)計功能

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
                # 把當(dāng)前學(xué)生添加到類變量student_list[]中
                Student.student_list.append(student_info)
                # 讀取下一行
                current_line = fd.readline()
    except:
        showinfo("系統(tǒng)消息","讀取消息出現(xiàn)異常!")

為了防止每次實例化這個類的時候蜈彼,類變量收到干擾筑辨;我們定義一個機制:在Student類的構(gòu)造方法中,在調(diào)用load_student方法前先判斷一下幸逆,如果類變量student_list數(shù)據(jù)為空棍辕,則需要導(dǎo)入,否則不導(dǎo)入數(shù)據(jù)还绘。

def __init__(self):
    if len(Student.student_list) == 0:
        self.load_student()

四楚昭、完成GUI界面數(shù)據(jù)的加載

現(xiàn)在我們把GUI與后臺的功能做一個整合,這里我們定義一個控制程序start.py拍顷,作為程序的入口;

import studentgui

if __name__ == '__main__':
    this_window = studentgui.StudentGUI()
    this_window.mainloop()

現(xiàn)在已經(jīng)可以從程序入口打開GUI了抚太,但是還沒有顯示人數(shù)、表格中的數(shù)據(jù)也沒有顯示菇怀。所以我們需要在studentgui中再添加一個load_student_info函數(shù)凭舶,將功能函數(shù)獲取到結(jié)果加載到GUI界面中晌块。這里主要做兩件事:

1. 填充人數(shù)

先實例化操作學(xué)生的類,

this_student = student.Student()

沒有實例變量帅霜,實例化還有什么用匆背?實際上,如果不實例化的話身冀,Student類中的數(shù)據(jù)是無法導(dǎo)入到StudentGUI中來用的钝尸。
實例化完成后,在StudentGUI中直接給顯示學(xué)生人數(shù)的變量設(shè)置值即可:

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. 導(dǎo)入數(shù)據(jù)到表格

給GUI界面的TreeView表格填充數(shù)據(jù)搂根,填充之前先將TreeView清空:

for i in self.Tree.get_children():
    self.Tree.delete(i)

然后判斷傳遞過來的student_list里是否有數(shù)據(jù)珍促,如果沒有數(shù)據(jù)則彈出警示框,有數(shù)據(jù)則使用insert方法逐行插入數(shù)據(jù):

if len(student.Student.student_list) == 0:
    showinfo("系統(tǒng)消息","沒有數(shù)據(jù)加載")
else:
    # 獲取student.Student.student_list的數(shù)據(jù)
    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]))

至此剩愧,我們的項目已經(jīng)基本完成了

顯示效果
4.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猪叙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仁卷,更是在濱河造成了極大的恐慌穴翩,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦积,死亡現(xiàn)場離奇詭異芒帕,居然都是意外死亡,警方通過查閱死者的電腦和手機丰介,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門背蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哮幢,你說我怎么就攤上這事带膀。” “怎么了家浇?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵本砰,是天一觀的道長碴裙。 經(jīng)常有香客問我钢悲,道長,這世上最難降的妖魔是什么舔株? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任莺琳,我火速辦了婚禮,結(jié)果婚禮上载慈,老公的妹妹穿的比我還像新娘惭等。我一直安慰自己,他們只是感情好办铡,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布辞做。 她就那樣靜靜地躺著琳要,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秤茅。 梳的紋絲不亂的頭發(fā)上稚补,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音框喳,去河邊找鬼课幕。 笑死,一個胖子當(dāng)著我的面吹牛五垮,可吹牛的內(nèi)容都是我干的乍惊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼放仗,長吁一口氣:“原來是場噩夢啊……” “哼润绎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诞挨,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤凡橱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亭姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稼钩,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年达罗,在試婚紗的時候發(fā)現(xiàn)自己被綠了坝撑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡粮揉,死狀恐怖巡李,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扶认,我是刑警寧澤侨拦,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站辐宾,受9級特大地震影響狱从,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叠纹,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一季研、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧誉察,春花似錦与涡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氨肌。三九已至,卻和暖如春酌畜,著一層夾襖步出監(jiān)牢的瞬間儒飒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工檩奠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桩了,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓埠戳,卻偏偏與公主長得像井誉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子整胃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351