运行效果:
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]: