通过查询教室课表,选择最佳的空教室自习(少换教室) Python 附源码

该博客介绍了一个Python程序,用于查询教室空闲情况并自动选择最佳自习教室。程序读取课表Excel文件,生成三维矩阵表示课程安排,通过判断最少换教室次数来确定自习教室。此外,还讨论了添加GUI界面、筛选特定教室以及打包成exe程序的步骤,遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.思路

通过查询空教室安排出每一天的最佳自行地点
1.读取2个excel文件(实践课教室课表+理论课教室课表)
2.生成一个三维矩阵
3.第一维:星期几(从低到高层直接就对应星期几,一共7层)
4.第二维:第几节课(同第一维方式,一共14层)
5.第三维:哪个教室(331层)
6.开始判断哪个去哪里自习最好。评定标准,首先少换教室,就哪个教室连续空没。其他再看
7.矩阵内的值取0,1分别代表无课,有课

第二阶段:添加GUI

1.元素:
选择星期–选择起始节次-选择结束节次-选择结果条数-选择哪一栋-指定某个教室-帮助-查询-状态显示(请先筛选(黑色)-正在查询(蓝色)-查询结果(success绿色)-请选择星期(error红色))
结果显示
全部使用下拉列表(Combobox为下拉列表控件)的方式
2.将第一阶段分类的结果存入excel文件中,避免每次都要重新分类

第三阶段:筛选掉某些教室(没完全做出来,换成了添加哪栋楼)

即有些教室其实不对所有学生开放(比如实验室),但我又不方便,也不想一个个的自己去删除,只想在用的时候,有闲心将它删除掉。(不过这里貌似应该添加一个增加教室,不过没有原始数据,做不到,要想做的话,就变得更复杂了)

第四阶段:打包成exe程序

1.网上搜索了一下,发现大部分比较推崇pyinstall,那就用它吧
2.安装:打开cmd,在默认路径输入以下命令

C:\Users\**>pip install pyinstaller
Collecting pyinstaller
  Downloading 
  **中间这些信息我省略掉了**
Successfully built pefile
Installing collected packages: pefile, pywin32-ctypes, pyinstaller-hooks-contrib, altgraph, pyinstaller
Successfully installed altgraph-0.17 pefile-2019.4.18 pyinstaller-4.0 pyinstaller-hooks-contrib-2020.8 pywin32-ctypes-0.2.0

3.打包:进入到此 python脚本目录,输入以下命令(-name是给软件命名,-D是指不是生成一个孤零零的exe,而是生成一个(其实是两个build+dist)完整的文件夹,-w是执行软件时不要弹出cmd窗口,-i是给软件添加图标,图标只能用ico格式,推荐一个图片转ico的网址)

F:\jupyPath\myFindEmROOM>pyinstaller --name="FreeRoom" -D -w -i F:\freeRoom.ico  myFindEmptyRoom_GUI.py
2334 INFO: PyInstaller: 4.0
2334 INFO: Python: 3.7.4 (conda)
2334 INFO: Platform: Windows-10-10.0.19041-SP0
2334 INFO: wrote F:\应用\freeRoom\FreeRoom.spec
**中间信息省略了**
569888 INFO: Appending archive to EXE F:\应用\freeRoom\build\FreeRoom\FreeRoom.exe
570050 INFO: Building EXE from EXE-00.toc completed successfully.
570069 INFO: checking COLLECT
570070 INFO: Building COLLECT because COLLECT-00.toc is non existent
570070 INFO: Building COLLECT COLLECT-00.toc
1172665 INFO: Building COLLECT COLLECT-00.toc completed successfully.

4.导入依赖文件,如我这里需要的GUI背景图片,两个数据csv文件(这就不得不说在写代码时,路径使用 ./ 这类当前目录的方法好处了),我里面的文件路径如下:

roomNameList_path='./myFindEmROOM/roomNameList.csv'
ifEmptyMatrix_path='./myFindEmROOM/ifEmptyMatrix.csv'
imgpath ='./myFindEmROOM/freeClassroom.jpg'

所以我在exe程序所在目录下,新建一个myFindEmROOM文件夹,再将三个依赖文件导入进去即可,至于python的模块那些,他自动安装了,不用管。

2.碰到的问题

1.如何设置future Warning不提醒:

