基于Python制作公交车站查询系统

目录
  • 一、设计目的
    • 1、教学目的
    • 2、教学要求
  • 二、需求分析
    • 1、问题
    • 2、系统
    • 3、运行要求
  • 三、系统模块设计
  • 四、详细设计
  • 五、需要设计的函数
  • 六、Python源码
  • 七、运行效果

一、设计目的

1、教学目的

本课程设计是学生学习完《Python程序设计》课程后,进行的一次全面的综合训练,通过课程设计,更好地掌握使用Python语言进行程序设计的方法,加深对Python语言特点和使用Python语言进行程序设计开发过程的理解,加强动手能力。其主要目的是:

(1)进一步培养学生Python程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;

(2)针对Python语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

(3)掌握Python语言的编程技巧和上机调试程序的方法。

(4)掌握程序设计的常用算法。

2、教学要求

(1)要求从所给题目中任选若干个,每个学生必须独立完成课程设计,不能互相抄袭。

(2)设计完成后,对所完成的工作进行答辩。

(3)要求写出一份详细的课程设计报告。

(4)程序设计题目,须提交相应的程序,并需提供加注释的源程序,能正常运行。

二、需求分析

1、问题

根据需求,该系统所应包含的信息有以下一些:

后台用户管理员的基本信息:

账号、密码

各路公交车的基本信息:

每路公交车对应的线路信息

2、系统

采用Python语言实现,开发环境为PythonCharm,可以运行在操作系统windows98及以上皆可。

3、运行要求

界面友好,操作方便,容错性强。

三、系统模块设计

主界面模块:完成系统菜单的显示。

功能选择模块:根据用户的选择,完成其相应的功能。

线路查询模块:根据用户提供的线路,查询该线路所经过的站点。

站点查询的模块:根据用户提供的站点,查询经过该站点的所有线路。

后台管理员的模块:后台管理员可以进行一些操作,例如:删除所有线路、添加线路等

后台管理员的账号系统管理的模块:注册后台管理员的账号和密码。

换乘信息的模块:根据用户提供的起点和终点,帮助用户找到最便捷的路线。

四、详细设计

五、需要设计的函数

主函数。

管理员账号管理界面的函数。

用户登录的函数。

后台管理员界面的函数。

定义修改线路的函数。

判断是否存在线路的函数。

线路查询的函数。

判断站点是否存在的函数。

站点查询的函数。

检查添加线路是否存在的函数。

添加线路的函数。

清楚所有线路的函数。

展示所有线路的函数。

删除线路的函数。

判断是否存在线路的函数。

展示特定线路中的站点的函数。

换乘信息的函数。

判断线路直达的函数。

存储数据的函数。

断站点所在的线路的函数。

六、Python源码

import os
import pickle

def main():  # 主函数
    while True:
        print('-' * 30)
        print('------菜单------')
        print('1.线路查询')
        print('2.站点查询')
        print('3.换乘信息')
        print('4.后台管理员界面')
        print('5.管理员的账号管理界面')
        print('6.退出程序')
        print('-' * 30)
        num = int(input('请选择你的操作:\n'))
        if num == 1:
            line_find()
            continue
        if num == 2:
            site_find()
            continue
        if num == 3:
            change_line()
            continue
        if num == 5:
            manager_account()
            continue
        if num == 6:
            break
        if num == 4:
            manager()
            continue
        else:
            print('请重新做出你的选择!!')

def manager_account():  # 管理员账号管理界面的函数
    def new_():
        file_path = 'D:\公交查询系统\info.pkl'
        a = input('请设置你的账号:')
        b = input('请设置入你的密码:')
        w = input('请再次输入你的的密码:')
        d = {
            'user': a,
            'password': b
        }
        if b == w:
            if os.path.exists(file_path) and os.path.getsize(file_path):
                o = open('info.pkl', 'rb')
                m = pickle.load(o)
                with open('info.pkl', 'ab') as fp:
                    pickle.dump(d, fp)
                print('您已经注册成功!!')
            else:
                with open('info.pkl', 'wb') as fp:
                    pickle.dump(d, fp)
                print('您已经注册成功!!')
        else:
            print('对不起,你两次输入的密码不一致,请您重新输入!!')

    def xiaohui():
        h = open('info.pkl', 'w+')  # 清空文件里的内容。。。
        h.truncate()
        print('你已经销毁成功。。。')

    while True:
        print('-----管理员的账号管理界面------\n'
              '1.注册\n'
              '2.注销原有的所有账户\n'
              '3.退出管理员的账号管理界面')
        choice = input('请做出你的选择:\n')
        if choice == '1':
            new_()
        if choice == '2':
            xiaohui()
        elif choice == '3':
            print('-' * 35)
            print('------菜单------')
            print('1.线路查询')
            print('2.站点查询')
            print('3.换乘信息')
            print('4.后台管理员界面')
            print('5.管理员的账号管理界面')
            print('6.退出程序')
            print('-' * 35)
            break
        else:
            print('请重新做出你的选择')

