主頁 > 後端開發 > python小專案--資訊管理系統---新手實踐

python小專案--資訊管理系統---新手實踐

2021-02-12 11:05:18 後端開發

一,功能簡介

除最基本的增,刪,改,查,多加了一個匯出為excel表格的功能,比較適合剛學完python練習基本語言用,代碼中大部分都是使用基本語法來處理資料,
在這里插入圖片描述
新建和查看
在這里插入圖片描述

在這里插入圖片描述
搜索時,界面確實不怎么美觀,家庭住址這一欄也直接到了下一行,時間原因,也懶得修改了,
在這里插入圖片描述
修改:
先選擇要修改的資訊
在這里插入圖片描述
改動:
在這里插入圖片描述
資訊覆寫:
在這里插入圖片描述
洗掉和修改的界面幾乎一樣一個多選的對話框,這里不展示了,
匯出表格:其中C:/Users/acer/Desktop/資訊.xlsx為默認路徑,選擇匯出功能時會自動填入
在這里插入圖片描述

在這里插入圖片描述

二,代碼

個人小白,python學的比較淺,GUI也是用的自帶模塊easygui
運行時會生成名為employee_date.json的檔案來存盤資訊
main.py:

import easygui
import function as fun
while True:
    main_menu = easygui.buttonbox('\t\t\t\t選單界面', title='資訊管理系統',
                                  choices=['新建資訊', '查看所有資訊',
                                           '搜索資訊', '修改資訊', '洗掉資訊',
                                           '匯出為excel表格'])
    if main_menu == '新建資訊':
        try:
            fun.new_employee()
        except FileNotFoundError:
            fun.new_filename()
    elif main_menu == '查看所有資訊':
        try:
            fun.data_all()
        except FileNotFoundError:
            fun.tip_not_found_file()
    elif main_menu == '修改資訊':
        try:
            fun.modify_employee()
        except FileNotFoundError:
            fun.tip_not_found_file()
    elif main_menu == '洗掉資訊':
        try:
            fun.del_data()
        except ValueError:
            fun.del_data2()
        except FileNotFoundError:
            fun.tip_not_found_file()
    elif main_menu == '搜索資訊':
        try:
            fun.search_data()
        except FileNotFoundError:
            fun.tip_not_found_file()
    elif main_menu == '匯出為excel表格':
        try:
            fun.export_to_excel()
        except FileNotFoundError:
            fun.tip_not_found_file()
    elif main_menu == None:
        break

function.py:

import json
import openpyxl
import easygui
import os
list_employee = []
filename = 'employee_date.json'


def new_filename():
    employee = new_tools1()
    if employee == None:
        return
    tem_list = []
    tem_list.append(employee)
    with open(filename, 'w') as f:
        json.dump(tem_list, f, indent=4)
        f.close()
    easygui.msgbox(msg='Add success', title='tip', ok_button='回傳')


def new_employee():
    with open(filename) as f:
        list_employee = json.load(f)
        f.close()
    employee = new_tools1()
    if employee == None:
        return
    with open(filename) as f:
        list_employee = json.load(f)
        list_employee.append(employee)
        f.close()
    with open(filename, 'w') as f:
        json.dump(list_employee, f, indent=4)
        f.close()
    easygui.msgbox(msg='Add success', title='tip', ok_button='回傳')


def new_tools1():
    menu1 = easygui.multenterbox('新建資訊', '新建資訊功能',
                                 ['姓名', '性別(男/女)', '聯系方式', '家庭住址'])
    if menu1 == None:
        return menu1
    while len(menu1[1]) != 1 or len(menu1[2]) != 11 or not menu1[2].isdigit():
        menu1 = easygui.multenterbox('格式有誤!重新輸入', '新建資訊功能',
                                     ['姓名', '性別(男/女)', '聯系方式', '家庭住址'])
        if menu1 == None:
            return menu1
    employee = {
        'name': menu1[0],
        'gender': menu1[1],
        'phone': menu1[2],
        'address': menu1[3]
    }
    return employee


def data_all(w=True):
    with open(filename) as f:
        data = json.load(f)
        f.close()
    if len(data) == 0:
        easygui.msgbox('NOT FOUND MESSAGES!')
        return 1
    value = ['姓名', '性別', '聯系方式', '家庭住址']
    i = 0
    while i < len(data):
        for v in data[i].values():
            value.append(v)
        i = i+1
    val_p = ''
    for a in range(len(value)):
        val_p += str(value[a])+'\t\t'
        if a % 4 == 3:
            val_p += '\n'
    if w == False:
        return val_p
    easygui.msgbox(val_p, title='全部資訊')


def export_to_excel():
    # 定義要寫入的行和列的值
    with open(filename) as f:
        list_employee = json.load(f)
            # 定義excel的sheet_name  "xlsx格式測驗表 "
        f.close()
    workbook = openpyxl.Workbook()
    sheet = workbook.active
    sheet_name = "xlsx格式表"
    sheet.title = sheet_name
    path = 'C:/Users/acer/Desktop/資訊.xlsx'
    path = easygui.enterbox('匯出路徑', title='選擇路徑', default=path)
    if path == None:
        return
    temporary_val_k = ['姓名', '性別', '聯系方式', '家庭住址']
    for a in range(0, len(temporary_val_k)):
        sheet.cell(row=1, column=a+1, value=temporary_val_k[a])     #列印表頭
    i = 0
    while i < len(list_employee):    #0~len(list)   i:0~4
        temporary_val = []
        for val in list_employee[i].values():     #list_employee is a list ,每個值為字典
            temporary_val.append(val)   #此時temporary_val 是串列,有四個值
        for j in range(len(temporary_val)):
            sheet.cell(i+2, j+1, temporary_val[j])
        i = i+1
    workbook.save(path)
    easygui.msgbox(msg='匯出成功', title='tip')


