背景需求:
1、项目:
去年上学期给中班、大班孩子做过一个“像素数字图“”的游戏。
【教学类-13-01】20221112《数字色块图5*7*9-A4竖版》(中大班主题《》)
【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)
2、问题:
从作品来看,他们大都用色块区分出四个数字,拍照时,不少孩子询问我:“老师,我写的对吗?”
问题:
因为是代码生成的4位随机数字,我根本不知道他们是否写的正确,只能快速目测来验证。
情况一:一些孩子的数字色块比较清晰整洁,容易辨识。(但清晰的色块也不一定写对,如29的第三个数字E实际是8)
情况2:一些涂色杂乱、不会做、涂色覆盖提示数字的密码纸,让我辨认起来非常费力。最后只能糊弄。
需求:
今年再次尝试在中班做横板的“像素数字密码图”,我不想目测判断幼儿“破译”的正确性,想用电脑程序来判断孩子们写出来的数字的正确性( if ……else……的代码)
思路:
1、提取密码数字:在“数字图-横版”代码,把随机抽取的4个数字密码,写入"密码.xlsx"保存,同时生成PDF打印纸
2、打印破译纸片:打印这套生成的pdf纸张打印出来,横向切割成小纸片(4个数字)
3、判断密码正确:写一个判断程序,如果幼儿输入的四个数字在EXCLE 的密码列表里,就输出大型的“√”,如果输入错误,EXCLE密码列表里没有这个数字,就输出大型的“×”。
4、验证程序exe:因为我不会做UI界面,所以还是采用exe打包代码的方式,在电脑桌面上运行Python程序(黑底白字,文字很小),虽然我知道这种黑底界面操作起来,根本不适合幼儿,但是自身技术不达标,只能先将就一下了。o(╥﹏╥)o)
代码解析:
一、材料准备:
word样式:
使用word模板与下面链接的word模板一致
【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)
二、代码1:生成word学具和EXCEL密码
(一)全部代码
'''
作者:阿夏
时间:2022年11月18日数字像素图(A4横板5*7 8个表 中间一切二横切)
(A4横板排5*7*8 每套两个数字涂成不同的颜色 有括号,要汇总密码))
'''
import os,random
num=int(input('生成多少份\n'))
Number=int(input('抽取几个数字(10个数字中取横板8个(4个一组)\n'))
size=float(input('数字大小(最大28,建议25)\n'))
weight=int(input('表格宽度(5格)\n'))
height=int(input('表格长度高度(7格)\n'))
print('----------第1步:提取所有图案------------')
import random
# m数字位置上的数字
print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
os.mkdir(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\零时Word')
print('----------第3步:随机抽取8个不重复的图案 ------------')
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
# 新建
# 导入库
from openpyxl import Workbook
wb = Workbook()
ws= wb.active
for z in range(0,num): #多少份
m=str(random.randint(0,1)) # 涂色部分数字,数字小 0和1(小数)(只有用0的画,有大量重复,所以加了1)
n=str(random.randint(2,9)) # 非涂色部分数字,2,3,4,5,6,7,8,9 (大数)
N=[]
def same():
for r in range(0,len(nn)):
nn1=int(nn[r][0])
nn2=int(nn[r][1])
for nnn in range(nn1,nn2):
N.append(n)
mm1=int(mm[r][0])
mm2=int(mm[r][1])
for mmm in range(mm1,mm2):
N.append(m)
print(N)
# print(len(N))
# 数字0 的坐标位置列表值
nn=['06','02','01','02','01','02','01','02','06']
mm=['03','01','01','01','01','01','01','03','00']
same()
# 数字1 的坐标位置列表值
nn=['07','04','04','04','04','07']
mm=['01','01','01','01','01','00']
same()
# 数字2 的坐标位置列表值
nn=['06','04','02','02','04','06']
mm=['03','01','03','01','03','00']
same()
# 数字3 的坐标位置列表值
nn=['06','04','02','04','02','06']
mm=['03','01','03','01','03','00']
same()
# 数字4 的坐标位置列表值
nn=['06','01','02','01','02','01','02','03','06']
mm=['01','01','01','01','01','01','04','01','00']
same()
# 数字5 的坐标位置列表值
nn=['06','02','04','04','02','06']
mm=['03','01','03','01','03','00']
same()
# 数字6 的坐标位置列表值
nn=['06','02','04','02','01','02','06']
mm=['03','01','03','01','01','03','00']
same()
# 数字7 的坐标位置列表值
nn=['06','04','04','04','04','06']
mm=['03','01','01','01','01','00']
same()
# 数字8 的坐标位置列表值
nn=['06','02','01','02','02','01','02','06']
mm=['03','01','01','03','01','01','03','00']
same()
# 数字9 的坐标位置列表值
nn=['06','02','01','02','04','02','06']
mm=['03','01','01','03','01','03','00']
same()
Nall=[] # [[],[],[]]的样式
for aaa in range(0,int(len(N)/int(weight*height))): # 把35*10个数字,分割成35一组,35一组,一共10组(0-9)
aaaa=(N[aaa*int(weight*height):aaa*int(weight*height)+int(weight*height)])
Nall.append(aaaa) # 10组的35个数字
print(Nall)
# [['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6',
# '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '1', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '1', '6', '6', '6', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '6', '6', '6', '1', '1', '1', '6',
# '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6']]
print(len(Nall)) # 10个数字
#
# NALL 一共有10个,写出所有索引数字
ss=[]
for o in range(len(Nall)): # 0-9
ss.append(o)
print(ss)
q=random.sample(ss,Number) # 随机抽取8个不重复索引的数字
print(q)
# [3, 7, 9, 6, 1, 0, 8, 4]
nine=[]
for r in range(len(q)):
nine.append(Nall[q[r]])
# # # nine2=random.sample(Nall,Number)
# # # nine=random.sample(Nall,Number) # 从10个中间随机抽8组(排序打乱,数字会少一个)
print(nine)
print(len(nine))
# 把密码写入EXCLE
sin1='{}{}{}{}'.format(q[0],q[2],q[4],q[6])
sin2='{}{}{}{}'.format(q[1],q[3],q[5],q[7])
print('密码1:{}{}{}{}'.format(q[0],q[2],q[4],q[6]))
print('密码2:{}{}{}{}'.format(q[1],q[3],q[5],q[7]))
ws['A{}'.format(z+1)]=sin1
ws['B{}'.format(z+1)]=sin2
# 做成docx学具
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\数字像素图横板8个横切.docx')
for numbg in range(0,len(nine)): # [[],[],[]]的样式的索引数字
# print(num1)
NUMnum=nine[numbg]
print(NUMnum)
# 确定8*4表格的表格单元格坐标(如第1行第1格是0,0 ,第2行第3格是(1,2)
bg=[]
for x in range(0,height):
for y in range(0,weight):
ww='{}{}'.format(x,y)
bg.append(ww)
print(bg)
# ['00', '01', '02', '03', '04', '05', '06', '07', '10', '11', '12', '13', '14', '15', '16', '17', '20', '21', '22', '23', '24', '25', '26', '27', '30', '31', '32', '33', '34', '35', '36', '37']
# 提取表格单元格坐标和图形的坐标
table = doc.tables[numbg] # 一共有9个表格
for t in range(0,len(NUMnum)): # 图案的长度为8*4=32个 遍历0-32(32个)
pp=int(bg[t][0]) # 提取表格bg里面每个元素的第0个数字==单元格X坐标 t=索引数字
qq=int(bg[t][1])
k=NUMnum[t] # 提取list图案列表里面每个图形 t=索引数字
print(pp,qq,k)
run=table.cell(pp,qq).paragraphs[0].add_run(k) # 在单元格0,0(第1行第1列)输入第0个图图案
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(size) #输入字体大小默认30号
run.font.color.rgb = RGBColor(100,100,100) #设置颜色10%黑色=深灰
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\零时Word\{}.docx'.format('%02d'%(z+1)))#保存为XX学号的电话号码word
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/像素图/零时Word/{}.docx".format('%02d'%(z+1))# 要转换的文件:已存在
outputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/像素图/零时Word/{}.pdf".format('%02d'%(z+1)) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
wb.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\四位密码.xlsx')
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
target_path = 'C:/Users/jg2yXRZ/OneDrive/桌面/像素图/零时Word'
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfFileMerger()
for pdf in pdf_lst:
print(pdf)
file_merger.append(pdf)
file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/像素图/(打印合集) 中6班 像素图数字横版横切{}乘{}乘8个({}份).pdf".format(weight,height,num))
file_merger.close()
# doc.Close()
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/像素图/零时Word') #递归删除文件夹,即:删除非空文件夹
(二)重点解析
本文重点解析与下面链接95%内容一致
【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)
区别之处:(加了一个EXCEL保存密码数据)
(三)终端输入
(四)结果展示
生成结果:
1、XLSX-密码合计![](https://i-blog.csdnimg.cn/blog_migrate/2d30bb7d989c34e0a35571171edc1b0a.png)
2、PDF-密码纸
PDF的第1页两个密码与EXCLE第1行两个数字秘密相同,这两个必须是一套。否则后面的验证EXE做不出来。
三、代码2:验证密码正确性
(一)全部代码
import xlrd
import time
workbook=xlrd.open_workbook(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\四位密码.xlsx')
sheet= workbook.sheet_by_index(0)# 第1张工作表
A1=[] # 第1列密码
B1=[] # 第2列密码
# sheet.cell_value(i,0):第i行的第0个元素
for i in range(0,sheet.nrows):
A1.append(sheet.cell_value(i,0))
B1.append(sheet.cell_value(i,1))
# 删除重复
if len(A1)!=len(B1):
print("False")
list=A1+B1
print(list)
for x in range(28):
n=3
for i in range(0,n):
b=input('\n<<<请输入密码(还有{}次机会)>>>\n\n'.format(n))
if b in list:
print('----------------------')
print(' 密码:{} '.format(b))
print(' ✔ ')
print(' ✔ ')
print(' ✔ ')
print(' ✔ ')
print(' ✔ ✔ ')
print(' ✔ ✔ ')
print(' ✔ ')
print(' ')
print(' ')
print(' (* ̄︶ ̄*) ')
print(' ')
print(' 领取礼物 ')
print('----------------------')
print(' ')
print('----下一位开始-----')
break
else:
print('----------------------')
print(' 密码:{} '.format(b))
print(' ✘ ✘ ')
print(' ✘ ✘ ')
print(' ✘ ✘ ')
print(' ✘ ')
print(' ✘ ✘ ')
print(' ✘ ✘ ')
print(' ✘ ✘ ')
print(' ')
print(' ')
print(' o(╥﹏╥)o ')
print(' ')
print(' 再来一次(还有{}次机会) '.format(n-1))
print('----------------------')
n-=1
continue
print(' ')
print('----下次努力-----')
print(' ')
print('----下一位开始-----')
continue
# # time.sleep(2)
# # pass
(二)重点解析
读取提取出来的所有密码
(三)做成EXE
设置打包:
原始路径
修改盘符
查找路径
开始生成EXE
先测试EXCLE密码里面的第1个数字
把EXE复制在桌面上,并确保“4位密码.xlsx”也在桌面的文件夹里,链接不成功,也无法实现验证。
程序都OK了,开始教学吧
教学过程:
时间:2023年4月4日 8:20-8:30
班级:中6班
人数:19人
一、材料准备:
二、学习过程:
没有拍很多,因为第一位孩子已经“破译完成密码”,让老师教怎么用电脑了,后面的教学时间我被拖在电脑旁。保育员阿姨在指导孩子如何写矩形数字。
作品分析:
EXE程序验证界面的截图
作品扫描
完成度分析
第1类:破译正确,括号和右上角都写出数字组
第2类:破译正确,括号写出数字组 (右上角没有)
孩子用记号笔又写了一次答案,(6251)
第3类:破译正确,但没有写出数字组
第4类:破译部分正确 部分数字书写正确(总体判断是不理解)
(正确答案:1982)
(正确答案:9047)
(正确答案:7356)
这位孩子应该是理解的,但是画面涂色的效果效果不明显,幼儿自身也无法说出这些方块结构数字是到底是什么数字
第5类:破译失败,自主绘画(是否与数字大量包含2、3、5、6、9有关)
(正确答案:8236)
(正确答案:2960)
(正确答案:5634)
(正确答案:9523)
由此可以看到学具的完成度情况
序号 | 学习结果 | 数量(份) | 比例 |
1 | 第1类:破译正确,括号和右上角都写出数字组 | 4 | 21.05% |
2 | 第2类:破译正确,括号写出数字组 (右上角没有) | 3 | 15.7% |
3 | 第3类:破译正确,但没有写出数字组 | 5 | 26.31% |
4 | 第4类:破译部分正确 部分数字书写正确 | 3 | 15.7% |
5 | 第5类:破译失败,自主绘画 教师告诉答案 | 4 | 21.05% |
结果显示:幼儿对破译号码的完成度情况如下,共有63.15%的孩子能够破译全部四个号码。另外36.84%的孩子破译有困难(15.7%的孩子破译了1个号码-通常是数字1,21.05%的孩子完全不理解结题方法。)
对上面五类作品进行具体分析:
20230404 中6班 破译4位数字(密码纸) | |||||||||
学号 | 密码 | 姓名 | 学号 | 密码 | 01数字 | 01数字 | 括号 | 括号 | 备注 |
2 | 1904 | 写了一个姓 | √ | 1904 | 4 | 蓝色粗体 | 1904 | 蜡笔红色 | |
4 | 9312 | 空 | √ | 空 | 4 | 紫色+记号笔 | 9312 | 记号笔 | |
7 | 3695 | 空 | √ | 3695 | 4 | 紫、红、粉+记号笔 (四个块面勾边,两个快面加单线) | 3695 | 记号笔 | |
9 | 8294 | 空 | √ | 空 | 4 | 浅绿 | 8294 | 蜡笔绿色 | |
10 | 3672 | 空 | √ | 3572 | 4 | 紫色 2个涂色块 2个勾单线 | 空 | 空 | |
11 | 5436 | 空 | √ | 空 | 4 | 蓝色粗体 第一个数字是红字蓝底 | 空 | 空 | |
12 | 4501 | 空 | √ | 空 | 4 | 红字蓝底 | 10(不是正确的) | 蜡笔蓝色 | |
14 | 8236 | 空 | √ | 空 | 0 | 自己画了0701 | 空 | 空 | 画图案 |
15 | 1982 | 空 | √ | 空 | 1 | 找到部分0并画框记号笔,涂色大红天蓝浅绿 | 1809 | 记号笔 | |
16 | 6251 | 空 | 学号在反面 | 空 | 4 | 第1个字:蜡笔画框红色涂色、第2-4个子,铅笔数字 紫色粉色勾边 | 6221 | 蜡笔黑色 | 镜像数字 |
17 | 7154 | 空 | √ | 空 | 4 | 数字:红绿紫绿 背景:蓝红红紫 | 空 | 空 | |
18 | 9047 | 空 | √ | 空 | 1 | 记号笔边+粉红数字 勾出部分数字 | 空 | 空 | |
19 | 9523 | 空 | √ | 空 | 3 | 2 中1 2 0 记号笔书写+粉红紫色涂色 | 背诵老师告诉的正确答案,默写括号数字952 | 记号笔 | |
21 | 7356 | 空 | √ | 空 | 3 | 红色 线条 735 | 空 | 空 | 镜像学号 |
22 | 1205 | 空 | 空 | 空 | 4 | 紫色的数字,浅蓝深蓝深绿浅绿背景 | 空 | 空 | 双色对比 |
23 | 2960 | 空 | √ | 空 | 0 | 记号笔画小方框 少量蓝色 | 空 | 空 | |
24 | 5634 | 空 | √ | 空 | 0 | 177全涂 粉红色 | 空 | 空 | |
26 | 4701 | 空 | 空 | 空 | 4 | 黄黄黄粉 粗体 | 空 | 空 | |
27 | 8340 | 空 | √ | 8340 | 4 | 黄色粗体 | 8340 | 蜡笔蓝色 |
通过学号来看,发现一个显著的规律:
1、性别差异显著:女孩在辨识X与0、X与1的能力比男孩强。本次活动中,第4、5类未完成不正确的7位孩子中仅有1位女孩(她只有一题错误),其他都是男孩。
2、绘线方式多元:示范时讲解了画线了、勾边法、画小框法等等,孩子分别用记号笔、铅笔、蜡笔进行了各种绘线尝试,不少作品中有几种样式的展示。大部分孩子只来得及找出数字,2位孩子尝试对背景进行涂色。
3、图形结构差异:本次单元格内的方形数字和幼儿日常绘画的圆形数字有差异,这是导致幼儿无法看到数字的一个原因,从7份作品中,看到1位女孩画出了模糊的数字外形,但无法与圆形数字关联(说不出是什么数字),其他6位男孩的随机密码中大量包含2、3、5、6、9的数字,这些数字的细微差异(哪一条线封闭、哪一条线打开、中间包含格子)影响幼儿的理解、涂色。
第2部分:输入号码及验证: (EXE打包)
(为了便于幼儿输入数字和回车按钮,我装了一个会计数字键盘)![](https://i-blog.csdnimg.cn/blog_migrate/c07d56567c4f623653ee2414cd24df4a.png)
这位女孩说习惯于按26格键盘上的数字:“这个是从1开始的”(孩子适应从左到右的顺序找数字)
会计键盘上的数字是3*3=9格排列,幼儿要找一会儿才能找到正确的数字
分析:19位孩子都拿着完成或者没有完成的密码纸排队等候验证(为了拿小礼物——便利贴)
1、女孩的完成度很高,2位女孩在排队时观察教师指导其前面幼儿的过程,因此自己输入时很流畅。
2、虽然不少男孩找不到数字,但他们也排队,或者沉默、或者主动求助老师:”你告诉我答案吧“”我不知道!“(为了礼物拼了!)。所有孩子都体验了一次如何用键盘输入密码的过程,了解如何按键,以便下一次活动参与答案验证(机器验证)
3、孩子们对便利贴礼物很喜爱——“这是找数字,电脑里对了,老师奖给我们的!“他们一有空,就把口袋里的便利贴拿出来摆弄。
4、一位女孩的4个数字画的很清晰,但是输入后显示错误,老师仔细看了,发现其中的5其实是6,这是唯一一位出现错误,并验证第2次的孩子。
感悟:
本次活动中,我再次感受到90后家长在培养20后的孩子方面的力度(好”卷“),
孩子们对于破译密码(画图),玩电脑(验证)、拿礼物(炫耀)有兴趣(礼物是重点),以自己的能力水平,去完成作业。
比如,那些不理解的题意的孩子,也没有空着,而是尝试画了几个数字或者图案,尽量贴近教师的要求(破译方形结构的数字)
可见孩子们都有强烈的自我学习动机是(大家都没有浪费时间,都在做事)。
因此:
设计人手一份的纸类学具,不仅可以让孩子们在游戏中反复进行前书写练习(数字、文字),还能在绘画勾线涂色中认识数字和文字更多的字体造型,加上人机互动学具的运用(电脑输入验证),可以进一步满足学习目标(验证),提升幼儿对于电子产生的学习兴趣。也提升教师的教学效率。
联想:
几天前,有一位孩子向我感叹:”我妈妈说,你好厉害!能想出这么多的数字(玩具)!“
午睡时,我在笔记本电脑编写”周计划转移“的代码(VS code),一位上厕所的男孩路过看到了,也说:”老师,你在工作吗?我爸爸的电脑上也是这样子的(黑底白代码)!“
……