您的位置:首页 > 娱乐 > 八卦 > 【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)

【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)

2024/10/4 21:39:59 来源:https://blog.csdn.net/reasonsummer/article/details/141872632  浏览:    关键词:【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)

背景需求:

今天有个客户购买“学号版的数感训练”

我找到文件夹,发现里面没有1-40号的学号数感,只有上学期为重4班制作的1-31号(其中缺了1和7号)的数感训练模版

于是用代码重新生成

【教学类-56-03】数感训练——数字03(寻找自己的学号数字,1号-31号,出现15-20次)-CSDN博客文章浏览阅读614次,点赞12次,收藏9次。【教学类-56-03】数感训练——数字03(寻找自己的学号数字,1号-31号,出现15-20次)https://blog.csdn.net/reasonsummer/article/details/139186744

然后我发现需要生成几百次,才可能会出现一次超过15的可能性

所以查询后,把循环次数从10000增加到15000,提高获取率

代码展示

'''
数感训练-学号1-31,指定数字至少出现10次,学号数字,左上角有灰色的答案
AI对话大师,阿夏
2024年5月22日'''import random
import math
from PIL import Image, ImageDraw, ImageFont
from collections import Counter
import os# 指定数字至少出现几次15-20之间
cs = 10
cs2 = 25
start=1
end=40# 班级没有1号和7号(转学了)
# numbers = [i for i in range(start, end+1) if i not in [1, 7]]
numbers = [i for i in range(start,end+1) ]
print(numbers)path = r'C:\Users\jg2yXRZ\OneDrive\桌面\数字数感训练'input_folder=path+r'\jpg'
os.makedirs(input_folder,exist_ok=True)# 创建画布
canvas_width, canvas_height = 3000, 4000
canvas = Image.new('RGB', (canvas_width, canvas_height), (255, 255, 255))
draw = ImageDraw.Draw(canvas)# 绘制黑色方框
border_color = (0, 0, 0)
border_width = 10gray_color = (200, 200, 200)# 定义左上角数字方框的边界坐标
x1, y1, x2, y2 = 0, 0, 700, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width)# 定义学号数字方框的边界坐标
x1, y1, x2, y2 = 700, 0, 1000, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width)# 定义答案方框的边界坐标
x1, y1, x2, y2 = 700, 0, 1000, 350
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width,)x1, y1, x2, y2 = 700, 350, 1000, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width,fill=gray_color)n = 10
nn = []
for i in numbers:while True:numbers_written = []  # 存储成功绘制的圆圈内的数字# 创建白色画布canvas_color = (255, 255, 255)canvas_inner = Image.new('RGB', (canvas_width, canvas_height), canvas_color)draw_inner = ImageDraw.Draw(canvas_inner)# 将黑色方框复制到白色画布中canvas_inner.paste(canvas, (0, 0))# 在左上角绘制数字text_color = (0, 0, 0)font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改font_size = 500font = ImageFont.truetype(font_path, font_size)if len(str(i))==1:draw_inner.text((230, 100), f'{i}', font=font, fill=text_color)else:draw_inner.text((90, 100), f'{i}', font=font, fill=text_color)# 生成10磅黑线白色圆圈circle_radius = 50circle_border_color = (0, 0, 0)circle_fill_color = (255, 255, 255)border_width = 5circle_distance = 60 + circle_radius * 2  # 圆圈之间的距离bj = 30  # 圆形与边框的距离# 存储圆圈的位置信息,用于检查是否相交circle_positions = []# 阿拉伯数字字体设置number_font_size = 80number_font = ImageFont.truetype(font_path, number_font_size)circle_positions = []numbers_written = []for _ in range(15000):# 数字越大,随机出现指定样式的速度回越快# 生成圆心位置x = random.randint(circle_radius + border_width + bj, canvas_width - circle_radius - border_width - bj)y = random.randint(circle_radius + border_width + bj, canvas_height - circle_radius - border_width - bj)# 排除左上角区域if x <= 1100 and y <= 800:continue# 检查与已有圆圈是否相交is_intersect = Falsefor position in circle_positions:distance = math.sqrt((x - position[0]) ** 2 + (y - position[1]) ** 2)if distance < circle_distance:is_intersect = Truebreakif not is_intersect:# 绘制外圆,边线粗细为10磅outer_circle_radius = circle_radius + border_widthouter_circle_bbox = (x - outer_circle_radius, y - outer_circle_radius, x + outer_circle_radius, y + outer_circle_radius)draw_inner.ellipse(outer_circle_bbox, outline=circle_border_color, width=border_width)# 绘制内圆,填充为白色inner_circle_radius = circle_radiusinner_circle_bbox = (x - inner_circle_radius, y - inner_circle_radius, x + inner_circle_radius, y + inner_circle_radius)draw_inner.ellipse(inner_circle_bbox, fill=circle_fill_color)# 在圆圈内绘制随机生成的阿拉伯数字number = random.choice(numbers)number_width, number_height = draw_inner.textsize(str(number), font=number_font)number_x = x - number_width // 2number_y = y - number_height // 2draw_inner.text((number_x, number_y), str(number), font=number_font, fill=(0, 0, 0))# 将圆圈位置添加至列表circle_positions.append((x, y))numbers_written.append(number)number_counts = Counter(numbers_written)count_10 = number_counts[i]print("实际生成的圆圈数量:", len(circle_positions))print("生成圆圈中的数字:", numbers_written)print("每种数字的数量:", number_counts)print(f"数字 {i} 的数量:", count_10)# 绘制数字 count_10# 在左上角绘制数字text_color = (0, 0, 0)font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改font_size = 180font = ImageFont.truetype(font_path, font_size)if len(str(count_10))==1:draw_inner.text((800, 430), f'{count_10}', font=font, fill=text_color)else:draw_inner.text((760, 430), f'{count_10}', font=font, fill=text_color)if count_10 >= cs and count_10 <=cs2:# 保存为1.pngimage_path = input_folder + fr'\{i:02d}.png'canvas_inner.save(image_path)n += 1breakelse:print(f"数字 {i} 的数量小于 {cs} 次,重新生成圆圈。")# 删除未保存的图片image_path = input_folder + fr'\{i:02d}.png'if os.path.exists(image_path):os.remove(image_path)continue# 合并
import os
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from PyPDF2 import PdfWriter, PdfFileMerger
from PIL import Image
import img2pdfdef convert_images_to_pdf(image_folder, output_path):pdf_merger = PdfFileMerger()for image_file in os.listdir(image_folder):if image_file.endswith('.jpg') or image_file.endswith('.png'):image_path = os.path.join(image_folder, image_file)pdf_path = os.path.splitext(image_path)[0] + '.pdf'# 使用reportlab库将图片转换为单个PDF文件c = canvas.Canvas(pdf_path, pagesize=letter)c.drawImage(image_path, 0, 0, width=letter[0], height=letter[1])c.save()# 使用img2pdf库将图片转换为单个PDF文件# with open(pdf_path, "wb") as pdf_file, open(image_path, "rb") as image_file:#     pdf_file.write(img2pdf.convert(image_file))# 将单个PDF文件添加到PDF合并器中pdf_merger.append(pdf_path)# 合并所有单个PDF文件为一个最终的PDF文件with open(output_path, 'wb') as output_file:pdf_merger.write(output_file)print(f"PDF文件已生成:{output_path}")# 使用示例
image_folder = input_folder  # 替换为你的图片文件夹路径
output_path = path + fr'\中2班 学号数感训练(学号{start}-{end}出现次数{cs}-{cs2}次).pdf'  # 替换为你的输出PDF文件路径convert_images_to_pdf(image_folder, output_path)import shutilos.shutil(input_folder)

结果展示:

做完订单后,我决定用同样方法,制作中2的1-29学号的数感训练学号贴

由于出现15次以上的数感学具,数字圆圈很小,看起来头晕,

所以我考虑做3个难度分层。以适合不同月龄的中班孩子

一、低难度(出现5次-10次)

二、中难度(出现15次-20次)

三、高难度(出现20次-25次)

随着难度增加,获取图片的时间也边长了

现在做了三份,虽然自己学号出现的数量少了,但是圆圈还是一样多。密密麻麻看上去眼晕,

我希望最简单的一款,圆圈多,数字大,圆圈数量少。

需要手动选择那些学号要打印,那些学号跳过,也很不方便。

明天找到幼儿的月龄排序表,重新设计代码,将19年9-12月、20年1-4月,20年1-8月作为三个月龄段,孩子们拿到的是属于自己月龄的难度题。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com