import warnings
warnings.filterwarnings('ignore')

2.读取指定单元格时是不算表头的,也就是第二行和第一列索引是0
3.python 'numpy.ndarray转字符串输出
a是ndarray,则
a.str()是str类型了
4.如何对字符串进行查找,切片
.find()方法,切片我这里不需要,因为要删除的都是第一个字符,直接重定义就行了。
5.库pandas写入csv格式文件出现中文乱码问题解决方法
我用excel打开就乱码,用wps打开完全没问题。
6.pandas 取消读取csv时默认第一行为列名
当第一行为有效数据,不可作为列名
给 pd.read_csv() 加上 header=None 即可
7.TclError: image “pyimage2” doesn’t exist
重启程序就ok了
8.无法删除教室,在array类型下,只能将array转为list,删除后再转回来
9.打包成exe后运行报错failed to execute script xxxx.py
看了看是依赖文件没有导入,看我打包的第四步即可。

源码

数据预处理并且存储:

#!/usr/bin/env python
# coding: utf-8

# In[1]:


# 2020.9.7  14:47
# 通过查询空教室安排出每一天的最佳自行地点
# 1.读取2个excel文件(实践课教室课表+理论课教室课表)
# 2.生成一个三维矩阵
# 3.第一维:星期几(从低到高层直接就对应星期几,一共7层)
# 4.第二维:第几节课(同第一维方式,一共14层)
# 5.第三维:哪个教室(331层)
# 6.开始判断哪个去哪里自习最好。评定标准,首先少换教室,就哪个教室连续空没。其他再看
# 7.矩阵内的值取0,1分别代表无课,有课
import warnings
warnings.filterwarnings('ignore')


# In[2]:


import numpy as np
import re
import pandas as pd


# In[3]:


#教室课表文件,这路径啥的我就不暴露了
filePath=r'XXX';
sfilePath=r'XXX';
x=7;#一星期7天
y=14;#一天14节课
z=331;#一共331个教室
ifEmptyMatrix=np.zeros((x,y,z));
roomNameList=[];#创建一个空列表用于存储教室名字
df=pd.read_excel(filePath,keep_default_na=False);
sdf=pd.read_excel(sfilePath,keep_default_na=False);


# In[4]:


roomNameList=[];#创建一个空列表用于存储教室名字
#先得到所有教室的名字并存储在矩阵中
for i in range(0,df.shape[0],18):#一个教室课表占据18行
    data=df.iloc[i].values;
    roomNameList.append(data);
pattern=re.compile('教室(.+?)      所属功能')   #匹配教室与所属功能之间的内容,即教室名字
roomNameList=pattern.findall(roomNameList.__str__())


# In[5]:


#这是判断实践课程
#一天天的判断
for day in range(0,7):
    ###访问所有教室
    for num in range(0,z):
        ##一节课一节课的判断,但每一次搜索都得加一个基础行数
        for section in range(0,14):
            sections=section+18*num+2;
            if df.iloc[sections,day+1]!='':
                ifEmptyMatrix[day,section,num]=1;


# In[6]:


#这是判断理论课程的补充
#一天天的判断
for day in range(0,7):
    ###访问所有教室
    for num in range(0,z):
        ##一节课一节课的判断,但每一次搜索都得加一个基础行数
        for section in range(0,14):
            sections=section+18*num+2;
            if sdf.iloc[sections,day+1]!='':
                ifEmptyMatrix[day,section,num]=1;


# In[7]:


#将教室名字开头的冒号 : 去掉
##这一步必须在评分后面,不然不好识别教室是哪一栋楼
##这一段代码必须首先将名字恢复到第一步切片后,不然不断执行之下会不断切掉第一个字符,就没了
##但实际情况不会不断执行它,所以就算了
for num in range(z):
    roomNameList[num]=roomNameList[num][1:];


# In[8]:


#将分类结果写入文件中,省的每次都要不断分类
#需要存入
#得分数组的从大到小索引排序列表listIndex,,不不不,功能更加丰富就不需要他
#教室名称列表roomNameList
#教室当天详细情况ifEmptyMatrix
roomNameList_path='./myFindEmROOM/roomNameList.csv'
ifEmptyMatrix_path='./myFindEmROOM/ifEmptyMatrix.csv'
import pandas as pd
from pandas import DataFrame


# In[9]:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值