プログラム自動生成支援による「親子で学ぶパイソンプログラム入門」

株式会社ユーサイドシステム

1第１章パイソンについて
１．はじめに2

２．ＩＣＴ教育遅れの実態

３．パイソンの特徴

3４．パイソン言語のインストール（１）外部リムーバルデスクを G に変更

4

（２）パイソン言語のバージョン（３）入門編環境ダウンロード

5idle.bat,login.bat,pythonseisei.bat（４）ｐｉｐコマンドについて

6

第２章パイソンによるシンプルプログラミング
１．変数と計算

789２．当マニュアルでの文法の扱いについて

３、演算子

10

４．Ｉｎｐｕｔ、Ｐｒｉｎｔコマンドによる四則計算

11

（１）足し算# tasizan.py
print('＊＊ ２項目足し算 ＊＊')
a=input('変数 a に数値を入力します=') #input 入力した値は文字になります。
b=input('変数 b に数値を入力します=')
c=a+b
print('答えは='+c)12c=int(a)+int(b)print('答えは='+str(c))

１

1

13

tasizan1（２）引き算#hikizan.py
print('＊＊ ２項目引き算 ＊＊')
a=input('変数 a に数値を入力します=')b=input('変数 b に数値を入力します=')
c=int(a)-int(b)print('答えは='+str(c))

14（３）掛け算#kakezan.py
print('＊＊ ２項目掛け算 ＊＊')
a=input('変数 a に数値を入力します=')b=input('変数 b に数値を入力します=')
c=int(a)*int(b)print('答えは='+str(c))（４）割り算#warizan.py
print('＊＊ ２項目割り算 ＊＊')
a=input('変数 a に数値を入力します=')b=input('変数 b に数値を入力します=')
c=int(a)/int(b)print('答えは='+str(c))

15print(type(c))

print('答えは='+str(int(c)))

Python//%（５）プログラム的思考について

16

mod

#sample1.py
a=int(input('二桁の数字 a '))b=int(input('二桁の数字 b '))#a の 1 の位を求め、その値を a1 とし、10 の位を a10 とします。
a10=int(a/10)*10
a1=a-a10#b の 1 の位を求め、その値を b1 とし、10 の位を b10 とします。
b10=int(b/10)*10
b1=b-b10#合計を c とし以下の計算式で求めます。
c=b1 *a1+b1*a10+b10*a1+b10*a10
print('答えは'+str(c))

117

#sample2.py
print('＊＊ 足し算による掛け算 ＊＊')
a=int(input('二桁の数字 a '))b=int(input('二桁の数字 b '))c=0
for i in range(b): # i は 0 から始まり、回数をカウントしている変数#range は()の中の b-1 になるまで繰り返し
c=c+a
print('答えは'+str(c))

for i in range(a):c=c+b#sample3.py
print('＊＊ 引き算による割り算 ＊＊')
a=int(input('二桁の割られる数字 a '))b=int(input('二桁の割る数字 b '))syo=0
amari=awhile amari>=b: #amari>=b の間繰り返しますsyo=syo+1
amari=amari-b
print(amari)print(syo)print('商＝'+str(syo))print('余り＝'+str(amari))18

５．ｆｏｒ、ｗｈｉｌｅコマンドによる繰り返しとｉｆコマンドによる判断処理（１）エラー回避処理#sample4.py
err =1#エラーを判断する変数 err を用意し、予めエラー判断の 1 をセット
while err==1: #エラーの間繰り返します。
#try は except の対で使用します。入力値に文字が含まれ int 変換で19

#エラーになった場合に except にいきます。エラー表示し err は 1 の#ままですので、while err==1 により元に戻り a の再入力になります。
try :a=int(input('二桁正の数字 a '))if a>=10 and a<=99:#a は 10 から 99 の値を許容します。
err=0#この条件により入力範囲を設定します。
else:
print('入力値が正の２桁数字でありません。a を再入力します。')
except:print('入力値が空値か文字が含まれています。a を再入力します。')
err =1
while err==1:
try :
b=int(input('二桁正の数字 b '))if b>=10 and b<=99:
err=0
else:
print('入力値が正の２桁数字でありません。b を再入力します。')
except:print('入力値が空値か文字が含まれています。b を再入力します。')
c=0
for i in range(int(b)): # i は 0 から始まり、回数をカウントしている変数#range は()の中の値－１になるまで繰り返します
print(str(i))#念のため i の値をプリントしてみます
c=c+int(a)print('答えは'+str(c))

1

二桁正の数字2011

try :
a=int(input('二桁正の数字 a '))if a>=10 and a<=99: #a は２桁の正の値を許容します。
err=0#この条件により入力範囲を設定します。
else:
print('入力値が正の２桁数字でありません。a を再入力します。')
入力値が数値でありません。a を再入力します。