def login():  # 用户登录的函数
    with open('info.pkl', 'rb') as fp:
        q = input('请输入你的的账号:')
        w = input('请输入你的的密码:')
        while True:
            try:
                data = pickle.load(fp)
                if q == data['user'] and w == data['password']:
                    print('您已经登录成功!!!')
                    return True

            except:
                break

def manager():  # 后台管理员界面的函数
    if login():
        while True:
            print('-' * 30)
            print('-----后台管理员界面-----')
            print('1.添加线路')
            print('2.删除线路')
            print('3.修改线路')
            print('4.查看所有线路')
            print('5.删除所有线路')
            print('6.退出')
            print('-' * 30)
            num = input('请做出你的选择:\n')
            if num == '3':
                revise_line()
                continue
            if num == '1':
                add_line()
                continue
            if num == '6':
                print('-' * 25)
                print('------菜单------')
                print('1.线路查询')
                print('2.站点查询')
                print('3.换乘信息')
                print('4.后台管理员界面')
                print('5.管理员的账号管理界面')
                print('6.退出程序')
                print('-' * 25)
                break
            if num == '5':
                clear_line_all()
                continue
            if num == '4':
                show_line_all()
                continue
            if num == '2':
                num = input('请输入你要删除的线路:\n').strip()
                clear_line(num)
                continue
            else:
                print('请重新做出你的选择...')
    else:
        print('对不起,你登录失败,不可以让您进入后台管理员界面')

def revise_line():  # 定义修改线路的函数
    num = input('请输入您要修改的线路:').strip()
    if check_add_line(num):
        show_line_all()
        tag = input('请确认是否继续修改线路:(1为是,0为否)\n')
        if tag == '1':
            file_path = 'D:\公交查询系统\line_info.pkl'
            a = input('请再次输入要修改的线路:').strip()
            clear_line(a)
            b = input('请输入经过的站点:')
            d = {
                a: {b}
            }
            if os.path.exists(file_path) and os.path.getsize(file_path):
                with open('line_info.pkl', 'ab') as f:
                    pickle.dump(d, f)
                print('您已经修改线路成功!!')
            else:
                with open('line_info.pkl', 'wb') as fp:
                    pickle.dump(d, fp)
                print("您已经修改线路成功了!!!!")
    else:
        print('您要修改的线路不存在,需要创建一个新的线路。。。')
        add_line()

def line_check(num):  # 判断是否存在线路的函数
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                if num in data:
                    print(f'{num}号线的路线经过的站点为{data[num]}')
                    return True
            except:
                break

def line_find():  # 线路查询的函数
    num = input('请输入你要查询的线路:\n').strip()
    if line_check(num):
        pass
    else:
        print('您要查找的线路不存在....')

def site_check():  # 判断站点是否存在的函数
    res = []
    with open('line_info.pkl', 'rb') as fp:
        num = input('请输入你要查询的站点名:\n').strip()
        while True:
            try:
                data = pickle.load(fp)
                # 遍历字典
                for key, value in data.items():
                    ls = str(value)
                    if num in ls:
                        res.append(f'经过{num}站点的线路为{key}号线')
                        continue
            except:
                break
    if res:
        print(res)
        return True
    else:
        return False

def site_find():  # 站点查询的函数
    if site_check():
        pass
    else:
        print('您要查询的站点不存在.....')

def check_add_line(num):  # 检查添加线路是否存在的函数
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                # 遍历字典
                for key, value in data.items():
                    if num in key:
                        return True
            except:
                break

