python项目开发4个实例

本篇内容来自https://www.cnblogs.com/lws865/category/1520289.html

 

玛丽冒险

文件结构:

python项目开发4个实例

marie.py

python项目开发4个实例
import pygame  # 将pygame库导入到python程序中
from pygame.locals import *  # 导入pygame中的常量
import sys                   # 导入系统模块
SCREENWIDTH = 822  # 窗口宽度
SCREENHEIGHT = 199  # 窗口高度
FPS = 30  # 更新画面的时间


# 定义一个移动地图类
class MyMap():

    def __init__(self, x, y):
        # 加载背景图片
        self.bg = pygame.image.load("image/bg.png").convert_alpha()
        self.x = x
        self.y = y

    def map_rolling(self):
        if self.x < -790:  # 小于-790说明地图已经完全移动完毕
            self.x = 800  # 给地图一个新的坐标点
        else:
            self.x -= 5  # 5个像素向左移动

    # 更新地图
    def map_update(self):
        SCREEN.blit(self.bg, (self.x, self.y))

# 背景音乐按钮
class Music_Button():
    is_open = True   # 背景乐音的标记
    def __init__(self):
        self.open_img = pygame.image.load('image/btn_open.png').convert_alpha()
        self.close_img = pygame.image.load('image/btn_close.png').convert_alpha()
        self.bg_music = pygame.mixer.Sound('audio/bg_music.wav')  # 加载背景音乐
    # 判断鼠标是否在,按钮的范围内
    def is_select(self):
        # 获取鼠标,的坐标
        point_x, point_y = pygame.mouse.get_pos()
        w, h = self.open_img.get_size()             # 获取按钮图片的大小
        # 判断鼠标是否在按钮范围内
        in_x = point_x > 20 and point_x < 20 + w
        in_y = point_y > 20 and point_y < 20 + h
        return in_x and in_y





from itertools import cycle  # 导入迭代工具


# 玛丽类
class Marie():
    def __init__(self):
        # 初始化小玛丽矩形
        self.rect = pygame.Rect(0, 0, 0, 0)
        self.jumpState = False  # 跳跃的状态
        self.jumpHeight = 130  # 跳跃的高度
        self.lowest_y = 140  # 最低坐标
        self.jumpValue = 0  # 跳跃增变量
        # 小玛丽动图索引
        self.marieIndex = 0
        self.marieIndexGen = cycle([0, 1, 2])
        # 加载小玛丽图片
        self.adventure_img = (
            pygame.image.load("image/adventure1.png").convert_alpha(),
            pygame.image.load("image/adventure2.png").convert_alpha(),
            pygame.image.load("image/adventure3.png").convert_alpha(),
        )
        self.jump_audio = pygame.mixer.Sound('audio/jump.wav')  # 跳音效
        self.rect.size = self.adventure_img[0].get_size()
        self.x = 50;  # 绘制小玛丽的X坐标
        self.y = self.lowest_y;  # 绘制小玛丽的Y坐标
        self.rect.topleft = (self.x, self.y)

    # 跳状态
    def jump(self):
        self.jumpState = True

    # 小玛丽移动
    def move(self):
        if self.jumpState:  # 当起跳的时候
            if self.rect.y >= self.lowest_y:  # 如果站在地上
                self.jumpValue = -5  # 以5个像素值向上移动
            if self.rect.y <= self.lowest_y - self.jumpHeight:  # 小玛丽到达顶部回落
                self.jumpValue = 5  # 以5个像素值向下移动
            self.rect.y += self.jumpValue  # 通过循环改变玛丽的Y坐标
            if self.rect.y >= self.lowest_y:  # 如果小玛丽回到地面
                self.jumpState = False  # 关闭跳跃状态

    # 绘制小玛丽
    def draw_marie(self):
        # 匹配小玛丽动图
        marieIndex = next(self.marieIndexGen)
        # 绘制小玛丽
        SCREEN.blit(self.adventure_img[marieIndex],
                    (self.x, self.rect.y))

import random  # 随机数
# 障碍物类
class Obstacle():
    score = 1  # 分数
    move = 5   # 移动距离
    obstacle_y = 150  # 障碍物y坐标
    def __init__(self):
        # 初始化障碍物矩形
        self.rect = pygame.Rect(0, 0, 0, 0)
        # 加载障碍物图片
        self.missile = pygame.image.load("image/missile.png").convert_alpha()
        self.pipe = pygame.image.load("image/pipe.png").convert_alpha()
        # 加载分数图片
        self.numbers = (pygame.image.load('image/0.png').convert_alpha(),
                        pygame.image.load('image/1.png').convert_alpha(),
                        pygame.image.load('image/2.png').convert_alpha(),
                        pygame.image.load('image/3.png').convert_alpha(),
                        pygame.image.load('image/4.png').convert_alpha(),
                        pygame.image.load('image/5.png').convert_alpha(),
                        pygame.image.load('image/6.png').convert_alpha(),
                        pygame.image.load('image/7.png').convert_alpha(),
                        pygame.image.load('image/8.png').convert_alpha(),
                        pygame.image.load('image/9.png').convert_alpha())
        # 加载加分音效
        self.score_audio = pygame.mixer.Sound('audio/score.wav')  # 加分
        # 0和1随机数
        r = random.randint(0, 1)
        if r == 0:  # 如果随机数为0显示导弹障碍物相反显示管道
            self.image = self.missile   # 显示导弹障碍
            self.move = 15              # 移动速度加快
            self.obstacle_y = 100       # 导弹坐标在天上
        else:
            self.image = self.pipe      # 显示管道障碍
        # 根据障碍物位图的宽高来设置矩形
        self.rect.size = self.image.get_size()
        # 获取位图宽高
        self.width, self.height = self.rect.size
        # 障碍物绘制坐标
        self.x = 800
        self.y = self.obstacle_y
        self.rect.center = (self.x, self.y)

    # 障碍物移动
    def obstacle_move(self):
        self.rect.x -= self.move

    # 绘制障碍物
    def draw_obstacle(self):
        SCREEN.blit(self.image, (self.rect.x, self.rect.y))

    # 获取分数
    def getScore(self):
        self.score
        tmp = self.score;
        if tmp == 1:
            self.score_audio.play()  # 播放加分音乐
        self.score = 0;
        return tmp;

    # 显示分数
    def showScore(self, score):
        # 获取得分数字
        self.scoreDigits = [int(x) for x in list(str(score))]
        totalWidth = 0  # 要显示的所有数字的总宽度
        for digit in self.scoreDigits:
            # 获取积分图片的宽度
            totalWidth += self.numbers[digit].get_width()
        # 分数横向位置
        Xoffset = (SCREENWIDTH - (totalWidth+30))
        for digit in self.scoreDigits:
            # 绘制分数
            SCREEN.blit(self.numbers[digit], (Xoffset, SCREENHEIGHT * 0.1))
            # 随着数字增加改变位置
            Xoffset += self.numbers[digit].get_width()