入力値が数値でありません。a を再入力します。
print(e)（２）関数記述１#sample5.py
def suujinyuryoku(message,hensu):
err =1
while err==1:
try :
x=int(input(message+hensu))
if x>=10 and x<=99:
err=0
return(x)else:
print('正の２桁数字でありません。'+hensu+'を再入力します。')
except:print('入力値が空値か文字があります。'+hensu+'を再入力します。')#メイン
a=suujinyuryoku('二桁正の数字' ,'a')b=suujinyuryoku('二桁正の数字' ,'b')21

c=0
for i in range(int(b)):
c=c+int(a)print('答えは'+str(c))（３）オブジェクト志向とｃｌａｓｓ（４）変数値の有効範囲（スコープ）について

11#sample11.py#メインと関数での変数扱い
def sub1():
global a
global b
a=20
b='xyz'def sub2():
a=40
b='bbbbb'
def sub3(a,b):a1=a+40b1=b+'cccc'
return a1,b1
#メイン
22

a=10
b='abcd'
print('メイン変数')
print('a='+str(a))
print('b='+b)
print('')
print('sub1 が global 変数の場合')
sub1()
print('a='+str(a))
print('b='+b)
print('')
print('sub2 が global 変数でない場合')
sub2()
print('a='+str(a))
print('b='+b)
print('')
print('sub3 に引数を渡し、リターン値で戻す場合')
a,b=sub3(a,b)
print('a='+str(a))
print('b='+b)６．変数の型

23

（１）リスト型変数#sample12.py
def suujinyuryoku(message):err =1
while err==1:
try :
x=int(input(message+'= '))if x>=0 and x<=100:24err=0
return(x)else:
print('０から百の数字でありません。')
except:print('入力値が空値か文字があります。再入力します。')#メインkyouka=['国語','算数','理科','社会','英語']
tensu=[]
for i in range(len(kyouka)):tensu.append(suujinyuryoku(kyouka[i]))print('tensu 配列の値確認')
for i in range(len(kyouka)):print(kyouka[i]+':'+str(tensu[i]))７．ランダム関数を使った種々のプログラム作成#sample13.py
import random
for i in range(10):x = random.randint(0,10)
print(str(i)+'='+str(x))#sample14.py
import random
def kekkadsp(x,y,katimake):
if x == 1:25

pc = ' グー'
if x == 2:
pc = 'チョキ'
if x == 3:
pc = 'パー'
if y == '1':
you = ' グー'
if y == '2':
you = 'チョキ'
if y == '3':
you = 'パー'
kekkamsg = 'パソコン＝'+ pc + ' あなたは＝' + you
print( kekkamsg + ' ' + katimake)# maine = 0kati = 0
make = 0
aiko = 0
print('＊＊ ジャンケン ＊＊')
print('')
while e == 0:x = random.randint(1,3)
y = input('０：終了、１:グー、２:チョキ、３:パー = ' )if y == '0':e = 1
print('総回数＝'+str(kati+make+aiko))print('勝ち数＝'+str(kati))
print('負け数＝'+str(make))
print('勝率 ＝'+str(kati*100/(kati+make))+'%')
elif x == 1 and y == '2':
make = make + 1
katimake = '負け'
kekkadsp(x,y,katimake)elif x == 1 and y == '3':
kati = kati + 1
katimake = '勝ち'
kekkadsp(x,y,katimake)elif x == 2 and y == '1':
kati = kati + 1
katimake = '勝ち'
kekkadsp(x,y,katimake)elif x == 2 and y == '3':
make = make + 1
katimake = '負け'
kekkadsp(x,y,katimake)elif x == 3 and y == '1':
make = make + 1
katimake = '負け'26

kekkadsp(x,y,katimake)elif x == 3 and y == '2':
kati = kati + 1
katimake = '勝ち'
kekkadsp(x,y,katimake)elif str(x) == y:aiko = aiko + 1
katimake = 'あいこ'kekkadsp(x,y,katimake)else:
print('再度１，２、３の数字を入力します！')#sample15.py
import random
print('＊＊ 福引 ＊＊')
itou=0nitou=0
santou=0
hazure=0
for i in range(100):x = random.randint(1,100)
print(str(x))
if x<=5:
print('一等賞')
itou=itou+1
elif x>=11 and x<=20:
print('二等賞')
nitou=nitou+1
elif x>=21 and x<=40:
print('三等賞')
santou=santou+1
else:
print('はずれ')hazure=hazure+1# y=input('確認＝')# if y=='e':#
breakprint('')
27

print('結果数')
print('一等＝'+str(itou)+'件')
print('二等＝'+str(nitou)+'件')
print('三等＝'+str(santou)+'件')
print('ハズレ＝'+str(hazure)+'件')#sample16.py
import random
print('＊＊ 福引 ＊＊')
itou=0nitou=0
santou=0
hazure=0
dedama=[]for i in range(100):#同じ玉が出ないような処理を施す
err = 1
while err == 1:
x = random.randint(1,100)
dubuli = 0
for j in range(len(dedama)):
if dedama[j] == x:
dubuli = 1
break
if dubuli == 0:
dedama.append(x)err = 0
print(str(i+1)+'個目 ' + str(x))
if x<=5:
print('一等賞')
itou=itou+1
elif x>=11 and x<=20:
print('二等賞')
nitou=nitou+1
elif x>=21 and x<=40:
print('三等賞')
santou=santou+1
else:
28

