
背景需求
【教学类-08-01】20221010《门牌号(6层*3间 黑色版)》(大班主题《我们的城市》)_我们的城市 个别化-CSDN博客文章浏览阅读362次。【教学类-08-01】20221010《门牌号(6层*3间 黑色版)》(大班主题《我们的城市》)_我们的城市 个别化
https://blog.csdn.net/reasonsummer/article/details/127880173?spm=1011.2415.3001.5331
【教学类-08-02】20221021《门牌号(9层*5间 灰色版)》(大班主题《我们的城市》)_门牌号制作模板word-CSDN博客文章浏览阅读685次。这篇博客讲述了作者如何使用Python解决在幼儿园《我们的城市》主题活动中制作门牌号学具遇到的问题。在6*3和9*5的门牌号模板中,作者发现了色彩、随机性和错误输入等问题,并提出了相应的改进方案。通过编写代码,实现了门牌号的随机删除、批量制作和错误模板的利用。在教学过程中,幼儿参与了错误门牌号的修正,体验了不同的难度级别。此外,文章还分享了第二次使用正确模板的教学活动,观察并分析了幼儿在填写数字和绘画过程中的表现,展示了不同程度的理解和创造力。
https://blog.csdn.net/reasonsummer/article/details/127885883?spm=1011.2415.3001.5331
之前做过1.0版本的门牌号,模版里面有灰色数字,随机清空某个格子。

这次我希望用“列表(含空格)写入灰色数字”的方法,见下表,使用4色灰度0,170,192,221来优化学具样式
【教学类-29-04】20250514《门牌号-黏贴版(6层*5间\6层2间)灰底下划线+楼号深黑,房间号浅灰》-CSDN博客文章浏览阅读985次,点赞19次,收藏18次。【教学类-29-04】20250514《门牌号-黏贴版(6层*5间\6层2间)灰底下划线+楼号深黑,房间号浅灰》
https://blog.csdn.net/reasonsummer/article/details/147952023?spm=1011.2415.3001.5331
模版展示

把屋顶的文本框图形改成表格(为了便于写入编号)



代码位置,共三款,两个合并的样式