# 游戏结束的方法
def game_over():
    bump_audio = pygame.mixer.Sound('audio/bump.wav')  # 撞击
    bump_audio.play()  # 播放撞击音效
    # 获取窗体宽、高
    screen_w = pygame.display.Info().current_w
    screen_h = pygame.display.Info().current_h
    # 加载游戏结束的图片
    over_img = pygame.image.load('image/gameover.png').convert_alpha()
    # 将游戏结束的图片绘制在窗体的中间位置
    SCREEN.blit(over_img, ((screen_w - over_img.get_width()) / 2,
                                       (screen_h - over_img.get_height()) / 2))


def mainGame():
    score = 0  # 得分
    over = False  # 游戏结束标记
    global SCREEN, FPSCLOCK
    pygame.init()  # 经过初始化以后我们就可以尽情地使用pygame了。

    # 使用Pygame时钟之前,必须先创建Clock对象的一个实例,
    # 控制每个循环多长时间运行一次。
    FPSCLOCK = pygame.time.Clock()
    SCREEN = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))  # 通常来说我们需要先创建一个窗口,方便我们与程序的交互。
    pygame.display.set_caption('玛丽冒险')  # 设置窗口标题

    # 创建地图对象
    bg1 = MyMap(0, 0)
    bg2 = MyMap(800, 0)

    # 创建小玛丽对象
    marie = Marie()

    addObstacleTimer = 0  # 添加障碍物的时间
    list = []  # 障碍物对象列表

    music_button = Music_Button()     # 创建背景音乐按钮对象
    btn_img  = music_button.open_img  # 设置背景音乐按钮的默认图片
    music_button.bg_music.play(-1)    # 循环播放背景音乐

    while True:
        # 获取单击事件
        for event in pygame.event.get():

            if event.type == pygame.MOUSEBUTTONUP:  # 判断鼠标事件
                if music_button.is_select():        # 判断鼠标是否在静音按钮范围
                    if music_button.is_open:        # 判断背景音乐状态
                        btn_img = music_button.close_img # 单击后显示关闭状态的图片
                        music_button.is_open = False    # 关闭背景音乐状态
                        music_button.bg_music.stop()    # 停止背景音乐的播放
                    else:
                        btn_img = music_button.open_img
                        music_button.is_open = True
                        music_button.bg_music.play(-1)
            # 如果单击了关闭窗口就将窗口关闭
            if event.type == QUIT:
                pygame.quit()  # 退出窗口
                sys.exit()  # 关闭窗口

            # 单击键盘空格键,开启跳的状态
            if event.type == KEYDOWN and event.key == K_SPACE:
                if marie.rect.y >= marie.lowest_y:  # 如果小玛丽在地面上
                    marie.jump_audio.play()  # 播放小玛丽跳跃音效
                    marie.jump()  # 开启小玛丽跳的状态

                if over == True:  # 判断游戏结束的开关是否开启
                    mainGame()  # 如果开启将调用mainGame方法重新启动游戏




        if over == False:
            # 绘制地图起到更新地图的作用
            bg1.map_update()
            # 地图移动
            bg1.map_rolling()
            bg2.map_update()
            bg2.map_rolling()

            # 小玛丽移动
            marie.move()
            # 绘制小玛丽
            marie.draw_marie()

            # 计算障碍物间隔时间
            if addObstacleTimer >= 1300:
                r = random.randint(0, 100)
                if r > 40:
                    # 创建障碍物对象
                    obstacle = Obstacle()
                    # 将障碍物对象添加到列表中
                    list.append(obstacle)
                # 重置添加障碍物时间
                addObstacleTimer = 0

            # 循环遍历障碍物
            for i in range(len(list)):
                # 障碍物移动
                list[i].obstacle_move()
                # 绘制障碍物
                list[i].draw_obstacle()

                # 判断小玛丽与障碍物是否碰撞
                if pygame.sprite.collide_rect(marie, list[i]):
                    over = True  # 碰撞后开启结束开关
                    game_over()  # 调用游戏结束的方法
                    music_button.bg_music.stop()
                else:
                    # 判断小玛丽是否跃过了障碍物
                    if (list[i].rect.x + list[i].rect.width) < marie.rect.x:
                        # 加分
                        score += list[i].getScore()
                # 显示分数
                list[i].showScore(score)

        addObstacleTimer += 20  # 增加障碍物时间
        SCREEN.blit(btn_img, (20, 20)) # 绘制背景音乐按钮
        pygame.display.update()  # 更新整个窗口
        FPSCLOCK.tick(FPS)  # 循环应该多长时间运行一次


if __name__ == '__main__':
    mainGame()
View Code

 

五子棋(控制台版)

文件结构

python项目开发4个实例

gobang.py

python项目开发4个实例
finish = False # 游戏是否结束
flagNum = 1  # 当前下棋者标记
flagch = '*'  # 当前下棋者棋子
x = 0    # 当前棋子的横坐标
y = 0    # 当前棋子的纵坐标
print('\033[1;37;41m---------简易五子棋游戏(控制台版)---------\033[0m')
# 棋盘初始化
checkerboard=[]
for i in range(10):
    checkerboard.append([])
    for j in range(10):
        checkerboard[i].append('-')
