基於Python的課堂點名器V4

前言

還是一樣,又來了新的需求
在這裏插入圖片描述這裏我們就要用到Python連接MySQL的相關模塊了。
Python連接MySQL的模塊我們這裏選用pymysql,自己這兩個庫東西挺多的,自己分別寫了博文記載自己用到的部分:

Python連接MySQL(pymysql):
https://blog.csdn.net/Ans_min/article/details/105186069

思路

這次相對V3就是單純的加了MySQL的鏈接,我們導入pymysql模塊、改寫dmq_file_in那四個函數(dmq_file_in_latedmq_file_in_absencedmq_file_in_sickdmq_file_in_early),再在dmq_init函數裏添加連接數據庫部分就可以了,這部分我們取名爲data_in
自己修改了一下V3的思路圖:
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述新加的在圖中都以紅色和黃底表示了出來。

代碼

我們貼出代碼,相關說明都在註釋裏
注意:代碼正常運行的條件有:MySQL中創建了名爲dmqdb的數據庫,該數據庫下創建好了student_listlate_listearly_listabsence_listsick_list五張表。
五張表的屬性都是一樣,給出Navicat截圖

--以Student表爲例
create table Student(
SNumber varchar(10) PRIMARY KEY not null,
SName varchar(20) not null
);
/*
其他的表就是列名換了一下,其他都一樣。
late_list是LNumber和LName,absence_list是ANumber和AName,
early_list是ENumber和EName,sick_list是SINumber和SIName
*/

截圖就放一個student_list表做示範,其他表就列名不同,其他都一樣。
在這裏插入圖片描述

# 點名器V3
import csv
import random
import pymysql

# 規定的一些常量
student_late = []   # 存儲遲到名單
students_late = []   # 遲到錄入名單 這種形式[[姓名, 學號], [], [], ....]
# student_absence = []   # 存儲曠課名單(不需要,因爲absence這個表是通過late和early交運算得到的)
students_absence = []    # 曠課錄入名單 這種形式[[姓名, 學號], [], [], ....]
student_sick = []   # 存儲請假名單
students_sick = []   # 請假錄入名單 這種形式[[姓名, 學號], [], [], ....]
student_early = []   # 存儲早退名單
students_early = []   # 早退錄入名單 這種形式[[姓名, 學號], [], [], ....]
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='dmqdb')		# 創建connect對象,連接數據庫


###
# 功能:csv文件寫入數據庫
# 輸入:csv文件路徑名(str)
# 返回:None
###
def data_in(file):
    # 清空所有表(原因應該都懂,如果每次程序開始不清空,很容易積累錯誤信息)
    cur = conn.cursor()
    cur.execute("truncate table student_list")
    conn.commit()
    cur.execute("truncate table late_list")
    conn.commit()
    cur.execute("truncate table early_list")
    conn.commit()
    cur.execute("truncate table absence_list")
    conn.commit()
    cur.execute("truncate table sick_list")
    conn.commit()

    # 從csv中向student_list插入
    with open(file, newline='') as info:
        data = csv.reader(info)
        for row in data:
            cur = conn.cursor()  # 創建遊標
            cur.execute('INSERT INTO student_list values '
                        + str((row[1], row[0])))     # 傳遞每一行的數據
            conn.commit()      # 確定執行語句


###
# 功能:讀入csv文件學生名單
# 輸入:文件名(string)
# 返回值:學生全部信息(dict),學生名單(list)
###
def file_in(file_name):
    students_info = {}
    students_name = []
    # open()函數讀入文件
    with open(file_name, newline='') as info:
        reader = csv.reader(info)
        for row in reader:
            students_info[row[0]] = row[1]
            students_name.append(row[0])
    return students_info, students_name


###
# 功能:產生隨機學生名單
# 輸入:學生名單(list)
# 返回值:打亂的學生名單(list)
###
def new_list(students_name):
    student_upset_name = random.sample(students_name, len(students_name))
    return student_upset_name


###
# 功能:完成點名器的初始化,整合了new_list()、data_in()和file_in()三個函數
# 輸入:學生名單(list)
# 返回值:學生信息(dict)和打亂的學生名單(list)
###
def dmq_init(file_name):
    data_in(file_name)
    student_info = file_in(file_name)[0]
    # print(students_wg_dict)
    student_upset_name = new_list(file_in(file_name)[1])
    # print(students_wg_list)
    return student_info, student_upset_name


###
# 功能:第一次點名,更新請假名單和遲到名單
# 輸入:打亂的學生名單(list)
# 返回值:None
###
def dmq_dm(student_upset_name):
    student_dm_wrong = []
    print('課程即將開始!開始第一次點名!\n')
    for name in student_upset_name:
        temp = input(name + "到了嗎?(輸入到或沒到,請假輸入已請假)")
        if temp == "到":
            continue
        elif temp == "沒到":
            student_late.append(name)
        elif temp == '已請假':
            student_sick.append(name)
        else:
            student_dm_wrong.append(name)
            print("請按要求輸入!該名字被放置最後點名。")
    if student_dm_wrong:
        for name in student_dm_wrong:
            temp = input(name + "到了嗎?(輸入到或沒到,請假輸入已請假)")
            if temp == "到":
                continue
            elif temp == "沒到":
                student_late.append(name)
            elif temp == '已請假':
                student_sick.append(name)
            else:
                print("仍然未按照要求輸入!算入遲到名單!")
                student_late.append(name)