def search_data():
    val_p = data_all(w=False)
    if val_p == 1:
        return
    find_data = easygui.enterbox(val_p,
                                 title='資訊搜索')
    if find_data == None:
        return
    with open(filename) as f:
        list_employee = json.load(f)
        f.close()
    value = ['姓名', '性別', '聯系方式', '家庭住址']
    i = len(value)
    s = ''
    for category in ['name', 'gender', 'phone', 'address']:
        for dict_employee in list_employee:
            if find_data in dict_employee[category]:
                for element in dict_employee.values():
                    value.append(element)
    if len(value) == 4:
        value.append('NOT FOUND!!')
    for a in range(len(value)):
        s += value[a]+'\t\t'
        if a%i == 3:
            s += '\n'
    easygui.msgbox(msg=s, title='資訊檢索', ok_button='回傳')


def del_data():
    tem = del_mod(m='選擇要洗掉的資訊', t='選擇洗掉資訊')
    if tem == None:
        return
    for t in range(len(tem)):
        num = ''.join([x for x in tem[t] if x.isdigit()])
        with open(filename) as f:
            list_employee = json.load(f)
            for employee in list_employee:
                if employee['phone'] == num:
                    list_employee.remove(employee)
            f.close()
        with open(filename, 'w') as f:
            json.dump(list_employee, f, indent=4)
            f.close()
    message = '成功洗掉:\n'
    for a in range(len(tem)):
        message += tem[a]+'\n'
    easygui.msgbox(message, title='tip')


def del_data2():    #解決只有一個資訊時的洗掉錯誤
    with open(filename) as f:
        list_employee = json.load(f)
        f.close()
    a = '成功洗掉:\n'
    for a_p in list_employee[0].values():
        a += a_p
    os.remove(filename)
    easygui.msgbox(a, title='tip')


def modify_employee():
    with open(filename) as f:
        list_employee = json.load(f)
        f.close()
    list_tem = []
    value = ['姓名', '性別', '聯系方式', '家庭住址']
    tem = del_mod(m='選擇要修改的資訊', t='修改資訊')  #tem is a list
    if tem == None:
        return
    for d in tem:
        for n in range(len(d)):
            t = d[n]
            if t == '男' or t == '女':    #別問為什么要用中間變數t,直接用d[n]不是更簡單嗎?直接用d[n]不行,不是預期結果
                list_tem.append(d[:n].strip())
                list_tem.append(d[n])
                list_tem.append(d[n+3:n+14])
                list_tem.append(d[n+14:].strip())
    num_list = get_subscript(list_tem)     #若選擇要修改的人員資訊有兩個,此時list_tem == 8,num_list存盤要修改資訊的下標
    list_tem_a = []
    record = 0
    for a in range(len(list_tem)):  #run twice
        list_tem_a.append(list_tem[a])  #給list_tem_a添加list_tem,當加入四個時說明為一個人的資訊
        if a % len(value) == len(value)-1:  #if a%4 == 3
            ret = easygui.multenterbox('', '資訊修改', value, list_tem_a)
            if ret == None:
                return
            while len(ret[1]) != 1 or len(ret[2]) != 11 or not ret[2].isdigit():
                ret = easygui.multenterbox('格式有誤', '資訊修改', value, list_tem_a)   #ret 回傳修改過的資訊
                if ret == None:
                    return
            list_employee[num_list[record]]['name'] = ret[0]
            list_employee[num_list[record]]['gender'] = ret[1]
            list_employee[num_list[record]]['phone'] = ret[2]
            list_employee[num_list[record]]['address'] = ret[3]
            record = record + 1
            list_tem_a = []
    with open(filename, 'w') as f:
        json.dump(list_employee, f, indent=4)
        f.close()
    easygui.msgbox('修改成功', title='tip')


def get_subscript(list_tem):
    num_list = []
    with open(filename) as f:
        list_employee = json.load(f)
        f.close()
    for n in range(len(list_tem)):
        if n%4 == 2:
            #list_tem[n] == phone
            for num in range(len(list_employee)):
                if list_employee[num]['phone'] == list_tem[n]:
                    num_list.append(num)
    return num_list


def del_mod(m, t):
    i = 0
    s = ''
    val_p = []
    value = []
    with open(filename) as f:
        data = json.load(f)
        f.close()
    a = data
    if len(data) == 0:
        easygui.msgbox('NOT FOUND MESSAGES!')
        return
    while i < len(data):
        for v in data[i].values():
            value.append(str(v) + '  ')
        i = i + 1
    for i in range(len(value)):
        s += value[i]
        if i % 4 == 3:
            val_p.append(s)
            s = ''
    if len(a) == 1:
        return val_p
    tem = easygui.multchoicebox(msg=m, title=t,
                                choices=val_p)
    return tem      #回傳要修改的原值


def tip_not_found_file():
    easygui.msgbox('NOT FOUND MESSAGES!', 'tip')

僅供學習交流!

三,一些廢話

總共不到300行,python的確是一門簡潔的語言,用c的話估計沖著五六百行就去了,python作為輔助語言不錯,但不建議作為第一語言來使用,隱去了很多我們不需要考慮的內容,

主要參考資料:
1,《Python編程從入門到實踐》,人民郵電出版社
2,python簡單圖形界面GUI入門——easygui
https://blog.csdn.net/mingqi1996/article/details/81272621

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258956.html

標籤:python

上一篇:Jupyter Notebook在清華鏡像下安裝Nbextensions 插件

下一篇:Python入門:條件陳述句

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more