def msg():
    # 输出最后胜利的棋盘
    print("\033[1;37;44m--------------------------------")
    print("   1  2  3  4  5  6  7  8  9  10")
    for i in range(len(checkerboard)):
        print(chr(i + ord('A')) + " ", end=' ')
        for j in range(len(checkerboard[i])):
            print(checkerboard[i][j] + " ", end=' ')
        print()
    print("--------------------------------\033[0m")
    # 输出赢家
    if (flagNum == 1):
        print('\033[32m*棋胜利!***\033[0m')
    else:
        print('\033[32mo棋胜利!***\033[0m')

while not finish:
    # 打印棋盘
    print("\033[1;30;46m--------------------------------")
    print("   1  2  3  4  5  6  7  8  9  10")
    for i in range(len(checkerboard)):
        print(chr(i + ord('A')) + " ", end=' ');
        for j in range(len(checkerboard[i])):
            print(checkerboard[i][j] + " ", end=' ')
        print()
    print("--------------------------------\033[0m")
    # 判断当前下棋者
    if flagNum == 1:
        flagch = '*'
        print('\033[1;37;40m请*输入棋子坐标(例如A1):\033[0m', end=' ') # 白字黑底
    else:
        flagch = 'o'
        print('\033[1;30;42m请o输入棋子坐标(例如J5):\033[0m', end=' ') # 黑字绿底
    # 输入棋子坐标
    str = input()
    ch = str[0] # 获取第一个字符的大写形式
    x = ord(ch) - 65
    y = int(str[1]) - 1
    # 判断坐标是否在棋盘之内
    if (x < 0 or x > 9 or y < 0 or y > 9):
        print('\033[31m***您输入的坐标有误请重新输入!***\033[0m')
        continue
    # 判断坐标上是否有棋子
    if (checkerboard[x][y] == '-'):
        if (flagNum == 1):
            checkerboard[x][y] = '*'
        else:
            checkerboard[x][y] = 'o'
    else:
        print('\033[31m******您输入位置已经有其他棋子,请重新输入!\033[0m')
        continue
    # 判断棋子左侧
    if (y - 4 >= 0):
        if (checkerboard[x][y - 1] == flagch
                and checkerboard[x][y - 2] == flagch
                and checkerboard[x][y - 3] == flagch
                and checkerboard[x][y - 4] == flagch):
            finish = True
            msg()

    # 判断棋子右侧
    if (y + 4 <= 9):
        if (checkerboard[x][y + 1] == flagch
                and checkerboard[x][y + 2] == flagch
                and checkerboard[x][y + 3] == flagch
                and checkerboard[x][y + 4] == flagch):
            finish = True
            msg()

    # 判断棋子上方
    if (x - 4 >= 0):
        if (checkerboard[x - 1][y] == flagch
                and checkerboard[x - 2][y] == flagch
                and checkerboard[x - 3][y] == flagch
                and checkerboard[x - 4][y] == flagch):
            finish = True
            msg()

    # 判断棋子下方
    if (x + 4 <= 9):
        if (checkerboard[x + 1][y] == flagch
                and checkerboard[x + 2][y] == flagch
                and checkerboard[x + 3][y] == flagch
                and checkerboard[x + 4][y] == flagch):
            finish = True
            msg()

    # 判断棋子右上方向
    if (x - 4 >= 0 and y - 4 >= 0):
        if (checkerboard[x - 1][y - 1] == flagch
                and checkerboard[x - 2][y - 2] == flagch
                and checkerboard[x - 3][y - 3] == flagch
                and checkerboard[x - 4][y - 4] == flagch):
            finish = True
            msg()

    # 判断棋子右下方向
    if (x + 4 <= 9 and y - 4 >= 0):
        if (checkerboard[x + 1][y - 1] == flagch
                and checkerboard[x + 2][y - 2] == flagch
                and checkerboard[x + 3][y - 3] == flagch
                and checkerboard[x + 4][y - 4] == flagch):
            finish = True
            msg()

    # 判断棋子左上方向
    if (x - 4 >= 0 and y + 4 <= 9):
        if (checkerboard[x - 1][y + 1] == flagch
                and checkerboard[x - 2][y + 2] == flagch
                and checkerboard[x - 3][y + 3] == flagch
                and checkerboard[x - 4][y + 4] == flagch):
            finish = True
            msg()

    # 判断棋子左下方向
    if (x + 4 <= 9 and y + 4 <= 9):
        if (checkerboard[x + 1][y + 1] == flagch
                and checkerboard[x + 2][y + 2] == flagch
                and checkerboard[x + 3][y + 3] == flagch
                and checkerboard[x + 4][y + 4] == flagch):
            finish = True
            msg()
    flagNum *= -1; # 更换下棋者标记
View Code

 

企业编码管理系统

文件结构

python项目开发4个实例

pollcode.py

python项目开发4个实例
import os
import qrcode
import random
import time
import tkinter
from pystrich.ean13 import EAN13Encoder
import tkinter.filedialog
import tkinter.messagebox
from string import digits

root = tkinter.Tk()  # tkinter模4
# 块为python的标准图形界面接口。本代码的目的是建立根窗口
# 初始化数据
number = "1234567890"
letter = "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890"
allis = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+"
i = 0

randstr = []
fourth = []
fifth = []
randfir = ""
randsec = ""
randthr = ""
str_one = ""
strone = ""
strtwo = ""
nextcard = ""
userput = ""
nres_letter = ""


# 创建文件夹函数
def mkdir(path):
    isexists = os.path.exists(path)  # 判断文件夹路径是否存在
    if not isexists:      # 如果文件夹路径不存在
        os.mkdir(path)     # 创建要创建的文件夹


# 读取文件内容函数
def openfile(filename):
    f = open(filename)  # 打开指定文件
    fllist = f.read()   # 读取文件内容
    f.close()           # 关闭文件
    return fllist      # 返回读取的文件内容


# 输入验证函数,showstr为input函数提供动态输入提示文字,showorder提供验证方式,length提供要求输入数据的长度
def inputbox(showstr,showorder,length):
    instr = input(showstr)  # 使用input函数要求用户输入信息,showstr为输入提示文字
    if len(instr) != 0:     # 输入数据的长度不为零
        # 根据输入数据的要求,分成三种验证方式验证,1:数字,不限位数;2:字母;3:数字且有位数要求
        if showorder == 1:  # 验证方式 ,数字格式,不限位数,大于零的整数
            if str.isdigit(instr):    # 验证是否为数字
                if instr == 0:        # 验证数字是否为0,如果是,要求重新输入,返回值为0
                    print("\033[1;31;40m 输入为零,请重新输入!!\033[0m") # 要求重新输入,返回值为“0”
                    return "0"   # 函数返回值为“0”,为什么返回值为“0”呢?读者思考一下
                else:  # 如果输入正确,返回输入的数据给返回值
                    return instr   #将输入的数据传给函数返回值
            else:      # 如果输入不是数字,要求用户重新输入,函数返回值为“0”
                print("\033[1;31;40m输入非法,请重新输入!!\033[0m")  # 要求用户重新输入
                return "0"  # 函数返回值为“0”
        if showorder == 2:  # 验证方式2 ,要求字母格式,且是三个字母
            if str.isalpha(instr): # 判断输入是否为字母
                if len(instr) != length:   # 判断输入的是否为三个字母,如果不是,则要求重新输入,返回值为“0”
                    print("\033[1;31;40m必须输入三个字母,请重新输入!!\033[0m")  # 要求重新输入
                    return "0"  # 返回值为“0”
                else:  # 如果输入是三个字母,返回输入的字母
                    return instr  # 将函数返回值设置为输入的字母
            else:  # 如果输入不是字母
                print("\033[1;31;40m输入非法,请重新输入!!\033[0m")   # 要求重新输入
                return "0"    # 返回值为“0”
        if showorder == 3:   # 验证方式3 ,要求数字格式,且输入数字位数有要求
            if str.isdigit(instr):  # 验证是否为数字
                if len(instr) != length:   # 验证输入数字是否为要求长度位数,如果不是3位数字,则要求重新输入
                    print("\033[1;31;40m必须输入" + str(length) + "个数字,请重新输入!!\033[0m") # 要求重新输入
                    return "0"  # 返回值为“0”
                else:           # 输入数字满足要求,设置函数返回值为输入信息
                    return instr  #设置函数返回值为输入信息
            else:  # 如果输入不是数字
                print("\033[1;31;40m输入非法,请重新输入!!\033[0m")  # 提示输入非法,要求重新输入
                return "0"  # 函数返回值为“0”
    else:   # 如果没有输入任何内容,即输入为空
        print("\033[1;31;40m输入为空,请重新输入!!\033[0m")   # 提示输入为空,要求重新输入
        return "0"    # 函数返回值为“0”


# 实现屏幕输出和文件输出编码信息函数,# sstr参数为输出防伪码数据, sfile为输出的文件名称
# typeis设置输出完成后是否通过信息框提示, smsg为信息提示框的提示文字,datapath 保存防伪码的文件夹
def wfile(sstr, sfile, typeis, smsg,datapath):
    mkdir(datapath)   #  调用该函数创建文件夹
    datafile = datapath + "\\" + sfile   # 设置保存防伪码的文件(包含路径)
    file = open(datafile, 'w')  # 打开保存防伪码的文件,如果文件不存在,则创建该文件
    wrlist = sstr   # 将防伪码信息赋值给wrlist
    pdata = ""      # 清空变量pdata,pdata存储屏幕输出的防伪码信息
    wdata = ""      # 清空变量 wdata , wdata 存储保存到文本文件的防伪码信息
    for i in range(len(wrlist)):  # 按条循环读取防伪码数据
        wdata = str(wrlist[i].replace('[', '')).replace(']', '')   # 去掉字符的中括号
        wdata = wdata.replace(''''','').replace(''''', '')  # 去掉字符的引号
        file.write(str(wdata))    # 写入保存防伪码的文件
        pdata = pdata + wdata     # 将单条防伪码存储到pdata 变量
    file.close()   # 关闭文件
    print("\033[1;31m" + pdata + "\033[0m")   # 屏幕输出生成的防伪码信息
    if typeis != "no":    # 是否显示“输出完成”的信息提示框。如果typeis的值为“no”,不现显示
        # 显示“输出完成”的信息提示框。显示信息包含方位信息码的保存路径
        tkinter.messagebox.showinfo("提示", smsg + str(len(randstr)) + "\n 防伪码文件存放位置:" + datafile)
        root.withdraw()   # 关闭辅助窗口
 # 实现屏幕输出和文件输出编码信息,参数schoice设置输出的文件名称


def scode1( schoice):
    # 调用inputbox函数对输入数据进行非空、输入合法性判断
    incount = inputbox("\033[1;32m     请输入您要生成验证码的数量:\33[0m", 1, 0)
    while int(incount) == 0:  # 如果输入为字母或数字0,则要求重新输入
        incount = inputbox("\033[1;32m     请输入您要生成验证码的数量:\33[0m", 1, 0)
    randstr.clear()       # 清空保存批量注册码信息的变量randstr
    for j in range(int(incount)):   # 根据输入的验证码数量循环批量生成注册码
        randfir = ''       # 设置存储单条注册码的变量为空
        for i in range(6):  # 循环生成单条注册码
            randfir = randfir + random.choice(number)  # 产生数字随机因子
        randfir = randfir + "\n"   # 在单条注册码后面添加转义换行字符“\n”,使验证码单条列显示
        randstr.append(randfir)    # 将单条注册码添加到保存批量验证码的变量randstr
    #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出
    wfile(randstr,"scode" + str(schoice) + ".txt", "", "已生成6位防伪码共计:","codepath")