一、6*3门牌号 空表,写入灰色数字、题目和答案
'''
名称:大班学具:灰色门牌号(手写描字)(题目+答案版)灰色写入非删除 6*3
作者:阿夏
修改:20250809 修复所有Word常量错误,统一使用数值常量
'''
import os, shutil, time
import random
import win32com.client as win32
# Word常量数值定义
WD_ALIGN_PARAGRAPH_LEFT = 0 # 左对齐
WD_ALIGN_PARAGRAPH_CENTER = 1 # 居中对齐
WD_ALIGN_PARAGRAPH_RIGHT = 2 # 右对齐
WD_EXPORT_FORMAT_PDF = 17 # PDF导出格式
# 用户输入
num = int(input('需要多少份教具(30人)\n'))
floor = 6 # 6层
number = 3 # 每层3间
total_cells = floor * number
bl = 0.5
delete = int(total_cells * bl) # 需要清空的数量(题目版)
gray = 192 # 文字灰度(题目版保留数字和答案版原数字)
black = 0 # 文字黑色(答案版填充的原空格数字)
# 生成完整门牌号列表(601-603在最上面)
door_numbers = [
f"{floor_num}{room_num:02d}"
for floor_num in range(floor, 0, -1)
for room_num in range(1, number+1)
]
print('完整门牌号顺序:', door_numbers)
# 创建输出文件夹(新增答案版临时文件夹)
output_dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250808黏贴门牌号'
temp_question_dir = os.path.join(output_dir, '题目临时') # 题目版临时文件夹
temp_answer_dir = os.path.join(output_dir, '答案临时') # 答案版临时文件夹
os.makedirs(temp_question_dir, exist_ok=True)
os.makedirs(temp_answer_dir, exist_ok=True)
# 存储每个题目版的空白位置索引(供答案版使用)
question_indices = {} # 格式:{nn: [空白位置索引列表], ...}
def process_question(nn):
"""生成题目版:随机留空,保留数字为灰色,编号为“编号X”"""
word = None
doc = None
try:
word = win32.Dispatch('Word.Application')
word.Visible = False
template_path = os.path.join(output_dir, f'01_01灰色门牌号模板{floor}乘{number}.docx')
doc = word.Documents.Open(template_path)
first_table = doc.Tables(1)
table = doc.Tables(2)
# 题目版编号:编号X
cell_range = first_table.Cell(1, 2).Range # Word表格索引从1开始
cell_range.Text = f"编号{nn}"
cell_range.Font.Name = "黑体"
cell_range.Font.Size = 30
cell_range.ParagraphFormat.Alignment = WD_ALIGN_PARAGRAPH_LEFT
cell_range.Font.Color = black + (black * 256) + (black * 65536) # 黑色编号
# 生成题目版混合列表(随机留空)
mixed_list = door_numbers.copy()
indices_to_clear = random.sample(range(len(mixed_list)), delete)
for i in indices_to_clear:
mixed_list[i] = ''
# 保存空白位置索引(供答案版使用)
question_indices[nn] = indices_to_clear
print(f"第{nn}份题目版分布:{mixed_list}")
# 填充题目版表格
index = 0
for row in range(1, floor+1):
for col in range(1, number+1):
cell = table.Cell(row, col)
cell_range = cell.Range
cell_range.Text = mixed_list[index]
if mixed_list[index]: # 非空单元格(保留数字)设为灰色
cell_range.Font.Name = "黑体"
cell_range.Font.Size = 80
cell_range.ParagraphFormat.Alignment = WD_ALIGN_PARAGRAPH_CENTER
cell_range.Font.Color = gray + (gray * 256) + (gray * 65536) # 灰色
index += 1
# 保存题目版文件
output_docx = os.path.join(temp_question_dir, f'{nn:03d}.docx')
output_pdf = output_docx.replace('.docx', '.pdf')
doc.SaveAs(output_docx)
# 使用数值常量导出PDF
doc.ExportAsFixedFormat(output_pdf, WD_EXPORT_FORMAT_PDF)
return True
except Exception as e:
print(f"生成第{nn}份题目版时出错:{str(e)}")
return False
finally:
if doc:
doc.Close(SaveChanges=False)
if word:
word.Quit()
def process_answer(nn):
"""生成答案版:填满空格,原空格数字为黑色,原灰色数字保持灰色,编号为“答案X”"""
word = None
doc = None
try:
word = win32.Dispatch('Word.Application')
word.Visible = False
template_path = os.path.join(output_dir, f'01_01灰色门牌号模板{floor}乘{number}.docx')
doc = word.Documents.Open(template_path)
first_table = doc.Tables(1)
table = doc.Tables(2)
# 答案版编号:答案X
cell_range = first_table.Cell(1, 2).Range
cell_range.Text = f"答案{nn}"
cell_range.Font.Name = "黑体"
cell_range.Font.Size = 30
cell_range.ParagraphFormat.Alignment = WD_ALIGN_PARAGRAPH_LEFT
cell_range.Font.Color = black + (black * 256) + (black * 65536) # 黑色编号
# 答案版列表:使用完整门牌号(无空格)
answer_list = door_numbers.copy()
# 获取对应题目版的空白位置索引
indices_to_black = question_indices[nn]
print(f"第{nn}份答案版分布:{answer_list}")
# 填充答案版表格(区分颜色)
index = 0
for row in range(1, floor+1):
for col in range(1, number+1):
cell = table.Cell(row, col)
cell_range = cell.Range
cell_range.Text = answer_list[index]
# 格式统一设置
cell_range.Font.Name = "黑体"
cell_range.Font.Size = 80
cell_range.ParagraphFormat.Alignment = WD_ALIGN_PARAGRAPH_CENTER
# 颜色判断:原空格位置(indices_to_black)设为黑色,其他保持灰色
if index in indices_to_black:
cell_range.Font.Color = black + (black * 256) + (black * 65536) # 黑色
else:
cell_range.Font.Color = gray + (gray * 256) + (gray * 65536) # 灰色
index += 1
# 保存答案版文件
output_docx = os.path.join(temp_answer_dir, f'{nn:03d}.docx')
output_pdf = output_docx.replace('.docx', '.pdf')
doc.SaveAs(output_docx)
# 使用数值常量导出PDF
doc.ExportAsFixedFormat(output_pdf, WD_EXPORT_FORMAT_PDF)
return True
except Exception as e:
print(f"生成第{nn}份答案版时出错:{str(e)}")
return False
finally:
if doc:
doc.Close(SaveChanges=False)
if word:
word.Quit()
# 先生成所有题目版(并记录空白位置)
for nn in range(1, num+1):
process_question(nn)
# 再生成对应答案版(使用题目版的空白位置)
for nn in range(1, num+1):
process_answer(nn)
# 合并题目版PDF
try:
from PyPDF2 import PdfMerger
merger = PdfMerger()
pdf_files = sorted([f for f in os.listdir(temp_question_dir) if f.endswith('.pdf')])
for pdf in pdf_files:
pdf_path = os.path.join(temp_question_dir, pdf)
try:
merger.append(pdf_path)
except PermissionError:
print(f"题目版文件被占用,等待重试: {pdf_path}")
time.sleep(1)
merger.append(pdf_path)
percent = int(bl * 100)
question_pdf_name = f'0101_题目版_填空描字_大班_灰色门牌号{floor}层{number}间_空{percent}%_共{num}份.pdf'
question_pdf = os.path.join(output_dir, question_pdf_name)
merger.write(question_pdf)
merger.close()
print(f'题目版PDF合并完成,保存至:{question_pdf}')
except Exception as e:
print(f"合并题目版PDF时出错:{str(e)}")
finally:
if 'merger' in locals():
merger.close()
# 合并答案版PDF
try:
merger = PdfMerger()
pdf_files = sorted([f for f in os.listdir(temp_answer_d