运行效果






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 pyinstallerDownloading **中间这些信息我省略掉了**
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]:#存储roomNameList
result_out=[]
result_out.append(roomNameList)
#写入教室当天详细情况
pd.DataFrame(result_out).to_csv(roomNameList_path,mode='a',index=False,header=False)# In[10]:#存储ifEmptyMatrix
for day in range(x):for i in range(z):result_out=[]result_out.append(ifEmptyMatrix[day,:,i])#写入教室当天详细情况pd.DataFrame(result_out).to_csv(ifEmptyMatrix_path,mode='a',index=False,header=False)

GUI界面

#!/usr/bin/env python
# coding: utf-8# In[1]:x=7;#一星期7天
y=14;#一天14节课
z=331;#一共331个教室
#读取分类文件,还原数据
import pandas as pd
import numpy as np
import tkinter as tk
from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image
import tkinter.messagebox
roomNameList_path='./myFindEmROOM/roomNameList.csv'
ifEmptyMatrix_path='./myFindEmROOM/ifEmptyMatrix.csv'
imgpath ='./myFindEmROOM/freeClassroom.jpg'# In[2]:roomNameList=pd.read_csv(roomNameList_path,header=None).iloc[:].values[0]
ifEmptyMatrix_all=pd.read_csv(ifEmptyMatrix_path,header=None)ifEmptyMatrix=np.zeros((x,y,z));
n=0
for day in range(x):for i in range(z):ifEmptyMatrix[day,:,i]=ifEmptyMatrix_all.iloc[n].valuesn=n+1# In[3]:root= Tk()
root.title('空闲教室查询')#背景
canvas = tk.Canvas(root, width=350,height=248,bd=0,cursor='circle')
img = Image.open(imgpath)
photo = ImageTk.PhotoImage(img)
canvas.create_image(0, 0,anchor=NW,image=photo)
canvas.pack()#canvas用pack方法放置,不影响后面按钮的place方法放置# In[4]:####数据转化,将星期几,第几节这些转化为对应的索引
swicher = {              #定义一个map
'星期一':0,
'星期二':1,
'星期三':2,
'星期四':3,
'星期五':4,
'星期六':5,
'星期日':6,
'第1节':0,
'第2节':1,
'第3节':2,
'第4节':3,
'第5节':4,
'第6节':5,
'第7节':6,
'第8节':7,
'第9节':8,
'第10节':9,
'第11节':10,
'第12节':11,
'第13节':12,
'第14节':13,
'选择起始节次':0,
'选择结束节次':13,
'1':1,
'2':2,
'5':5,
'10':10,
'20':20,
'50':50,
'100':100,
'200':200,
'all':331,
'选择结果条数':331,
'选择教学楼':0,
'选择楼层':0,
'选择教室':0
}# In[5]:##查找空教室
def freeRoomList(): ##第一步#数据转化提取day=swicher.get(dayChoose.get(),-1)#哪一天startSec=swicher.get(startSection.get(),-1)#哪节课开始endSec=swicher.get(endSection.get(),-1)#哪节课结束resultN=swicher.get(resultNum.get(),-1)#多少条结果aApartment=swicher.get(apartments.get(),-1)#哪栋楼afloor=swicher.get(aFloors.get(),-1)#哪层楼aroom=swicher.get(aRooms.get(),-1)#哪个教室##第三步##判断有没有指定哪一天if day==-1 and aroom==0:#没有指定且不是查找某一个教室,要报错,提醒:“请选择星期几”aStates.set("请选择星期")aState.config(fg='red')return ##报错了,不再执行空教室查找##第四步改变状态aStates.set("正在查询")aState.config(fg='blue')##第五步# 清空结果列表框resultBox.delete(0, END)#结果索引归0resultIndex=0#第五步#按节次要求等评分###创建一个二维数组存储每个教室的得分scores=np.zeros(z);##第一步判断有没有指定某个教室if aroom==0:#等于0说明没有选择某个教室###访问所有教室##先判断是否有指定哪一栋楼if aApartment==0:###等于0,说明没选哪一栋楼for num in range(z):everyScore=0#只要不是教2,3,4,或者是1楼的都不要,直接排名倒数,因为这些教室必然大概率去不了if roomNameList[num].find("2-")==-1 and roomNameList[num].find("3-")==-1 and roomNameList[num].find("4-")==-1 or roomNameList[num].find("-1")!=-1:scores[num]=0;continue;#判断是否有指定哪层楼if afloor!=0 and roomNameList[num].find(aFloors.get())!=-1:#=0说明选了哪层楼scores[num]=0;continue;##一节课一节课的判断,但每一次搜索都得加一个基础行数for section in range(startSec,endSec):everyScore+=1;if ifEmptyMatrix[day,section,num]==1:everyScore=0;scores[num]+=everyScore;else:for num in range(z):everyScore=0;if roomNameList[num].find(apartments.get())==-1:##不是这栋楼,直接排除,评分为0scores[num]=0;continue;if afloor!=0 and roomNameList[num].find(aFloors.get())==-1:#=0说明选了哪层楼scores[num]=0;continue;##一节课一节课的判断,但每一次搜索都得加一个基础行数for section in range(startSec,endSec):everyScore+=1;if ifEmptyMatrix[day,section,num]==1:everyScore=0;scores[num]+=everyScore;else:for num in range(z):if roomNameList[num].find(aRooms.get())!=-1:##找到了该教室,直接输出,不需要执行后面if day==-1:#没有指定哪一天,就输出一个星期for day in range(x):aResult=str(resultIndex)+":"+roomNameList[num]+":"+str(ifEmptyMatrix[day,:,num])resultBox.insert(END,aResult)resultIndex=resultIndex+1else:resultBox.insert(END,roomNameList[num]+":"+str(ifEmptyMatrix[day,:,num]))#改变状态aStates.set("查询结果")aState.config(fg='green')return###将评分从高到低排序,并输出索引listIndex=[]#肯定指定某一天了,除了输出某个教室的,但那个也无需评分listIndex= np.argsort(scores);#这时从小到大排序listIndex=listIndex[::-1];#倒序则为从大到小##输出结果for i in listIndex[:resultN]:aResult=str(resultIndex)+":"+roomNameList[i]+str(ifEmptyMatrix[day,:,i])resultBox.insert(END,aResult)resultIndex=resultIndex+1#改变状态aStates.set("查询结果")aState.config(fg='green')# In[6]:##帮助说明
def helpUser():tkinter.messagebox.showinfo(title='帮助', message='1.本软件专门用于普通北邮学生查询空闲教室,限于教二教三教四'+'\n'+'2.查询结果的数组中的值,索引就是第几节课,0代表没课,1代表有课'+'\n'+'3.若不是查询指定教室,请务必选择星期几'+'\n'+'4.如果您对本软件如何编写感兴趣,可以看我写的这个博客'+'\n'+'https://editor.csdn.net/md/?articleId=108449498'+'\n'+'5.祝您使用愉快,如有更多问题请至件邮箱916614578@qq.com') # In[7]:##条件选择
#选择星期
dayChoose = tk.StringVar()# 创建一个下拉列表
dayChosen = ttk.Combobox(root, width=12, textvariable=dayChoose,state='readonly')
dayChosen['values'] = ('选择星期','星期一', '星期二', '星期三', '星期四','星期五', '星期六', '星期日')     # 设置下拉列表的值
dayChosen.place(x=10, y=10, anchor=NW)     # 设置其在界面中出现的位置
dayChosen.current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值#选择起始节次
startSection = tk.StringVar()# 创建一个下拉列表
startSections = ttk.Combobox(root, width=12, textvariable=startSection,state='readonly')
startSections['values'] = ('选择起始节次','第1节', '第2节','第3节', '第4节', '第5节', '第6节','第7节', '第8节','第9节', '第10节','第11节', '第12节', '第13节', '第14节')     # 设置下拉列表的值
startSections.place(x=10, y=40, anchor=NW)     # 设置其在界面中出现的位置
startSections.current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值#选择结束节次
endSection = tk.StringVar()# 创建一个下拉列表
endSections = ttk.Combobox(root, width=12, textvariable=endSection,state='readonly')
endSections['values'] = ('选择结束节次','第1节', '第2节','第3节', '第4节', '第5节', '第6节','第7节', '第8节','第9节', '第10节','第11节', '第12节', '第13节', '第14节')     # 设置下拉列表的值
endSections.place(x=10, y=70, anchor=NW)     # 设置其在界面中出现的位置
endSections.current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值#选择结果条数
resultNum = tk.StringVar()# 创建一个下拉列表
resultNums = ttk.Combobox(root, width=12, textvariable=resultNum,state='readonly')
resultNums['values'] = ('选择结果条数','1','2','5','10','20','50','100','200','all')     # 设置下拉列表的值
resultNums.place(x=10, y=100, anchor=NW)     # 设置其在界面中出现的位置
resultNums.current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值# ##选择指定哪栋楼
apartments = tk.StringVar()
apartment = ttk.Combobox(root, width=12, textvariable=apartments)
apartment['values'] = ("选择教学楼", "2-", "3-", "4-")     # 设置下拉列表的值
apartment.place(x=10, y=130, anchor=NW)     # 设置其在界面中出现的位置
apartment.current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值##选择指定楼层
aFloors = tk.StringVar()
aFloor = ttk.Combobox(root, width=12,textvariable=aFloors)
aFloor ['values'] = ("选择楼层", "-2", "-3", "-4")   # 设置下拉列表的值
aFloor .place(x=10, y=160, anchor=NW)       # 设置其在界面中出现的位置
aFloor .current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值# ##选择指定教室
aRooms = tk.StringVar()
aRoom = ttk.Combobox(root, width=12, textvariable=aRooms)
aRoom['values'] = tuple(np.append('选择教室',roomNameList))   # 设置下拉列表的值
aRoom.place(x=10, y=190, anchor=NW)       # 设置其在界面中出
aRoom.current(0)    # 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值# In[8]:# ##核心,查询函数
searchButton = tk.Button(root, text="查询" ,font=("华文行楷", 15),command=freeRoomList)     # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
searchButton.place(x=30, y=215,height=30, width=50,anchor=NW)   # 设置其在界面中出现的位置
##帮助按钮
helpButton = tk.Button(root, text="帮助" ,font=("华文行楷", 15),command=helpUser)     # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
helpButton.place(x=300, y=215,height=30, width=50,anchor=NW)   # 设置其在界面中出现的位置
helpButton.config(fg='green')# In[9]:###结果显示
##添加列表框
resultBox=Listbox(root,height=10,width=30)
resultBox.place(x=120, y=10, anchor=NW)
##添加滚动条
yscrolly=Scrollbar(root,width=15,orient=VERTICAL)
yscrolly.place(x=334, y=10,height=182, anchor=NW)#,padx=(0,0),pady=(250,0),sticky=NS) #grid是一种布局设置
xscrolly=Scrollbar(root,width=15,orient=HORIZONTAL)
xscrolly.place(x=120, y=194,width=215, anchor=NW)
resultBox['yscrollcommand']=yscrolly.set #注意垂直滚动条用yscrollcommand
resultBox['xscrollcommand']=xscrolly.set #注意垂直滚动条用xscrollcommandyscrolly['command'] =resultBox.yview #注意垂直滚动条用yview
xscrolly['command'] =resultBox.xview #注意垂直滚动条用yview# In[10]:##状态显示
aStates = tk.StringVar()
aState = tk.Label(root, textvariable=aStates,font=("华文行楷", 18))
aStates.set("请先筛选")
aState.place(x=160, y=212, anchor=NW) # In[11]:#窗口运行
root.mainloop()

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

  1. 跳转饿了么小程序、跳转美团小程序、获取小程序路径、小程序生成小程序码不能选择第三方小程序、领红包功能开发(附源码)

    先上成果和功能 我做的是随机推荐美食的小程序,食物数据是存库的而且后续会开放给用户新增食物的权限,然后有些小功能就是跳转到饿了么小程序和美团小程序领外卖红包,技术使用uniapp,开发工具是HBuil ...

  2. cesium 3dtiles 加载本地数据_cesium结合geoserver实现地图空间查询(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  3. [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署)

    [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Py ...

  4. java计算机毕业设计飞机航班信息查询系统(附源码、数据库)

    java计算机毕业设计飞机航班信息查询系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclisp ...

  5. java计算机毕业设计公交线路查询系统(附源码、数据库)

    java计算机毕业设计公交线路查询系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe( ...

  6. geoserver三维_cesium结合geoserver实现地图空间查询(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  7. springboot+考研教室管理系统 毕业设计-附源码221757

    摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准 ...

  8. springboot+高校教室排课系统 毕业设计-附源码221556

    springboot高校教室排课系统的设计与实现 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件 ...

  9. [附源码]Java计算机毕业设计SSM高校教室管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

最新文章

  1. 汇编和python-python和汇编语言的区别知识点
  2. excelvba怎么设置不打开文件自动保存_自从有了这个工具,我的Office操作已经快到慢不下来了!(升级篇)...
  3. html input file 修改按钮文字_html单选按钮默认选中怎么做?input标签的单选按钮用法实例...
  4. 西门子主程序调用子程序_S7200Smart 子程序局部变量使用教程
  5. Python绘制三次贝塞尔曲线
  6. Sqlite3 数据库基本操作
  7. awk 系列Part7:awk 怎么从标准输入(STDIN)读取输入
  8. PL/SQL TOAD 不安装Oracle客户端连接数据库的方法
  9. springboot幂等性_springboot + redis + 注解 + 拦截器 实现接口幂等性校验
  10. Sublime Text插件
  11. [精易软件开发工程师Leo学习笔记]011DeBug(调试)
  12. 腾讯云服务器安全加固主机安全基础版和DDoS基础防护内容
  13. IDEA补丁破解使用方法
  14. Vue 实现简单的时间轴 时间进度条
  15. 某金融企业核心存储POC测试及选型经验
  16. HEIF格式怎么转换图片?教你一个小技巧
  17. Dell戴尔笔记本电脑G5 15 5590原装出厂Windows10系统1903恢复原厂oem系统
  18. UE4内存检测工具使用
  19. 试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1序列2”模式的字符序列。其中序列1和序列2都不含字符“”,且序列2是序列1的逆序列。例如,“a+bb+a”是属该模式
  20. 解决微信H5页面软键盘弹起后页面下方留白的问题(iOS端)

热门文章

  1. 「想体验ChatGPT中文聊天?」那快进来,你用不上算我输
  2. 数值分析-秦九韶算法
  3. mysql全模糊_MySQL文模糊检索问题的解决方法
  4. vscode 编译C++ 程序
  5. 简单说 !![]==true 与 []==true 引发的思考 1
  6. pycharm使用SSH连接linux服务器
  7. 利用计算机对指纹ji,指纹识别系统关键算法的研究与实现-计算机应用技术专业论文.docx...
  8. 正则表达式和表单验证
  9. 轻轻轻轻轻轻轻轻轻轻轻轻
  10. 最新微信密友使用方法配合微x模块更完美无需root适合任何安卓手机