# 生成9位系列产品数字防伪编码函数,参数schoice设置输出的文件名称
def scode2(schoice):
    ordstart = inputbox("\033[1;32m     请输入系列产品的数字起始号(3位):\33[0m", 3, 3)
    while int(ordstart) == 0: # 如果输入非法(符号、字母或者数字0都认为是非法输入),重新输入
        ordstart = inputbox("\033[1;32m     请输入系列产品的数字起始号(3位):\33[0m", 3, 3)
    ordcount = inputbox("\033[1;32m     请输入产品系列的数量:", 1, 0)
    # 如果输入的产品系列数量小于1或者大于9999,,则要求重新输入
    while int(ordcount) < 1 or int(ordcount) > 9999:
        ordcount = inputbox("\033[1;32m     请输入产品系列的数量:", 1, 0)
    incount = inputbox("\033[1;32m     请输入要生成的每个系列产品的防伪码数量:\33[0m", 1, 0)
    while int(incount) == 0:  # 如果输入为字母或数字0,则要求重新输入
        incount = inputbox("\033[1;32m     请输入您要生成验证码的数量:\33[0m", 1, 0)
    randstr.clear()  # 清空保存批量注册码信息的变量randstr
    for m in range(int(ordcount)):  # 分类产品编号
        for j in range(int(incount)):  # 产品防伪码编号
            randfir = ''
            for i in range(6):  # 生成一个不包含类别的产品防伪码
                randfir = randfir + random.choice(number)  # 每次生成一个随机因子
            randstr.append(str(int(ordstart) + m) + randfir + "\n") # 将生成的单条防伪码添加到防伪码列表
    #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出
    wfile(randstr, "scode" + str(schoice) + ".txt", "", "已生成9位系列产品防伪码共计:","codepath")


# 生成25位混合产品序列号函数,参数schoice设置输出的文件名称
def scode3(schoice):
    # 输入要生成的防伪码数量
    incount = inputbox("\033[1;32m     请输入要生成的25位混合产品序列号数量:\33[0m", 1, 0)
    while int(incount) == 0: # 如果输入非法(符号、字母或者数字0都认为是非法输入),重新输入
        incount = inputbox("\033[1;32m     请输入要生成的25位混合产品序列号数量:\33[0m", 1, 0)
    randstr.clear()  # 清空保存批量注册码信息的变量randstr
    for j in range(int(incount)):  # 按输入数量生成防伪码
        strone = ''     # 保存生成的单条防伪码,不带横线“-”,循环时清空
        for i in range(25):
            strone = strone + random.choice(letter)   #每次产生一个随机因子,也就是每次产生单条防伪码的一位
        # 将生成的防伪码每隔5位添加横线“-”
        strtwo = strone[:5] + "-" + strone[5:10] + "-" + strone[10:15] + "-" + strone[15:20] + "-" + strone[20:25] + "\n"
        randstr.append(strtwo)   # 添加防伪码到防伪码列表
    #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出
    wfile(randstr, "scode" + str(schoice) + ".txt", "", "已生成25混合防伪序列码共计:","codepath")


# 生成含数据分析功能防伪编码函数,参数schoice设置输出的文件名称
def scode4(schoice):
    intype = inputbox("\033[1;32m     请输入数据分析编号(3位字母):\33[0m", 2, 3)
    # 验证输入是否是三个字母,所以要判断输入是否是字母和输入长度是否为3
    while not str.isalpha(intype) or len(intype) != 3:
        intype = inputbox("\033[1;32m     请输入数据分析编号(3位字母):\33[0m", 2, 3)
    incount = inputbox("\033[1;32m     请输入要生成的带数据分析功能的验证码数量:\33[0m", 1, 0)  #
    # 验证输入是否是大于零的整数,判断输入转换为整数值时是否大于零
    while int(incount) == 0:    # 如果转换为整数时为零,则要求重新输入
        incount = inputbox("\033[1;32m     请输入要生成的带数据分析功能的验证码数量:\33[0m", 1, 0)  #
    ffcode(incount,intype,"",schoice)   # 调用 ffcode函数生成注册信息


# 生成含数据分析功能防伪编码函数,参数scount为要生成的防伪码数量,typestr为数据分析字符
# 参数ismessage在输出完成时是否显示提示信息,为“no”不显示,为其他值显示;参数schoice设置输出的文件名称
def ffcode(scount, typestr,ismessage, schoice):
    randstr.clear()  # 清空保存批量注册码信息的变量randstr
    # 按数量生成含数据分析功能注册码
    for j in range(int(scount)):
        strpro = typestr[0].upper()    # 取得三个字母中的第一个字母,并转为大写,区域分析码
        strtype = typestr[1].upper()   # 取得三个字母中的第二个字母,并转为大写,颜色分析码
        strclass = typestr[2].upper()  # 取得三个字母中的第三个字母,并转为大写,版本分析码
        randfir = random.sample(number, 3)  # 随机抽取防伪码中的三个位置,不分先后
        randsec = sorted(randfir)  # 对抽取的位置进行排序并存储给randsec变量,以便按顺序排列三个字母的位置
        letterone = ""    # 清空存储单条防伪码的变量letterone
        for i in range(9):  # 生成9位的数字防伪码
            letterone = letterone + random.choice(number)
        # 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中
        sim = str(letterone[0:int(randsec[0])]) + strpro + str(
            letterone[int(randsec[0]):int(randsec[1])]) + strtype + str(
            letterone[int(randsec[1]):int(randsec[2])]) + strclass + str(letterone[int(randsec[2]):9]) + "\n"
        randstr.append(sim)   # 将组合生成的新防伪码添加到randstr变量
    # 调用wfile()函数,实现生成的防伪码屏幕输出和文件输出
    wfile(randstr, typestr + "scode" + str(schoice) + ".txt", ismessage, "生成含数据分析防伪码共计:","codepath")


# 生成含数据分析功能防伪编码函数,参数schoice设置输出的文件名称
def scode5(schoice):
    default_dir = r"mrsoft.mri"    # 设置默认打开的文件名称

    # 打开文件选择对话框,指定打开的文件名称为"mrsoft.mri" ,扩展名为“mri”,可以使用记事本打开和编辑
    file_path = tkinter.filedialog.askopenfilename(filetypes=[("Text file","*.mri")],title=u"请选择自动防伪码智能批处理文件:",
                                                   initialdir=(os.path.expanduser(default_dir)))
    codelist = openfile(file_path)   # 读取从文件选择对话框选中的文件
    print("前:",codelist)
    codelist = codelist.split("\n")  # 把读取的信息内容添加回车,以便列输出显示
    print("后:",codelist)
    for item in codelist:           # 按读取的信息循环生成防伪码
        codea = item.split(",")[0]   # 每一行信息中用 ","分割,","前面的信息存储防伪码标准信息
        codeb = item.split(",")[1]   # 每一行信息中用 ","分割,","后面的信息存储防伪码生成的数量
        ffcode(codeb, codea,"no" ,schoice)  # 调用ffcode函数批量生成同一标识信息的防伪码