def add_line():  # 添加线路的函数
    file_path = 'D:\公交查询系统\line_info.pkl'
    a = input('请输入添加的线路:').strip()
    b = input('请输入经过的站点:')
    d = {
        a: {b}
    }
    if os.path.exists(file_path) and os.path.getsize(file_path):
        if check_add_line(a):
            print('您要添加的线路已经存在了......')
        else:
            with open('line_info.pkl', 'ab') as f:
                pickle.dump(d, f)
            print('您已经添加线路成功!!')
    else:
        with open('line_info.pkl', 'wb') as fp:
            pickle.dump(d, fp)
        print('您已经添加线路成功了!!')

def clear_line_all():  # 清除所有线路的函数
    h = open('line_info.pkl', 'w+')  # 清空文件里的内容。。。
    h.truncate()
    print('你已经销毁成功。。。')

def show_line_all():  # 展示所有线路的函数
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                # 遍历字典
                for key, value in data.items():
                    print(f'{key}线路经过的站点是{value}')
            except:
                break

def clear_line(num):  # 删除线路的函数
    with open('line_info.pkl', 'rb') as fp:
        ls = []
        while True:
            try:
                data = pickle.load(fp)
                # 遍历字典
                for key, value in data.items():
                    if num in key:
                        print(f'{num}线路已经删除成功!!')
                        pass
                    else:
                        ls.append(data)
            except:
                break
        save_data(ls)

def line_check(num):  # 判断是否存在线路的函数
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                if num in data:
                    print(f'{num}号线的路线经过的站点为{data[num]}')
                    return True
            except:
                break

def show_site(num):  # 展示特定线路中的站点的函数
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                if num in data:
                    return data[num]
            except:
                break

def change_line():  # 换乘信息的函数
    begin = input('请输入你的起点站点:\n').strip()
    end = input('请输入你的终点站点:\n').strip()
    if direct_line(begin, end):
        pass
    else:
        ls = []  # 存储经过起点的线路的全部站点
        ls_ = []  # 存储经过终点的线路的全部站点
        tag = True
        data = check_site(begin, end)
        # print(type(data[0]),type(data[1]))
        print(f'经过{begin}站点的线路为:{data[0]},经过{end}站点的线路为{data[1]}')  # 判断经过起始点和终点的对应线路
        for i in range(len(list(data)[0])):
            ls.append(show_site(data[0][i]))
            print(f"{line_check(str(data[0][i]))}")
        for j in range(len(list(data)[1])):
            ls_.append(show_site(data[1][j]))
            print(f"{line_check(str(data[1][j]))}")
        for i in ls:  # i为集合的形式
            for a in list(i):
                for b in str(a).split():  # 切割字符串
                    if b in str(ls_):  # 判断是否存在相同的站点
                        tag = False
                        print(f"您可以通过从{data[0]}号线的{b}站转到{data[1]}号线来到达目的地!!")
            #             break
            #         break
            #     break
            # break
        if tag:
            print('对不起,无法通过换乘来到达目的地')

def direct_line(begin, end):  # 判断线路直达的函数
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                # 遍历字典
                for key, value in data.items():
                    ls = str(value)
                    if begin in ls and end in ls:
                        print(f'您可以通过{key}号线路直接到达')
                        return True
            except:
                break

def save_data(ls):  # 存储数据的函数
    with open('line_info.pkl', 'wb') as fp:
        for data in ls:
            pickle.dump(data, fp)

def check_site(begin, end):  # 判断站点所在的线路的函数。
    with open('line_info.pkl', 'rb') as fp:
        ls = []
        ls_ = []
        while True:
            try:
                data = pickle.load(fp)
                # 遍历字典
                for key, value in data.items():
                    ls1 = str(value)
                    if begin in ls1:
                        ls.append(key)
                    if end in ls1:
                        ls_.append(key)
            except:
                break
        return ls, ls_

# def help_change_line_info(i, j):
#     with open('line_info.pkl', 'rb') as fp:
#         ls = []
#         ls_ = []
#         while True:
#             try:
#                 data = pickle.load(fp)
#                 # 遍历字典
#                 for key, value in data.items():
#                     ls1 = str(key)
#                     if i in ls1:
#                         ls.append(value)
#                     if j in ls1:
#                         ls_.append(value)
#             except:
#                 break
#         return ls, ls_

if __name__ == 'main':
    main()

main()

七、运行效果

视频链接