###
# 功能:遲到名單的寫入和輸出
# 輸入:遲到學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_late(late_list, student_info, num):
    # 向 遲到錄入名單 加入信息
    for name in late_list:
        students_late.append((name, student_info[name]))
    # 輸出 遲到錄入名單
    print_info('遲到', students_late, num)
    # 寫入 遲到表
    cur = conn.cursor()
    for info in students_late:
        cur.execute("INSERT INTO late_list VALUES " + str(info))
        conn.commit()
    print("\n已導出遲到學生名單!數據庫dmqDB下的late_list表中\n")


###
# 功能:請假名單的寫入和輸出
# 輸入:請假學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_sick(sick_list, student_info, num):
    # dmq_file_in_sick()、dmq_file_in_early()和dmq_file_in_absence()都是一個原理,註釋參照dmq_file_in_late()
    for name in sick_list:
        students_sick.append((name, student_info[name]))
    print_info('請假', students_sick, num)
	
	# 寫入表
    cur = conn.cursor()
    for info in students_sick:
        cur.execute("INSERT INTO sick_list VALUES " + str(info))
        conn.commit()
    print("\n已導出請假學生名單!數據庫dmqDB下的sick_list表中\n")


###
# 功能:早退名單的寫入和輸出
# 輸入:早退學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_early(early_list, student_info, num):
    for name in early_list:
        students_early.append((name, student_info[name]))
    print_info('早退', students_early, num)

    cur = conn.cursor()
    for info in students_early:
        cur.execute("INSERT INTO early_list VALUES " + str(info))
        conn.commit()
    print("\n已導出早退學生名單!數據庫dmqDB下的early_list表中\n")


###
# 功能:曠課名單的寫入和輸出
# 輸入:曠課學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_absence(absence_list, student_info, num):
    for name in absence_list:
        students_absence.append((name, student_info[name]))
    print_info('曠課', students_absence, num)

    cur = conn.cursor()
    for info in students_absence:
        cur.execute("INSERT INTO absence_list VALUES " + str(info))
        conn.commit()
    print("\n已導出曠課學生名單!數據庫dmqDB下的absence_list表中\n")


###
# 功能:輸出 特定 列表數據
# 輸入:名單名稱、特定的list  [[*, *], [*, *], [*, *], ...]和每行顯示數字
# 返回值:None
###
def print_info(string, special_list, num):
    count = 0
    print('--'*5 + '**' + string + '名單(' + str(num) + '個一行)' + '**' + '--'*5)
    for i in special_list:
        if (count % num == 0) & (count != 0):
            print()
        print(i[0]+","+i[1], end=' ')
        count += 1


###
# 功能:第二次點名
# 輸入:打亂的學生名單(list)
# 返回值:早退的學生名單(list)
###
def dmq_dm_2(list_1):
    name_list = list(set(list_1) - set(student_sick))
    student_dm_wrong = []
    print('\n下課時間到!開始第二次點名!\n')
    for name in name_list:
        temp = input(name + "在嗎?(輸入在或不在)")
        if temp == "在":
            continue
        elif temp == "不在":
            student_early.append(name)
        else:
            student_dm_wrong.append(name)
            print("請按要求輸入!該名字被放置最後點名。")
    if student_dm_wrong:
        for name in student_dm_wrong:
            temp = input(name + "在嗎?(輸入在或不在)")
            if temp == "在":
                continue
            elif temp == "不在":
                student_early.append(name)
            else:
                print("仍然未按照要求輸入!算入早退名單!")
                student_early.append(name)


###
# 功能: 計算兩列表的交集
# 輸入: 兩個列表(不分先後)
# 返回: None
###
def list_mix(list_1, list_2):
    mix = []
    for i in list_1:
        if i in list_2:
            mix.append(i)
    return mix


def main(file_name, num):
    # 讀入csv文件
    temp = dmq_init(file_name)
    student_info = temp[0]
    name_list = temp[1]

    # 第一次點名
    dmq_dm(name_list)
    # 第二次點名
    dmq_dm_2(name_list)

    # 對運算結果做出調整
    # 交集運算出曠課名單
    student_absence = list_mix(student_late, student_early)
    # 遲到名單裏不能有曠課和請假的人(確保一下)
    student_late_new = list(set(student_late) - set(student_absence) - set(student_sick))
    # 早退名單裏不能有曠課和請假的人(確保一下)
    student_early_new = list(set(student_early) - set(student_absence) - set(student_sick))

    # 輸出並導入請假名單
    dmq_file_in_sick(student_sick, student_info, num)
    # 輸出並導入遲到名單
    dmq_file_in_late(student_late_new, student_info, num)
    # 輸出並導入早退名單
    dmq_file_in_early(student_early_new, student_info, num)
    # 輸出並導入曠課名單
    dmq_file_in_absence(student_absence, student_info, num)
    # return '程序結束'


# 5代表5個名字一行輸出
main("test.csv", 5)

最後

這次增加功能非常簡單快速,V3到V4的過程就1個小時不到,可能是代碼的可擴展性好和耦合性低有關,自己前兩次整改代碼還是有用的。
自己最近都在嘗試用GUI界面來實現點名器V4,不過一直還在調試階段,事件觸發和處理回調仍然是自己沒有攻克的難題。
大家有興趣也可以自己試試GUI界面,這裏分享出自己找到的學習資料:

Python GUI(tkinter) :
https://blog.csdn.net/Ans_min/article/details/105111342

這位博主tkinter系列整理的很全,自己前期零零散散找了些tkinter組件學習,很多都連不起來,導致現在的GUI界面始終有錯誤,不協調,學習一個模塊還是要系統性的學習,這位博主的tkinter系列就很好。

文章就到這裏,看完有幫助記得點贊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章