#  后续补加生成防伪码函数,防伪码格式为带数据分析功能注册码
def scode6(schoice):
    default_dir = r"c:\ABDscode5.txt"    # 设置默认打开的文件名称
    # 按默认的文件名称打开文件选择对话框,用于打开已经存在的防伪码文件
    file_path = tkinter.filedialog.askopenfilename(title=u"请选择已经生成的防伪码文件",initialdir=(os.path.expanduser(default_dir)))
    codelist = openfile(file_path)      # 读取从文件选择对话框选中的文件
    codelist = codelist.split("\n")     #  把读取的信息内容添加回车,以便列输出显示
    codelist.remove("")                 # 删除列表中的空行
    strset = codelist[0]                # 读取一行数据,以便获取原验证码的字母标志信息
    remove_digits = strset.maketrans("", "", digits)  # 用maketrans方法创建删除数字的字符映射转换表
    res_letter = strset.translate(remove_digits)  # 根据字符映射转换表删除该条防伪码中的数字,获取字母标识信息
    nres_letter = list(res_letter)   # 把信息用列表变量nres_letter存储
    strpro = nres_letter[0]    # 从列表变量中取得第一个字母,即区域分析码
    strtype = nres_letter[1]   # 从列表变量中取得第二个字母,即色彩分析码
    strclass = nres_letter[2]   # 从列表变量中取得第三个字母,即版次分析码
    # 去除信息中的括号和引号
    nres_letter = strpro.replace(''''','').replace(''''', '') + strtype.replace(
        ''''','').replace(''''', '') + strclass.replace(''''','').replace(''''', '')
    print("sssssssssss",nres_letter)
    card = set(codelist)   # 将原有防伪码放到集合变量card中
    # 利用tkinter的messagebox提示用户之前生成的防伪码数量
    tkinter.messagebox.showinfo("提示", "之前的防伪码共计:" + str(len(card)))
    root.withdraw() # 关闭提示信息框
    incount = inputbox("请输入补充验证码生成的数量:", 1, 0)  # 让用户输入新补充生成的防伪码数量
    # 最大值按输入生成数量的2倍数量生成新防伪码,防止新生成防伪码与原有防伪码重复造成新生成的防伪码数量不够,
    for j in range(int(incount) * 2):
        randfir = random.sample(number, 3)   # 随机产生3位不重复的数字
        randsec = sorted(randfir)            #对产生的数字排序
        addcount = len(card)                  # 记录集合中防伪码的总数量
        strone = ""                           # 清空存储单条防伪码的变量strone
        for i in range(9):                    # 生成9位的数字防伪码
            strone = strone + random.choice(number)
         # 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中
        sim = str(strone[0:int(randsec[0])]) + strpro + str(
            strone[int(randsec[0]):int(randsec[1])]) + strtype + str(
            strone[int(randsec[1]):int(randsec[2])]) + strclass + str(strone[int(randsec[2]):9]) + "\n"
        card.add(sim)  # 添加新生成的防伪码到集合
        # 如果添加到集合,证明生成的防伪码与原有的防伪码没有产生重复
        if len(card) > addcount:
            randstr.append(sim)   # 添加新生成的防伪码到新防伪码列表
            addcount = len(card)  # 记录最添加新生成防伪码集合的防伪码数量
        if len(randstr) >= int(incount):   # 如果新防伪码列表中的防伪码数量达到输入的防伪码数量
            print(len(randstr))            # 输出已生成防伪码的数量
            break                          # 退出循环
    # 调用函数wfile()函数,实现生成的防伪码屏幕输出和文件输出
    wfile(randstr, nres_letter + "ncode" + str(choice) + ".txt", nres_letter, "生成后补防伪码共计:","codeadd")
    # tkinter.messagebox.showinfo("提示", "已生成补充防伪码共:" + str(len(randstr)))    # 提示
    # root.withdraw()


#  条形码EAN13批量生成函数
def scode7(schoice):
    mainid = inputbox("\033[1;32m     请输入EN13的国家代码(3位) :\33[0m", 3, 3)  # 输入3位国家代码
    # while int(mainid) < 1 or len(mainid) != 3:   # 验证输入是否为3位数字(转为整数后小于1和长度不等于3,重新输入)
    #     mainid = inputbox("\033[1;32m     请输入EAN13的国家代码(3位)::\33[0m", 1, 0)
    compid = inputbox("\033[1;32m     请输入EAN13的企业代码(4位):\33[0m", 3, 4)  # 输入4位企业代码
    # while int(compid) < 1 or len(compid) != 4:   # 验证输入是否为4位数字
    #     compid = inputbox("\033[1;32m     请输入EAN13的企业代码(4位):\33[0m", 1, 0)
    incount = inputbox("\033[1;32m     请输入要生成的条形码数量:\33[0m", 1, 0)   # 输入要生成的条形码数量
    while int(incount) == 0:   # 输入信息转为整数后等于0,重新输入
        incount = inputbox("\033[1;32m     请输入要生成的条形码数量:\33[0m", 1, 0)
    mkdir("barcode")  # 判断保存条形码的文件夹是否存在,不存在,则创建该文件夹
    for j in range(int(incount)):   # 批量生成条形码
        strone = ''  # 清空存储单条条形码的变量
        for i in range(5):  # 生成条形码的6位(除国家代码、企业代码和校验位之外的6位)数字
            strone = strone + str(random.choice(number))
        barcode=mainid +compid +strone   # 把国家代码、企业代码和新生成的随机码进行组合
        # 计算条形码的校验位
        evensum = int(barcode[1])  + int(barcode[3])  + int(barcode[5]) + int(barcode[7])  + int(barcode[9])  +int(barcode[11]) # 偶数位
        oddsum =int( barcode[0])+int(barcode[2])+int(barcode[4])+int(barcode[6])+int(barcode[8]) +int(barcode[10])
        # checkbit=int(10-(evensum *3 + oddsum)%10)
        checkbit = int((10 - (evensum * 3 + oddsum) %10)% 10)
        barcode=barcode+str(checkbit)  # 组成完整的EAN13条形码的13位数字
        print (barcode)
        encoder = EAN13Encoder(barcode)  # 调用EAN13Encoder生成条形码
        encoder.save("barcode\\" + barcode  + ".png")  # 保存条形码信息图片到文件


