週間プログラミング②:Pythonで計算ドリルを作ってみよう

コンテンツ
IT・テクノロジー

やりたいこと

今週は小学生くらいの児童向けの計算ドリルを、Pythonで自動生成するプログラムを書いてみましょう。実現したいことは次の2つです。
①足し算の式 (ex 1+1=)を20個ほど作成する
②計算式をpdfに書き出し、印刷できる状態とする。

モジュール類
最終的に作るのはpdfファイルです。まずはpdfを扱うためのモジュールをインポートします。
#乱数を発生させる
import random

#pdfをいじる
from reportlab.pdfgen import canvas
from reportlab.pdfbase.pdfmetrics import registerFont
from reportlab.pdfbase.ttfonts import TTFont

pdfの設定

次に、pdfに書き出すフォントを用意します。適当なttfファイルを用意し、
同じ階層に置いてください
jikasei.me/font/genshin/等

registerFont(TTFont('GenShinGothic', 
                    './fonts/GenShinGothic-Monospace-Light.ttf'))
次にファイル名等の設定をしていきます。
#ファイル名の設定
title = '計算テスト'
#pdfの下地を準備する
pdf = canvas.Canvas(title + '.pdf')
pdf.saveState()
# フォントを設定
pdf.setFont('GenShinGothic', 25)
#タイトルを設定
pdf.drawString(230,780,title)

計算式の作成

ここで1+1=のような文字列を作成する関数を作ります。適当な乱数と問番号(1)等を引数として受け取り (1)1+1= のような文字列を返します・
#計算式を作る関数の定義
def generate_problem(a,b,n):
    s = "({})".format(n) + str(a) + " + " + str(b) + " = "
    return s

pdf出力

最後に、実際にpdfに書き出していきます。
問番号を保持する変数numを用意し、20問を2問ずつ2列で配置するために、2重forループを回します。
num = 1
#計算式を並べていく
for i in range(10):
    for j in range(2):
        seed1 = int(random.uniform(1, 20))
        seed2 = int(random.uniform(1, 20))
        prob = generate_problem(seed1,seed2,num)
        pdf.drawString(210*(j+1)-100,700-i*80,prob)
        num += 1
#図の保存
pdf.showPage()
pdf.save()

プログラム全体

import random
from reportlab.pdfgen import canvas
from reportlab.pdfbase.pdfmetrics import registerFont
from reportlab.pdfbase.ttfonts import TTFont
# フォントを登録
registerFont(TTFont('GenShinGothic',
                    './fonts/GenShinGothic-Monospace-Light.ttf'))
#ファイル名の設定
title = '計算テスト'
#pdfの下地を準備する
pdf = canvas.Canvas(title + '.pdf')
pdf.saveState()
# フォントを設定
pdf.setFont('GenShinGothic', 25)
#タイトルを設定
pdf.drawString(230,780,title)
#計算式を作る関数の定義
def generate_problem(a,b,n):
    s = "({})".format(n) + str(a) + " + " + str(b) + " = "
    return s
num = 1
#計算式を並べていく
for i in range(10):
    for j in range(2):
        seed1 = int(random.uniform(1, 20))
        seed2 = int(random.uniform(1, 20))
        prob = generate_problem(seed1,seed2,num)
        pdf.drawString(210*(j+1)-100,700-i*80,prob)
        num += 1
#図の保存
pdf.showPage()
pdf.save()

以上を実行すると、こんな感じのpdfファイルを作ることができます。
キャプチャ11.PNG


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す