print('はずれ')hazure=hazure+1
y=input('確認＝')
if y=='e':
break

#
#
#
print('')
print('結果数')
print('一等＝'+str(itou)+'件')
print('二等＝'+str(nitou)+'件')
print('三等＝'+str(santou)+'件')
print('ハズレ＝'+str(hazure)+'件')#sample17.py
import random
def nyuryoku(message,koumoku):
err =1
while err==1:
try :
x=input(message)
if koumoku=='sisoku':
if x=='+' or x=='-' or x=='*' or x=='/':
err=0
return x
else:
print('入力値に間違い、再入力')
if koumoku=='keta':
if x=='1' or x=='2' or x=='3':
err=0
return x
else:
print('入力値に間違い、数値は３以内 再入力')
if koumoku=='keisan':try:
int(x)
err=0
return int(x)except Exception as e:
print(e)except Exception as e:
print(e)def warizanseisuti(atai):29

#割り算の場合は、余りの出ないような問題を作成します。
err = 1
while err == 1:
try :atai1 = int(atai/10)
x = random.randint(1,atai)y = random.randint(1,atai1)
if x < y:pass
if (x % y) == 0:
err = 0
return str(x)+':'+str(y)
else:
pass
except:print('eee'+str(x)+':'+str(y))
pass
#メイン
print('＊＊ 自動四則演算 ＊＊')
print('')
sisoku = nyuryoku('四則区分(+,-,+,/)＝ ','sisoku')
keta = nyuryoku('桁数＝ ','keta')
if keta=='1':
atai=9if keta=='2':
atai=99
if keta=='3':
atai=999
seikai = 0
huseikai = 0
print('')
for i in range(10):if sisoku == '/':
xy = warizanseisuti(atai)
xy1=xy.split(':')
print(xy)x = int(xy1[0])y = int(xy1[1])else:x = random.randint(1,atai)y = random.randint(1,atai)suti=nyuryoku('第'+str(i+1)+'問 '+str(x)+sisoku+str(y)+'= ','keisan')if sisoku == '+':
kotae = x + y
if sisoku == '-':
kotae = x - y
if sisoku == '*':
kotae = x * y30

