【教学类-29-04】20250808灰色门牌号手写版 6*3、9*5、10*6)题目和答案,输入灰色门牌号和空格。

背景需求

【教学类-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值