# 本函数生成固定的12位二维码,读者可以根据实际需要修改成按输入位数进行生成的函数
def scode8(schoice):
     # 输入要生成的二维码数量
     incount = inputbox("\033[1;32m     请输入要生成的12位数字二维码数量:\33[0m", 1, 0)
     while int(incount) == 0:  # 如果输入不是大于0的数字,重新输入
        incount = inputbox("\033[1;32m     请输入要生成的12位数字二维码数量:\33[0m", 1, 0)
     mkdir("qrcode")     # 判断保存二维码的文件夹是否存在,不存在,则创建该文件夹
     for j in range(int(incount)):    # 批量生成二维码
        strone = ''   # 清空存储单条二维码的变量
        for i in range(12):  # 生成单条二维码数字
            strone = strone + str(random.choice(number))
        encoder =qrcode.make(strone)  # 生成二维码
        encoder.save("qrcode\\" + strone  + ".png") # 保存二维码图片到文件


#抽奖函数
def scode9(schoice):
   default_dir = r"lottery.ini"    # 设置默认打开文件为开发路径下的"lottery.ini"
   # 选择包含用户抽奖信息票号的文件,扩展名为“*.ini”
   file_path = tkinter.filedialog.askopenfilename(filetypes=[("Ini file","*.ini")],title=u"请选择包含抽奖号码的抽奖文件:",initialdir=(os.path.expanduser(default_dir)))
   codelist = openfile(file_path)  # 调用 openfile()函数读取刚打开的抽奖文件
   codelist = codelist.split("\n")   # 通过回行转义符把抽奖信息分割成抽奖数列
   incount = inputbox("\033[1;32m     请输入要生成的中奖数量:\33[0m", 1, 0)  # 要求用户输入中(抽)奖数量
   while int(incount) == 0  or len(codelist)< int(incount):   # 如果输入中(抽)奖数量等于0或超过抽奖数组数量,重新输入
       incount = inputbox("\033[1;32m     请输入要生成的抽奖数量:\33[0m", 1, 0)
   strone = random.sample(codelist,int(incount))  # 根据输入的中奖数量进行抽奖

   print("\033[1;35m     抽奖信息名单发布:   \33[0m")
   for i in range(int(incount)):  # 循环将抽奖数列的引号和中括号去掉
       wdata = str(strone[i].replace('[', '')).replace(']', '') # 将抽奖数列的中括号去掉
       wdata = wdata.replace(''''','').replace(''''', '')  # 将抽奖数列的引号去掉
       print("\033[1;32m         " +  wdata  + "\33[0m")      # 输出中奖信息


# 输入数字验证,判断输入是否在0-9之间的整数
def input_validation(insel):
    if str.isdigit(insel):
        insel = int(insel)
        # if insel == 0:
        #     # print("\033[1;31;40m    输入非法,请重新输入!!\033[0m")
        #     return 0
        # else:
        #     return insel
        return insel
    else:
        print("\033[1;31;40m       输入非法,请重新输入!!\033[0m")
        return 0

# 企业编码管理系统主菜单
def mainmenu():
    # os.system("clear")
    print("""\033[1;35m
      ****************************************************************
                            企业编码生成系统
      ****************************************************************
          1.生成6位数字防伪编码 (213563型)
          2.生成9位系列产品数字防伪编码(879-335439型)
          3.生成25位混合产品序列号(B2R12-N7TE8-9IET2-FE35O-DW2K4型)
          4.生成含数据分析功能的防伪编码(5A61M0583D2)
          5.智能批量生成带数据分析功能的防伪码
          6.后续补加生成防伪码(5A61M0583D2)
          7.EAN-13条形码批量生成
          8.二维码批量输出
          9.企业粉丝防伪码抽奖
          0.退出系统
      ================================================================
      说明:通过数字键选择菜单
      ================================================================
    \033[0m""")


def codeprint(cstr, cint):
    str1 = cstr[0]
    str2 = cstr[1]
    str3 = cstr[2]
    for i in range(int(cint)):
        strbook = str1 + str2 + random.choice(letter) + random.choice(letter) + random.choice(letter) + str2 + str3
        print(strbook)


# 通过循环控制用户对程序功能的选择
while i < 9:
    # 调入程序主界面菜单
    mainmenu()
    # 键盘输入需要操作的选项
    choice = input("\033[1;32m     请输入您要操作的菜单选项:\33[0m")
    if len(choice) != 0:  # 输入如果不为空
        choice = input_validation(choice)  # 验证输入是否为数字
        if choice == 1:
           scode1( str(choice))      # 如果输入大于零的整数,调用scode1()函数生成注册码
        # 选择菜单2,调用scode2()函数生成9位系列产品数字防伪编码
        if choice == 2:
            scode2(choice)
        # 选择菜单3,调用scode3()函数生成25位混合产品序列号
        if choice == 3:
            scode3(choice)
        # 选择菜单4,调用scode4()函数生成含数据分析功能的防伪编码
        if choice == 4:
            scode4(choice)
        # 选择菜单5,调用scode5()函数智能批量生成带数据分析功能的防伪码
        if choice == 5:
            scode5(choice)
        # 选择菜单6,调用scode6()函数后续补加生成防伪码
        if choice == 6:
            scode6(choice)
        # 选择菜单7,调用scode7()函数批量生成条形码
        if choice == 7:
          scode7( choice)
        # 选择菜单8,调用scode8()函数批量生成二维码
        if choice == 8:
            scode8( choice)
        # 选择菜单9,调用scode9()函数生成企业粉丝抽奖程序
        if choice == 9:
            scode9( choice)
        # 选择菜单0,退出系统
        if choice == 0:
            i = 0
            print("正在退出系统!!")
            break
    else:
        print("\033[1;31;40m    输入非法,请重新输入!!\033[0m")
        time.sleep(2)
View Code

 

学生信息管理系统

文件结构

python项目开发4个实例

studentsystem.py

python项目开发4个实例
# 文件名称:studentsystem.py
# 开发工具:PyCharm
import re  # 导入正则表达式模块
import os  # 导入操作系统模块

filename = "students.txt"  # 定义保存学生信息的文件名