if sisoku == '/':
kotae = x / y
if suti == kotae:
seikai = seikai + 1〇')
print('
if suti != kotae:
huseikai = huseikai + 1
print('✕' + ' ' + str(kotae))print('成績＝'+str(seikai*10)+'点')

８．プログラムチェック記述とデバック作業

31

９．標準化、部品化について

1

32

#CSV ファイルのリード
def csvread(fl,read_type):#fl:ＣＳＶファイル#read_type:dict=辞書形式,list=ｌｉｓｔ形式

try:with open(fl, mode='r') as f:reader = csv.reader(f)if read_type=='dict':
dict_csv = {rows[0]:rows[1] for rows in reader}
return dict_csv
if read_type=='list':
list_csv = [e for e in reader]
return list_csv
except FileNotFoundError:
print('該当ファイルなし')
return('error')
except csv.Error as e:
print(e)return ('error')
except Exception as e:
print(e)return ('error')#CSV ファイルの書出し
def csvwrite(fl,csvhairetu,mode):try:#CSV の書き出し(w：ファイルの上書きを指定、a:追加)
with open(fl, mode, newline='') as f:writer = csv.writer(f)33writer.writerows(csvhairetu)
return ''except csv.Error as e:
return e
except Exception as e:
return e
except Exception as e:
return e

113#sample18.py
import kyoutuu
import csv
def nyuryoku(check,sekijidata):
global seiseki
err =1
while err==1:
try :
x=input(check[1]+'= ')splt=check[5].split(':')
min=splt[1]splt=check[6].split(':')
max=splt[1]if (check[0]=='sekiji' and (x in sekijidata)==False):
print('該当席次はありません！')else:
msg=kyoutuu.datacheck(x,check[1],check[2],check[4],min,max)
if msg=='':
if check[0]=='sekiji' and seiseki!=[]:
msg1=''
for i in range(len(seiseki)):record=seiseki[i]sekijino=record[0]if sekijino.count(x)>0:
msg1='同一席次登録済み'
if msg1=='':
err=0
return x
else:
print(msg1)
else:
err=0
return x
else:
print(msg)34

except Exception as e:
print(e)def kakidasimode():err =1
while err==1:
try :
x=input('書出しモード(w/a)= ')if x=='w' or x=='a':err=0return x
else:
print('w or a でない！')
except Exception as e:
print(e)# 席次データをＣＳＶファイルより読込ます。
def csvdataread():try:
with open('G:\Python38\kaihatu\csvdata\sekiji.csv') as f:reader = csv.reader(f,skipinitialspace=True)
reader_list = [e for e in reader]
return reader_list
except FileNotFoundError:
print('G:\Python38\kaihatu\csvdata\sekiji.csv ファイルがありません！')
except csv.Error as e:
print(e)return [[]]
#メイン
#以下で一人分のデータの入力条件を定義します。
check= [\['sekiji','席次','符号無整数','in_out:in','hissu:y','min:1','max:30'],\['simei','氏名','全角文字','in_out:out','hissu:y','min:','max:'],\['kokugo','国語','符号無整数','in_out:in','hissu:y','min:0','max:100'],\['sansu','算数','符号無整数','in_out:in','hissu:y','min:0','max:100'],\['rika','理科','符号無整数','in_out:in','hissu:y','min:0','max:100'],\['syakai','社会','符号無整数','in_out:in','hissu:y','min:0','max:100'],\]#席次ｃｓｖデータを辞書型で読みます。
sekijidata=kyoutuu.csvread('G:\Python38\kaihatu\csvdata\sekiji.csv','dict')
if sekijidata=='error':print('席次データ読込エラー。プログラムを終了します。')
elif len(sekijidata)==0:
print('席次データがありません。')
else:record=[] #一人分の点数データ
seiseki=[] #全生徒の成績データ
print('＊＊ 成績データ入力 ＊＊')
35

for j in range(len(sekijidata)):print('')
for i in range(len(check)):
in_out=check[i][3].split(':')
if in_out[1]=='in':x=nyuryoku(check[i],sekijidata)
sekijino=x
if in_out[1]=='out' and check[1][0]=='simei':x=sekijidata[sekijino]
print(check[i][1]+'= '+x)
record.append(x)seiseki.append(record)
record=[]mode=kakidasimode()
msg=kyoutuu.csvwrite('G:\Python38\kaihatu\csvdata\seiseki.csv',seiseki,mode)
print(msg)

１０．インターネットデータによるグラフ作成（1）気温データの折れ線グラフ#sample8.py# 折れ線グラフを出力
import numpy as np#import 文で numpy パッケージを取込ます
import matplotlib.pyplot as plt#import 文で matplotlib パッケージを取込ますfrom matplotlib import rcParams
rcParams['font.family'] = 'sans-serif' #漢字が使えるように設定
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro',\'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic',\'VL PGothic', 'Noto Sans CJK JP']
plt.title("東京平均気温")
plt.xlabel("月")plt.ylabel("気温")plt.grid(True)#格子を印字h=float(50/119)
x=np.array([1, 2, 3, 4, 5 ,6 ,7 , 8 ,9 ,10 ,11 ,12])y1=np.array([1.6,3.1,5.7,11.4,17.3,19.3,22.8,26.1,22.6,16.5,11.0,5.5]) #1900 年月別平均気温
y2=np.array([5.6,7.2,10.6,13.6,20.0,21.8,24.1,28.4,25.1,19.4,13.1,8.5]) #2019 年月別平均気温
y3=(y2-y1)*h+y2
plt.plot(x, y1)
plt.plot(x, y2)36plt.plot(x, y3)
plt.plot(x,y1,label="1900 年")
plt.plot(x,y2,label="2019 年")
plt.plot(x,y3,label="2069 年")
plt.legend()
plt.show()#y1 のラベル文字#y2 のラベル文字#y2 のラベル文字#y1,y2 のラベル印字（2）体格指数 BMI 円グラフ

37

#sample9.py# 肥満円グラフを描画
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif' #漢字が使えるように設定
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro',\'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic',\'VL PGothic', 'Noto Sans CJK JP']labels = ['ヤセ過ぎ','ヤセ','普通','太り','太り過ぎ']sizes = [3, 8, 12, 10,8] #人数
fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels, autopct="%1.1f%%")plt.show()38

#sample10.py# ｃｓｖ読込円グラフを描画
import matplotlib.pyplot as plt
from matplotlib import rcParams
import csv
import kyoutuu
import sys
import os
initial_dir=os.getcwd() #カレントデレクトリー
dirname = os.path.dirname(__file__) #ディレクトリ
#データ読込def dataread():sizes = []size1 = 0
size2 = 0
size3 = 0
size4 = 0
try:with open(initial_dir+'/sintyotaijyu.csv') as f:#データは sample10.py と同じ所
reader = csv.reader(f,skipinitialspace=True)
reader_list = [e for e in reader]
for i in range(len(reader_list)):record = reader_list[i]sintyo=float(record[0])/100 # m
taijyu=float(record[1]) #kg
bmi = round(taijyu / (sintyo **2))
if bmi < 18.5:
size1 = size1 + 1
if bmi >= 18.5 and bmi < 25:
size2 = size2 + 1
if bmi >= 25 and bmi < 30:
size3 = size3 + 1
if bmi > 30:
size4 = size4 + 1
sizes = [size1,size2,size3,size4]
return sizes
except csv.Error as e:
kyoutuu.message(str(e))
except Exception as e:
kyoutuu.message(str(e))#メイン
rcParams['font.family'] = 'sans-serif' #漢字が使えるように設定
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro',\'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic',\'VL PGothic', 'Noto Sans CJK JP']39