到此这篇关于基于Python制作公交车站查询系统的文章就介绍到这了,更多相关Python公交车站查询系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现城市公交网络分析与可视化

    目录 一.数据查看和预处理 二.数据分析 一.数据查看和预处理 数据获取自高德地图API,包含了天津市公交线路和站点名称及其经纬度数据. import pandas as pd df = pd.read_excel('site_information.xlsx') df.head() 字段说明: 线路名称:公交线路的名称 上下行:0表示上行:1表示下行 站序号:公交线路上行或下行依次经过站的序号 站名称:站点名称 经度(分):站点的经度 纬度(分):站点的纬度 数据字段少,结构也比较简单,下面来

  • Python爬虫_城市公交、地铁站点和线路数据采集实例

    城市公交.地铁数据反映了城市的公共交通,研究该数据可以挖掘城市的交通结构.路网规划.公交选址等.但是,这类数据往往掌握在特定部门中,很难获取.互联网地图上有大量的信息,包含公交.地铁等数据,解析其数据反馈方式,可以通过Python爬虫采集.闲言少叙,接下来将详细介绍如何使用Python爬虫爬取城市公交.地铁站点和数据. 首先,爬取研究城市的所有公交和地铁线路名称,即XX路,地铁X号线.可以通过图吧公交.公交网.8684.本地宝等网站获取,该类网站提供了按数字和字母划分类别的公交线路名称.Pyth

  • 利用python爬取城市公交站点

    目录 页面分析 爬虫 数据清洗 Excel PQ 数据清洗 python数据清洗 QGIS坐标纠偏 导入csv文件 坐标纠偏 总结 利用python爬取城市公交站点 页面分析 https://guiyang.8684.cn/line1 爬虫 我们利用requests请求,利用BeautifulSoup来解析,获取我们的站点数据.得到我们的公交站点以后,我们利用高德api来获取站点的经纬度坐标,利用pandas解析json文件.接下来开干,我推荐使用面向对象的方法来写代码. import requ

  • Python爬虫实例_城市公交网络站点数据的爬取方法

    爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup import os headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,

  • Python 通过调用接口获取公交信息的实例

    如下所示: # -*- coding: utf-8 -*- import sys, urllib, urllib2, json city=urllib.quote(sys.argv[1]); url = 'http://apis.baidu.com/xiaota/bus_lines/buses_lines?city=%s&bus=%s&direction=%s'%(city,sys.argv[2],sys.argv[3]) print url req = urllib2.Request(u

  • 基于Python制作公交车站查询系统

    目录 一.设计目的 1.教学目的 2.教学要求 二.需求分析 1.问题 2.系统 3.运行要求 三.系统模块设计 四.详细设计 五.需要设计的函数 六.Python源码 七.运行效果 一.设计目的 1.教学目的 本课程设计是学生学习完<Python程序设计>课程后,进行的一次全面的综合训练,通过课程设计,更好地掌握使用Python语言进行程序设计的方法,加深对Python语言特点和使用Python语言进行程序设计开发过程的理解,加强动手能力.其主要目的是: (1)进一步培养学生Python程序

  • 基于python制作简易版学生信息管理系统

    一.前言 本篇博客对于文件操作.字典.列表.匿名函数以及sort()等内置函数进行了系统的整理操作,以设计一个学生信息管理系统的形式展示,具体概念方法等会在代码后进行分析讲述,请读者仔细分析每一处解析,对于基础巩固将会有很大的帮助,其中还有每一块代码的设计思路图,逻辑分析会有一定的提升. 二.需求分析 本程序需要用到os模板首先导入,并命名要存储信息的文件 import os File_Object_Name = 'Student_Inforation.txt' 三.主函数 def Main()

  • 基于Python搭建人脸识别考勤系统

    目录 介绍 人脸识别的实际应用 构建人脸识别系统的步骤 安装库 导入库 加载图像 查找人脸位置并绘制边界框 为人脸识别训练图像 构建人脸识别系统 人脸识别系统面临的挑战 结论 介绍 在本文中,你将学习如何使用 Python 构建人脸识别系统.人脸识别比人脸检测更进一步.在人脸检测中,我们只检测人脸在图像中的位置,但在人脸识别中,我们制作了一个可以识别人的系统. "人脸识别是验证或识别图片或视频中的人的挑战.大型科技巨头仍在努力打造更快.更准确的人脸识别模型." 人脸识别的实际应用 人脸

  • 基于PyQT5制作一个课堂点名系统

    刷抖音的时候发现一个老师在用的课堂点名系统.用PyQt5实现了一下同款,导入学生姓名,测试了一下完美运行. 操作效果展示: 完整源代码块还是放在了文章的最后面 使用的时候准备好学生姓名的文件,使用导入数据的按钮直接导入就可以开始点名了.新建一个文本文档,将姓名设置设置好,姓名文件示例如下. 使用系统库或者第三方库都比较常规,这里就不一一介绍了. from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore im

  • 基于Python制作一个文件去重小工具

    目录 前言 实现步骤 补充 前言 常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作. 主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过MD5函数的对比筛选出来,最后将重复的文件移除. 实现步骤 用到的第三方库都比较的常见,其中只有hashlib是用来对比文件的不是很常见.其他的都是一些比较常见的第三方库用来做辅助操作. import os # 应用文件操作 import hashlib # 文件对比操作 import logging #

  • 基于Python制作一个文件解压缩工具

    经常由于各种压缩格式的不一样用到文件的解压缩时就需要下载不同的解压缩工具去处理不同的文件,以至于桌面上的压缩工具就有三四种,于是使用python做了一个包含各种常见格式的文件解压缩的小工具. 常见的压缩格式主要是下面的四种格式: zip 格式的压缩文件,一般使用360压缩软件进行解压缩. tar.gz 格式的压缩文件,一般是在linux系统上面使用tar命令进行解压缩. rar 格式的压缩文件,一般使用rar压缩软件进行解压缩. 7z 格式的压缩文件,一般使用7-zip压缩软件进行解压缩. 导入

  • 基于Python制作三款起床闹钟的示例代码

    目录 导语 一.Turtle绘制时钟 1)代码展示 2)效果展示 二.Turtle实现模拟时钟 1)代码展示 2)效果展示 三.简易时钟 1)代码展示 2)效果展示 导语 叮叮叮,我们要按时长大 我是你们的木子同学!当当当当——隆重出场,撒花撒花~ 嗨!大家有没有生物钟不准时的时候,是不是每到休息日或者长假就会经常要倒时差? 每天上班最痛苦的事情就是早起早起早起!这是大部分上班族的痛苦,但是不上班又是不可能的啦,因为都是为了搞钱 今天小编就用代码示例化,给大家展示一下不同的时钟,希望大家按时上班

  • 基于Python制作一个相册播放器

    大家好,我是小F. 对于相册播放器,大家应该都不陌生(用于浏览多张图片的一个应用). 当然还有视频.音乐播放器,同样是用来播放多个视频.音乐文件的. 在Win10系统下,用[照片]这个应用打开一张图片,就可以浏览该图片所在文件夹中其它图片了. 从上面的图中发现,还有不少其它方面的功能,比如图片裁剪.编辑.打印等. 今天小F就带大家学习一个Python制作相册播放器的实战项目. 功能嘛,当然没有系统自带的好,仅做学习哈. 默认5秒切换一张图片,点击向前按钮,可以快速切换到下一张图片. 主要使用到P

  • 基于Python编写一个图片识别系统

    目录 项目介绍 环境准备 程序原理 实现脚本 测试效果 总结 项目介绍 本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Library)是一种免费的图像处理工具包,这个软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转化,色场空间转换(这个我不太懂),图像增强(就是改善清晰度,突出图像有用信息),直方图处理,插值(利用已知邻近像素点的灰度值来产生未知像素点的

  • 基于Python实现商场抽奖小系统

    目录 导语 一.运行环境 二.素材(图片等) 三.代码展示 ​四.效果展示 导语 嘿!下午好,木子来上新啦~ 期待今天的内容嘛?挠头.jpg 日常等更新的小可爱们我来了.看看给大家带来了什么好东西 我是华丽的分隔符 今天早上出门了一趟,话说长沙的天气用一个字形容就是:”热“.二个字形容:”真热“.三个字形容:”热死人“,据说这几天的温度快达到40°了.大家记得做好防晒哦~ 一出门就感受到了太阳的拥抱,泪流满面的做完事情之后跑到商场喝了杯茶颜,然后逛着街吹着免费的空调,巴适的很啊!逛商场的时候看到

随机推荐