def menu():
    # 输出菜单
    print('''
    ╔———————学生信息管理系统————————╗
    │                                              │
    │   =============== 功能菜单 ===============   │
    │                                              │
    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                     │
    │   6 统计学生总人数                           │
    │   7 显示所有学生信息                         │
    │   0 退出系统                                 │
    │  ==========================================  │
    │  说明:通过数字或↑↓方向键选择菜单          │
    ╚———————————————————————╝
    ''')


def main():
    ctrl = True  # 标记是否退出系统
    while (ctrl):
        menu()  # 显示菜单
        option = input("请选择:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str)
            if option_int == 0:  # 退出系统
                print('您已退出学生成绩管理系统!')
                ctrl = False
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()


'''1 录入学生信息'''


def insert():
    stdentList = []        # 保存学生信息的列表
    mark = True  # 是否继续添加
    while mark:
        id = input("请输入ID(如 1001):")
        if not id:  # ID为空,跳出循环
            break
        name = input("请输入名字:")
        if not name:  # 名字为空,跳出循环
            break
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入Python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值....重新录入信息")
            continue
        stdent = {"id": id, "name": name, "english": english, "python": python, "c": c}  # 将输入的学生信息保存到字典
        stdentList.append(stdent)  # 将学生字典添加到列表中
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":  # 继续添加
            mark = True
        else:  # 不继续添加
            mark = False
    save(stdentList)  # 将学生信息保存到文件
    print("学生信息录入完毕!!!")


# 将学生信息保存到文件
def save(student):
    try:
        students_txt = open(filename, "a")  # 以追加模式打开
    except Exception as e:
        students_txt = open(filename, "w")  # 文件不存在,创建文件并打开
    for info in student:
        students_txt.write(str(info) + "\n")  # 按行存储,添加换行符
    students_txt.close()  # 关闭文件


'''2 查找学生成绩信息'''


def search():
    mark = True
    student_query = []  # 保存查询结果的学生列表
    while mark:
        id = ""
        name = ""
        if os.path.exists(filename):  # 判断文件是否存在
            mode = input("按ID查输入1;按姓名查输入2:")
            if mode == "1":
                id = input("请输入学生ID:")
            elif mode == "2":
                name = input("请输入学生姓名:")
            else:
                print("您的输入有误,请重新输入!")
                search()  # 重新查询
            with open(filename, 'r') as file:  # 打开文件
                student = file.readlines()  # 读取全部内容
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id is not "":  # 判断是否按ID查
                        if d['id'] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name is not "":  # 判断是否按姓名查
                        if d['name'] == name:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                show_student(student_query)  # 显示查询结果
                student_query.clear()  # 清空列表
                inputMark = input("是否继续查询?(y/n):")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息...")
            return


'''3 删除学生成绩信息'''


def delete():
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId is not "":  # 判断要删除的学生是否存在
            if os.path.exists(filename):  # 判断文件是否存在
                with open(filename, 'r') as rfile:  # 打开文件
                    student_old = rfile.readlines()  # 读取全部内容
            else:
                student_old = []
            ifdel = False  # 标记是否删除
            if student_old:  # 如果存在学生信息
                with open(filename, 'w') as wfile:  # 以写方式打开文件
                    d = {}  # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))  # 字符串转字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")  # 将一条学生信息写入文件
                        else:
                            ifdel = True  # 标记已经删除
                    if ifdel:
                        print("ID为 %s 的学生信息已经被删除..." % studentId)
                    else:
                        print("没有找到ID为 %s 的学生信息..." % studentId)
            else:  # 不存在学生信息
                print("无学生信息...")
                break  # 退出循环
            show()  # 显示全部学生信息
            inputMark = input("是否继续删除?(y/n):")
            if inputMark == "y":
                mark = True  # 继续删除
            else:
                mark = False  # 退出删除学生信息功能


'''4 修改学生成绩信息'''


def modify():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
       return
    studentid = input("请输入要修改的学生ID:")
    with open(filename, "w") as wfile:  # 以写模式打开文件
        for student in student_old:
            d = dict(eval(student))  # 字符串转字典
            if d["id"] == studentid:  # 是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:  # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名:")
                        d["english"] = int(input("请输入英语成绩:"))
                        d["python"] = int(input("请输入Python成绩:"))
                        d["c"] = int(input("请输入C语言成绩:"))
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break  # 跳出循环
                student = str(d)  # 将字典转换为字符串
                wfile.write(student + "\n")   # 将修改的信息写入到文件
                print("修改成功!")
            else:
                wfile.write(student)  # 将未修改的信息写入到文件
    mark = input("是否继续修改其他学生信息?(y/n):")
    if mark == "y":
        modify()  # 重新执行修改操作


'''5 排序'''


def sort():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as file:  # 打开文件
            student_old = file.readlines()  # 读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))  # 字符串转字典
            student_new.append(d)  # 将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择(0升序;1降序):")
    if ascORdesc == "0":  # 按升序排序
        ascORdescBool = False           # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True          # 标记变量,为True表示降序排序
    else:
        print("您的输入有误,请重新输入!")
        sort()  
    mode = input("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    if mode == "1":  # 按英语成绩排序
        student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
    elif mode == "2":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
    elif mode == "0":  # 按总成绩排序
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
    else:
        print("您的输入有误,请重新输入!")
        sort()
    show_student(student_new)  # 显示排序结果


''' 6 统计学生总数'''


def total():
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
            if student_old:
                print("一共有 %d 名学生!" % len(student_old))
            else:
                print("还没有录入学生信息!")
    else:
        print("暂未保存数据信息...")


''' 7 显示所有学生信息 '''


def show():
    student_new = []
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
        for list in student_old:
            student_new.append(eval(list))  # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")


# 将保存在列表中的学生信息显示出来
def show_student(studentList):
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \n")
        return
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩"))
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:
        print(format_data.format(info.get("id"), info.get("name"), str(info.get("english")), str(info.get("python")),
                                 str(info.get("c")),
                                 str(info.get("english") + info.get("python") + info.get("c")).center(12)))


if __name__ == "__main__":
    main()
View Code

 

上一篇:色彩缤纷的Python(改变字体颜色及样式)


下一篇:shell编程--变量和if语句的使用