labels = ['痩せ型','標準体型','肥満(軽)','肥満(重)']sizes=dataread()
fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels, autopct="%1.1f%%")plt.show()

１１．宿題

40

１２．２章を終えて

１３．日商プログラミング検定のご案内

41

42

第３章．自動生成によるパイソンプログラム
１．プログラム作成環境の変化と技術的変化

２．自動生成とプログラムパターン

43

３．自動生成システム環境①自動生成システムで使用するホルダー g:￥Paython38￥kaihatu を確認します。

４．面積計算プログラムの自動生成

44

45

46

面積計算プログラム定義の説明//*********************************// 定義部// mensekikeisan.teigi// 面積計算// create by webrobo 2020/2/10 11:34////*********************************
プログラム名=mensekikeisan
タイトル=面積計算
ファイル名=
読込項目ＮＯ=
画面サイズ=900*400

47ページ行数=
パターン=1#条件入力パターン
作成行数=11
文字ポイント=16
背景色=frame1&darkcyan,header&lightcyan,button&skyblue#frame,header,button の背景色#以下は詳細定義の明細@11@1@＊＊ 面積計算 ＊＊@taitol@@@@@@@31@2@縦長ｃｍ@tate@@@2@2@2@@51@2@横長ｃｍ@yoko@@@2@2@2@@71@2@答え@kotae@@@2@4@2@@91@6@実行@jikou@@@@@@@92@6@取消@torikesi@@@@@@@93@6@終了@syuryou@@@@@@%def#必ず def jikkou(): の記述で始めます。
#半角項目名が項目名になりますが、その項目に入力された値は、var 項目名で受け取ります。
#ただし、文字変数になっていますので、数値として扱う場合は、int(var 項目名)で数値変換します。
def jikkou():henkanti=20 #倍率
if int(varkotae)==int(varyoko) * int(vartate):
canvas.create_rectangle(0,0,henkanti*int(varyoko),henkanti*int(vartate),\fill = 'green',tag='canvashyouji')kyoutuu.kakunin_message('正解')
canvas.delete('canvashyouji')field_clear()texttate.focus_set()else :
canvas.create_rectangle(0,0,henkanti*int(varyoko),henkanti*int(vartate),\fill = 'green',tag='canvashyouji')kyoutuu.message('不正解')
canvas.delete('canvashyouji')field_clear()texttate.focus_set()48

#*********************************# メインソース# mensekikeisan.py# 面積計算# create by webrobo 2020/2/10 16:35##*********************************
from tkinter import *from tkinter import ttk
import tkinter as ttk
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import webbrowser
import kyoutuu
from datetime import date, timedelta
import subprocess
import csv
import sys

def syokisyori(args):
global id
global password
global recordno
for i in range(len(args)):
if args[i].find('id=')>-1:
id=args[i].replace('id=','')
if args[i].find('pass=')>-1:
password=args[i].replace('pass=','')
texttate.focus_set()

def jikkou():henkanti=20 #ｃｍよりポイント変換値
if int(varkotae)==int(varyoko) * int(vartate):
canvas.create_rectangle(0,0,henkanti*int(varyoko),henkanti*int(vartate),\fill = 'green',tag="canvashyouji")kyoutuu.kakunin_message('正解')
canvas.delete('canvashyouji')field_clear()texttate.focus_set()else :
canvas.create_rectangle(0,0,henkanti*int(varyoko),henkanti*int(vartate),\49

fill = 'green',tag="canvashyouji")kyoutuu.message('不正解')
canvas.delete('canvashyouji')field_clear()texttate.focus_set()
def jikou_clicked():
err=datacheck()if err!='':
kyoutuu.message(err)else:jikkou()#データチェック処理
def datacheck():
errmsg=''#tate
msg=''
global vartate
vartate=tate.get()zokusei=2
kubun=2
hissu=2
koumokuname="tate"koumokutaitol="縦長ｃｍ"
keta=2
msg=kyoutuu.hyoujyuncheck(vartate,zokusei,koumokutaitol,koumokuname,kubun,\hissu,keta)
msg=msg+kobetucheck(vartate,zokusei,koumokutaitol,koumokuname,kubun,hissu,\
keta)
if len(vartate)>keta:
texttate.delete(0,len(vartate))
errmsg=errmsg+msg

def texttate_enter(event):
textyoko.focus_set()

def torikesi_clicked():canvas.delete("canvashyouji")field_clear()50

texttate.focus_set()#画面クリアーdef field_clear():radionengou.setvar('nengou',nengouitem[0])textyy.delete(0,2)
textmm.delete(0,2)
textdd.delete(0,2)
textsimei.delete(0,20)
lbgakureki.selection_clear(0,len(gakurekiitem))
radiodanjyo.setvar('danjyo',danjyoitem[0])for i in range(len(syumiitem)):syumi='syumi'+str(i)checksyumi.setvar(syumi,False)
textsyasin.delete(0,50)
texthomepage.delete(0,50)

def syuryou_clicked():sys.exit()# bgcolor 指定
framebg1='darkcyan'
framebg2='white'headerbg='mintcream'labelbg='Lavender'
buttonbg='lightblue'# Frameframe1 = ttk.Frame(self,bg=framebg1,width=900,height=400,padx=40, pady=20)
frame1.pack(fill=ttk.X)# Frame2
frame2 = ttk.Frame(self,bg=framebg2,width=900,height=400)
frame2.pack(fill=ttk.X)#行 1labeltaitol=ttk.Label(frame1,text='＊＊ 面積計算 ＊＊',\
background=headerbg,font=("",16))
labeltaitol.place(x=92,y=-4)

#行 3
51

labeltate=ttk.Label(frame1,text='縦長ｃｍ',background=labelbg,font=("",16))
labeltate.place(x=0,y=72)
tate=StringVar()
texttate=ttk.Entry(frame1,width=2,textvariable=tate,font=("",16))
texttate.place(x=92,y=72)
texttate.bind('<Key-Return>', texttate_enter)# 行 9;
buttonjikou=ttk.Button(frame1,text='実行',background=buttonbg,/
font=("",16),command=jikou_clicked)
buttonjikou.place(x=92,y=300)
buttonjikou.bind('<Key-Return>', buttonjikou_enter)#キャンバスcanvas=ttk.Canvas(frame2,bg=framebg2,width=780,height=380)
canvas.pack()#syokisyoriargs = sys.argv
syokisyori(args)

if __name__ == '__main__':root = ttk.Tk()
root.title('面積計算')
app=MyApp(master=root)
root.mainloop()52

５．自己紹介プログラム作成➀パイソン自動生成システムの実行

53

③詳細定義54

55

④パイソンプログラム実行

56

⑤デバック作業について

57

⑥詳細定義の操作説明

58

59

%globalhensu1=''
hensu2=''
hensu3_list=[]⑦自己紹介プログラムの実行関数説明%def#実行ボタン処理定義
def jikkou():#年号より西暦年に変換します。
if varnengou=='大正':
birthday_year=1911+int(varyy)
if varnengou=='昭和':birthday_year=1925+int(varyy)
if varnengou=='平成':
birthday_year=1988+int(varyy)#本日日付は data.today()で求めます。
today= date.today()#うるう年の判断をします。うるう年の場合は４で割った値の余りが０になります。
#%は余りを求めます。
uru=today.year%4#とりあえず年齢を年数だけで求めます。
age = today.year - birthday_year#誕生月がまだ到来しない場合は,年齢を１引きます。
if today.month<int(varmm):
age=age-1#誕生月である場合、誕生日が到来していない場合は、年齢より１ひきます。
if today.month==int(varmm) and today.day<int(vardd) and int(vardd)!=29:
age=age-1#誕生月日が２月２９日でうるう年の場合
if today.month==int(varmm) and int(vardd)==29 and today.day==28 and uru==0:
age=age-1
60

seinengapi=varnengou+varyy+'年'+varmm+'月'+vardd+'日'#xy=の記述は座標値を示します。
text=[]#text 文用のｌｉｓｔを用意します。
image=[]#image 用のｌｉｓｔを用意します。
text.append('＊＊ 自己紹介 ＊＊'+'xy=100,50')
text.append('氏 名 ：'+varsimei+'xy=10,100')
text.append('生年月日：'+seinengapi+'xy=10,130')
text.append('年 齢 ：'+str(age)+'歳'+'xy=10,160')
text.append('性 別 ：'+vardanjyo+'xy=10,190')
text.append('学 歴 ：'+vargakureki+'xy=10,220')
text.append('趣 味 ：'+varsyumi+'xy=10,250')
image.append(varsyasin+'xy=500,150')

６．ログインプログラム生成➀パイソン自動生成システムの実行

②表題定義

61

③詳細定義%def
def jikkou():try:
with open('g:\Python38\kaihatu\csvdata\login.csv') as f:reader = csv.reader(f,skipinitialspace=True)
reader_list = [e for e in reader]
list=reader_list[0]id=list[0]password=list[1]if varid==id and varpassword==password:
cmd = "python menu.py "+"id="+id+" "+"pass="+password
62

pid = subprocess.call(cmd,shell=True)
sys.exit()else:
kyoutuu.message('ＩＤまたはパスワードが正しくありません！')
except FileNotFoundError:
kyoutuu.message('ログインファイルが読めません。')
except csv.Error as e:
kyoutuu.message(e)➃パイソンプログラム実行

７．メニュープログラム生成➀パイソン自動生成システムの実行63

②詳細定義

列1

列2

列３

行 01

自己開発

他者開発

開発ツール

行 02

自己紹介

お絵描き

Python 自動生成

行 03

会員一覧

スライドショー

ＩＤＬＥ実行

行 04

会員登録

行 05

有益サイト

行 06

郵便番号一覧

Ｐｙｔｈｏｎ翻訳③プログラムの実行64

65

８．会員一覧プログラム生成➀パイソン自動生成システムの実行

②表題定義

③詳細定義

66

④ＣＳＶファイルの確認⑤プログラムの実行

９．会員詳細表示プログラム生成➀パイソン自動生成システムの実行

②表題定義

67

③詳細定義④プログラムの実行68１０．会員閲覧範囲指定プログラムの生成➀パイソン自動生成システムの実行

②表題定義

69

③詳細定義%def
def jikkou():
global varstartno
global varendno
varstartno=startno.get()varendno=endno.get()if varstartno=='':
varstartno='0'
if varendno=='':
70

varendno='9999'
if int(varstartno)>int(varendno):
message("開始番号が終了番号より大きい")else:# 次の一覧閲覧プログラムに以下のように閲覧範囲条件を args 変数にセット
para='start='+varstartno+'&end='+varendno
cmd = ' python itiran.py '+para
pid = subprocess.Popen(cmd,shell=True)71１１．会員登録プログラムの生成➀パイソン自動生成システムの実行

②詳細定義

72

１２．有益サイト一覧プログラムの生成➀パイソン自動生成システムの実行

73

１３．ランダム数値での自動問題作成プログラムの生成74

１４．郵便番号一覧プログラムの生成

１５：パイソンメニューからエクセルの呼出

G:\Python38\kaihatu\bat\excel.bat に以下のバッチファイルコードが入っています。
"g:/OpenOffice 4/program/soffice.exe" の後ろに呼び出すｃｓｖファイルを記述します。
例えば、G:\Python38\kaihatu\csvdata にある kaiin.csv の場合"g:/OpenOffice 4/program/soffice.exe" "G:\Python38\kaihatu\csvdata にある kaiin.csv"
を呼出す kaiincsv.bat というバッチファイルを作成し、メニューからこれを呼び出すことで、誰でも容易に kaiin.csv の操作が可能になります。
75

１６．郵便番号一覧のプログラムの修正
上記１４での郵便番号一覧プログラムは、開始番号、終了番号での検索で、使いにくいプロ
グラムです。
ここでは、郵便番号一覧プログラムをより使い易いものにするため、郵便一覧の条件指定
を郵便番号と住所名でも検索出来るようにプログラム修正をしてみます。

//*********************************// 定義部// yubinsitei1.teigi// 郵便番号検索指定// create by webrobo 2021/7/23 19:26////*********************************
プログラム名=yubinsitei176タイトル=郵便番号検索指定
ファイル名=
読込項目ＮＯ=
画面サイズ=800*500
ページ行数=
パターン=1
作成行数=9文字ポイント=16
背景色=@11@1@＊＊ 郵便番号検索指定 ＊＊@hanisitei@@@@@@@31@2@郵便番号@yubinbangou@@@1@8@1@@51@2@住所@jyusyo@@@40@10@1@@81@6@実行@jikou@@@@@@@82@6@終了@syuryou@@@@@@%def
def jikkou():
if varyubinbangou=='' and varjyusyo=='':
kyoutuu.message("郵便番号か住所を入力します")else:# 次の一覧閲覧プログラムに以下のように閲覧範囲条件を args 変数にセット
para='yubinbangou='+varyubinbangou+'/jyusyo='+varjyusyo
cmd = ' python yubinitiran1.py '+para
pid = subprocess.Popen(cmd,shell=True)#*********************************# メインソース# yubinitiran1.py# 郵便番号検索一覧# create by webrobo 2020/4/25 23:12##*********************************
from tkinter import *from tkinter import ttk
import tkinter as ttk
import reimport os, tkinter, tkinter.filedialog, tkinter.messagebox
import webbrowser
from datetime import date, timedelta
import subprocess
import csv
import kyoutuu
import sys
initial_dir=os.getcwd() #カレントデレクトリー
yomino="1,2,3,4,5".split(',')
id=''
77

password=''reader_list = []reader_list1 = []recordno = ''args=''
offset=1
startno=1
readover=0
endno=9999
pagegyo=18
yubinbangou=''jyusyo=''class MyApp(ttk.Frame):

def __init__(self,master=None):super().__init__(master)
self.pack()
self.make_widgets()def make_widgets(self):
def syokisyori(args):
global id
global password
for i in range(len(args)):
if args[i].find('id=')>-1:
id=args[i].replace('id=','')
if args[i].find('pass=')>-1:
password=args[i].replace('pass=','')
global endno
global offset
global startno
global offset
global yubinbangou
global jyusyo# 以下の記述で前画面で入力した、郵便番号ないし住所の値を取得します。
l=len(args)
if args[l-1].find('yubinbangou=')>-1 and args[l-1].find('/jyusyo=')>-1:
para=args[l-1].split('/')
para[0]=para[0].replace('yubinbangou=','')
para[1]=para[1].replace('jyusyo=','')
yubinbangou=para[0]jyusyo=para[1]startno=1
endno=9999
else:
78

startno=1
endno=9999
offset=startno
dataread()#データ読込def dataread():global reader_list
global reader_list1
global password
global yomino
global yubinbangou
global jyusyo
try:with open(initial_dir+'/csvdata/yubin.csv') as f:reader = csv.reader(f,skipinitialspace=True)
reader_list = [e for e in reader]reader_list1=[]
for i in range(len(reader_list)):#以下の記述で該当の郵便番号、住所に合致するレコードを reader_list1に入れます。
if ((reader_list[i][1]==yubinbangou) or \(jyusyo!='' and reader_list[i][2].find(jyusyo)>-1) or \(jyusyo!='' and reader_list[i][3].find(jyusyo)>-1)):
reader_list1.append(reader_list[i])meisaigyo()except FileNotFoundError:
kyoutuu.message('/csvdata/yubin.csv ファイルがありません！')
except csv.Error as e:
kyoutuu.message(e)except Exception as e:
kyoutuu.message(e)def meisaigyo():try:
global offset
global pagegyo
global endno
global readoverglobal reader_list
global reader_list1
global yomino
allcount=0
pagecount=0#ページ表示gamenclear()# reader_list1 よりレコードを読んで表示します。
for row in reader_list1:
allcount=allcount+179

１７．自動生成でのプログラムソースの要点① kyoutuu ソース

hyoujyuncheck(各種入力項目値)

message(msg)kakunin_message(msg)
argsset(args)
logincheck(args)②プログラムリンク

def csvkaiintouroku():
argstr=kyoutuu.argsset(args)
cmd = 'python kaiintouroku.py'+argstr
pid = subprocess.Popen(cmd,shell=True)

cmd = 'bat\\pythonseisei.bat'
pid = subprocess.Popen(['start',cmd],shell=True)#syokisyoriargs = sys.argv
syokisyory(args)

80

# 次の一覧閲覧プログラムに以下のように閲覧範囲条件を args 変数にセット
para='start='+varstartno+'/end='+varendno
cmd = ' python itiran.py '+para #itiran.py の後１文字半角空白を入れて para を結合
pid = subprocess.Popen(cmd,shell=True)# 次の itiran.py の def syokisyoripid では以下のような記述になっています。
def syokisyori(args):
global id
global password
for i in range(len(args)):
if args[i].find('id=')>-1: #以下で id,password の値を受け取る
id=args[i].replace('id=','')
if args[i].find('pass=')>-1:
password=args[i].replace('pass=','')
global endno
global offset
global startno
l=len(args)#以下で startno と endno の値を受け取る
if args[l-1].find('start=')>-1 and args[l-1].find('/end=')>-1:
para=args[l-1].split('/')
para[0]=para[0].replace('start=','')
para[1]=para[1].replace('end=','')
startno=int(para[0])if startno==0:
startno=1
endno=int(para[1])if endno==0:
endno=9999
else:
startno=1
endno=9999
offset=startno
dataread()③選択値の可変化④ bat ファイルでのフォルダー名の可変化@cd ..
@cd ..
path %cd%;%cd%/Scripts
81

@cd kaihatu
python %cd%/__pycache__/login.cpython-38.pycwo

initial_dir = os.getcwd()
def jikkou():
global initial_dirtry:with open(initial_dir+'/csvdata/login.csv') as f:

１８．各種サンプル

ｇ:\Python38\kaihatu￥teigi￥kiokuryokumenu.teigi

ｇ:\Python38\kaihatu￥teigi￥sinkeisuijyaku54.teigi82

ｇ:\Python38\kaihatu￥teigi￥sinkeisuijyaku28.teigi

ｇ:\Python38\kaihatu￥teigi￥sinkeisuijyakuanimal.teigi

ｇ:\Python38\kaihatu￥teigi￥sinkeisuijyakususi.teigi

83ｇ:\Python38\kaihatu￥teigi￥coronatataki.teigi

ｇ:\Python38\kaihatu￥teigi￥haetataki.teigi

ｇ:\Python38\kaihatu￥teigi￥pianoensou.teigi

84

ｇ:￥Python38￥kaihatu￥teigi￥kenbanzahyou.teigi

１９．最後にhttps://www.webrobo.jp/siryou/webrenkei.pdf

85