いちばんやさしい Python入門教室  大澤文孝 ソーテック社

いちばんやさしい Python入門教室 - 大澤 文孝
いちばんやさしい Python入門教室 - 大澤 文孝
いちばんやさしい Python入門教室  大澤文孝 ソーテック社

Chapter2 Pythonをはじめよう

P.38
二項算術演算子
/ 割り算
// 小数点以下を切り捨てた割り算
% 割り算の余り

Pythonエラー表示
SyntaxError: unexpected indent
  エラー名:エラー内容
・Syntax=構文/Error=エラー
  構文は「文法」が間違ってる
・unexpected=予期しない/indent=インデント
  「予期しない」つまり「文法にない」インデントが入っている


Chapter3 Pythonでプログラムを書く時のルール

P.59
「¥」文字に注意
ウィンドウズの「¥」と、マックの「/」
print("\10,000")
,000

P.61
文字列を連結する

print("abc";"cde")
abcdef

print("abe"*3)
abcabcabc

print("abc"+123)
エラー

print("abc"+"123")
abc123

print("abc"+"123"*"234"
abc123*234
計算されない

print("abc"+str(123*234))
abc28782

P.70
改行を示す特別な文字
「エスケープシーケンス」は「¥」マークに英文字を続けることで、特別な文字を表せる記号のこと。
エスケープシーケンス
\newline バックスラッシュ(円記号)と改行文字が無視される
\\ バックスラッシュ(円記号)\
\' 一重ね引用符  '
\" 二重ね引用符 "
\a ASCII端末ベル BEL
\b ASCIIバックスペース BS
\f ASCIIフォームフィード FF
\n ASCII行送り LF 。改行のこと
\r ASCII復帰 CR
\t ASCII水平タブ TAB
\v ASCII垂直タブ VT
\ooo 8進数値oooを持つ文字
\xhh 16進数値hhを持つ文字
\N{name} Unicodeデータベース中でnameという名前の文字
\ixxx 16-bitの16進値xxxを持つ文字
\Uxxxxxxxx 32\ビtの16進値xxxxxxxxを持つ文字

print("こんにちは。今日の晩ご飯は何でしたか?\nおいしかったですか?\n何カロリーでしたか?")
こんにちは。今日の晩ご飯は何でしたか?
おいしかったですか?
何カロリーでしたか?

print("""こんにちは。今日の晩ご飯は何でしたか?
おいしかったですか?
何カロリーでしたか?""")
こんにちは。今日の晩ご飯は何でしたか?
おいしかったですか?
何カロリーでしたか?

print("こんにちは。今日の晩ご飯は何でしたか?", end="")
print("おいしかったですか?", end="")
print("何カロリーでしたか?")
こんにちは。今日の晩ご飯は何でしたか?おいしかったですか?何カロリーでしたか?

print(" abc "+"cde" )
abc cde


Chapter4 プログラムを構成する基本的な機能

a=1
b=2
print(a+b)
3

P.87
for構文で繰り返す
指定した回数だけ繰り返すときにfor構文。
[指定する値の列]を1つずつ取り出して、それが尽きるまで繰り返す[シーケンスSequence順序立てているもの]操作。
シーケンスの代表に[リストList]は値をカンマで区切って列挙し、全体を[]で囲ったもの
「i」が使われるのは歴史的な理由で「Integer(整数)」の頭文字に由来
「n」も「Number数値」の頭文字でこうした繰り返し処理でよく使われる

for i in [1,2,3,4,5]:
print(i)
1
2
3
4
5

for i in [1,2,3,4,5]:
print(i)
print("こんにちは")
1
こんにちは
2
こんにちは
3
こんにちは
4
こんにちは
5
こんにちは


for i in [1,2,3,4,5]:
print(i)
print("こんにちは")
1
2
3
4
5
こんにちは

P.91
range(開始する値,終了する値) rangeは[]ではなく()を使用
for i in range(1,5 +1):
print(i)
print("こんにちは")
1
こんにちは
2
こんにちは
3
こんにちは
4
こんにちは
5
こんにちは

P.92
「0」から数えてすっきり書く
range関数は「1から数える」のではなく「0から数える」ことを目的に考案された
for a in range(0,5):
print(a+1)
print("こんにちは")
1
こんにちは
2
こんにちは
3
こんにちは
4
こんにちは
5
こんにちは

P.93
「指定した回数だけ繰り返したい」
for 変数名 in range(繰り返す回数):
繰り返したい処理

文字を1文字ずつ取り出す
for a in "Hello":
print(a)
H
e
l
l
o

P.94
while構文は、指定した条件が成り立っている間、繰り返し実行する構文
total=0
a=1
while total<=50:
total=total+a
a=a+1
print(total)
55

P.95
while構文
while 条件式:
条件が成り立っている場合に実行したい文

書式 while構文
条件式が成り立っている場合に実行したい文

比較演算子
<= 以下
>= 以上
< 小さい
> 大きい
== 等しい
!= 等しくない

P.97
for a in range(1,5+1):
print(a)
1
2
3
4
5

a=1
while a<=5:
print(a)
a=a+1
1
2
3
4
5

P.98
while構文の永久ループ
while True:
実行したい文
「True」は「成り立っている」ということを示す「真(真)」ともいう

whileの条件式にTrueを指定すると、いかなる時でも条件が成り立つ。
ゆえに終了する機会がなく、永遠に繰り返す。
ループを止めるといは ctrl+c (macはcontrol+c)

繰り返しが終わったときに実行するelse
forやwhileには、繰り返し処理が終わったときに必ず実行されるelseという個所を記述できる
while 条件式:
繰り返す分
else:
繰り返しが終わったときに実行する文
for 変数名 in シーケンス:
繰り返す分
else:
繰り返しが終わったときに実行する文

elseは「最後に一回だけ実行したいときに実行したい処理」を書きたいときに使う

P.99
if構文の条件分岐
if 条件文:
条件が成り立っているときに実行する文
else:
条件が成り立っていないときに実行する文

for a in range(1,10+1):
if a <= 5:
print("小さいです")
else:
print("大きいです")
小さいです
小さいです
小さいです
小さいです
小さいです
大きいです
大きいです
大きいです
大きいです
大きいです
else:は「いいえ」つまりは「条件が成り立っていない」

P.101
条件を組み合わせる
指定できる条件は、1つではなく、組み合わせることもできる。
条件を組み合わせるときは「and」「or」そして「not」を使う。
こうした組み合わせのための語句を「論理演算子」という

「and」を省略する
Pythonでは可能
if 1 <= a <= 5:

P.102
for a in range(1,10+1):
print(a)
if a % 2 == 0:
print("〇")
if a%3==0:
print("×")
if(a%2==0) and (a%3==0):
print("△")
1
2

3
×
4

5
6

×

7
8

9
×
10


P.103
elifを使って「ではないときの条件」を並べる
Pythonでは「else」と「if」を合体した「elif」
if (a%12==0):
print("〇")
elif (a%4==0):
print("△")
elif (a%2==0):
print("×")
else:
print("☆")

P.104
条件が成り立った時に繰り返しをやめる
「何度か繰り返すのだけれども、特定の条件が成り立った時には、繰り返しをやめたい」
total=0
a=1
while total <= 50:
total=total+a
a=a+1
print(total)
55

for構文やwhile構文では、構文の内部で「break」で繰り返しを止め、繰り返しの次の行に移動
total=0
a=1
while True:
total=total+a
a=a+1
if total>50:
break
print(total)
55

P.105
何もしないことを示すpass
「条件が成り立った時に、何も実行すべきものがない」ことがあるようなときに「条件が成り立った時に実行したい文」を省略して
if 条件式 :
pass
else:
条件が成り立たなかったとき

P.106
関数とは「何か値を受け取って、その値を加工して、内部で処理をして、結果を返すもの」

P.107
関数を自分で作り、記述することを関数を「定義する」といいPythonではdef
関数を定義するときは、何でもよいが何か適当な関数名が必要。
def 関数名(渡したい値をカンマで区切ったもの):
実行したい文が続く
「渡したい値をカンマ区切ったもの」は、関数で処理したい値のことで、これを「引数」という

P.108
returnを使って結果となる値を設定するk十を「値を返すreturn」や「値を戻すreturn」などと表現し、この値のことを「戻り値」という。

引数と変数との関係
引数の実態は「変数」であり、じっこうされるときに、実行した側から、あらかじめ南アらかの値が設定されてくるという点だけが違う。

関数を実行することを「関数を呼び出す(コールする)」という。

P/110
関数内の変数と関数外の変数とで、保存場所が違う
a="abc"
def test():
print(a)
return
test()
print(a)
abc
abc
戻り値がない関数

P.111
グローバルスコープとローカルスコープ
def test():
a="xyz"
print(a)
return
test()
print(a)
xyz
abc
変数の有効範囲を「スコープscope」といい、関数の外部のスコープのことを「グローバルスコープ」、関数の内部のスコープを「ローカルスコープ」という。
グローバルスコープに置いた変数のことは「グローバル変数」、ローカルスコープに置いた変数は「ローカル変数」という。
a="abc"
def test():
global a
a="def"
print(a)
return
test()
print(a)
def
def
グローバルスコープに置かれた変数を利用するための記述のこと(globalと書いた行のこと)を「グローバル宣言」という

P.114
可変長やオプションの引数
「関数の引数は、一部を省略したり、名前を付けて指定したりできる」
①引数の省略
 「デフォルト引数」は関数定義において引数を宣言するときに「引数名=種略されたときの値」
②項目名を付けて指定する

P.116
Pythonではモジュールを読み込む操作を「インポートimportする」という

P.117
import モジュール名

import calendar
print(calendar.month(2020,5))
May 2020
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

①asでモジュールを読み込む
import calendar as c
print(c.month(2020,5))
May 2020
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

P.118
②fromでモジュール名を書かずに済むようにする
fromでモジュールを読み込む
from モジュール名 import 利用したい関数名
from calendar import month
print(month(2020,5))
May 2020
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

P.123
ランダムな値を生成するrandomモジュール
randomモジュールをインポートすると「random.関数名」が使える

P.124
関数
random.seed(a, version)
random.randint(a,b) a以上b以下のランダムな整数を返す
random.choice(seq) seqのなかからランダムに1つ取り出す
random.shuffle(x) xをランダムな順に並べ替える
random.random() 0.0以上~1.0未満のランダムな小数値を返す

import random
a=random.randint(0,9)
print(a)
5

文字を入力するのにinputという関数を使うのが簡単
b=input("数を入れてね>")
print(b)
数を入れてね>

import random
a=random.randint(0,9)
print(a)
b=input("数を入れてね>")
print(b)

P.126
import random
a=random.randint(0,9)
print(a)
b=input("数を入れてね>")
if a==b:
print("当たり")
else:
print("はずれ")

P.127
正しく表示されない理由は「数値」と「文字列」を比較しているから。
random.randint(0,9)で作ったランダムな値は0-9の数値、
それに対して「input」で入力したものは「文字列」として認識される。
つまりは「文字列」で入力したものをいったん「数値」に変換すればよい
b=int(input("数を入れてね>"))

import random
a=random.randint(0,9)
print(a)
b=int(input("数を入れてね>"))
if a==b:
print("当たり")
else:
print("はずれ")

P.129
4桁のランダムな値を作るには
print(str(a1)+str(a2)+str(a3+str(a4)))のa1,a2,a3,a4が数値なので、このまま足してしまうと4つの数の合計が求められてしまう。
ここでやりたいのは、連結して表示したい「str」で文字列に変換して実行する。
import random
a1=random.randint(0,9)
a2=random.randint(0,9)
a3=random.randint(0,9)
a4=random.randint(0,9)
print(str(a1)+str(a2)+str(a3)+str(a4))

P.131
4桁のランダムな数値を創る別解
a=random.randint(0,9999)

同じような値をひとまとめにする「リストlist」という概念があり、それを使うと4つの数値をひとまとめにできる。
a=[6,8,0,2]
列挙したデータは[]で囲んで、,で区切ると、aには4つの箱ができてそれぞれに「6」「8」「0」「2」の値が格納される。
このような箱それぞれを「要素element」という。この番号のことを「インデックス」または「添字」と呼ぶ。
for構文では[1,2,3,4]のように連続した値を入れたものを使用したが、リストでは好きな値を好きな順番で格納することができる。

P.133
リストを使って4桁のランダムな値を作る
import random
a =[random.randint(0,9),
random.randint(0,9),
random.randint(0,9),
random.randint(0,9),]
print(str(a[0])+str([1])+str([2])+str([3]))
b=int(input("数を入れてね>"))
if a==b:
print("当たり")
else:
print("はずれ")
6[1][2][3]
数を入れてね>6123
はずれ

P.135
文字は要素を指定することで1つずつ取得できる
import random
b=input("数を入れてね>")
print(b[0])
print(b[1])
print(b[2])
print(b[3])
数を入れてね>

入力エラーとしてはじく
①4桁であることをチェックする
Pythonではlen関数を使うことで、その文字列の長さを求められる。
len(b)が4ではない、すなわち「if len(b)!=4:」という条件を七すると4桁で入力されたかどうかを確認できる。
P.136
import random
isok=False
while isok==False:
b=input("数を入れてね>")
if len(b)!=4:
print("4桁の数字を入力してください")
else:
isok=True
print(b[0])
print(b[1])
print(b[2])
print(b[3])
数を入れてね>

while 条件:
繰り返し実行したい文
「値が正しく入力されたか」を判別するために「isok」という変数を用意。
isok変数は、最初は「False」を設定。
is ok

P.138
②各行が数字であること
if (b[0]>="0") and (b[0]<="9"):
「"0"」「"9"」のように""でくくり文字列として扱う。くくらずに「数字」として次のようにすると間違い
別海として
if (b[0]<"0") >= 0) and (int(b[0]<=9):

if (b[0]>="0") and (b[0]<="9"):
print("数字ではありません")

P.140
import random
isok=False
while isok==False:
b=input("数を入れてね>")
if len(b)!=4:
print("4桁の数字を入力してください")
else:
if (b[0]>="0") and (b[0]<="9"):
print("数字ではありません")
elif (b[1]>="0") and (b[0]<="9"):
print("数字ではありません")
elif (b[2]>="0") and (b[0]<="9"):
print("数字ではありません")
elif (b[3]>="0") and (b[0]<="9"):
print("数字ではありません")
else:
isok=True
print(b[0])
print(b[1])
print(b[2])
print(b[3])
数を入れてね>

P.141
ループ処理で判定をもう少し簡単に
import random
isok=False
while isok==False:
b=input("数を入れてね>")
if len(b)!=4:
print("4桁の数字を入力してください")
else:
kazuok=True
for i in range(4):
if (b[i]<"0") or (b[i]>"9"):
print("数字ではありません")
kazuok=False
break
if kazuok:
isok=True
print(b[0])
print(b[1])
print(b[2])
print(b[3])
数を入れてね>

P.144
正規表現で一発チェック
正規表現はパターンと呼ばれる書式をつかって文字列の頭から順に、文字がそのパターンと合致しているかどうかを調べる方法。これを「パターンマッチ」という。
数字かどうかを調べるには「\d」という記号を使用
なお正規表現はreモジュールのインポートが必要になる。
import re

P.146
ヒットを判定しよう
hit=0
if a[0]==int(b[0]):
hit=hit+1
if a[1]==int(b[1]):
hit=hit+1
if a[2]==int(b[2]):
hit=hit+1
if a[3]==int(b[3]):
hit=hit+1
koreha
これはforループでも書くことができる
hit=0
for i in range(4)
if a[i]==int(b[i]):
hit==hit+1

P.147
ブローを判定しよう

P.149
ヒットとブローで重複して数えてしまうので、除外する必要がある
blow=0
for i in range(4):
if (int(b[0])==a[i]) and (a[i] !=int(b[i])) and (a[0] !=int(b[0])):
blow=blow+1
break
for i in range(4):
if (int(b[1])==a[i]) and (a[i] !=int(b[i])) and (a[0] !=int(b[1])):
blow=blow+1
break
for i in range(4):
if (int(b[2])==a[i]) and (a[i] !=int(b[i])) and (a[0] !=int(b[2])):
blow=blow+1
break
for i in range(4):
if (int(b[3])==a[i]) and (a[i] !=int(b[i])) and (a[0] !=int(b[3])):
blow=blow+1
break
しかし長すぎるので、ループを使って短く書く
blow=0
for j in range(4):
for i in range(4):
if (int(b[j])==a[i]) and (a[i]!=int(b[i])) and (a[j]!=int(b[j])):
blow=blow+1
break


P.150
ヒットが4になるまで繰り返す
import random
a =[random.randint(0,9),
random.randint(0,9),
random.randint(0,9),
random.randint(0,9),]
print(str(a[0])+str([1])+str([2])+str([3]))
while True :
isok=False
while isok==False:
b=input("数を入れてね>")
if len(b)!=4:
print("4桁の数字を入力してください")
else:
kazuok=True
for i in range(4):
if (b[i]<"0") or (b[i]>"9"):
print("数字ではありません")
kazuok=False
break
if kazuok:
isok=True
hit=0
for i in range(4):
if a[i]==int(b[i]):
hit==hit+1
blow=0
for j in range(4):
for i in range(4):
if (int(b[j])==a[i]) and (a[i]!=int(b[i])) and (a[j]!=int(b[j])):
blow=blow+1
break
print("ヒット"+str(hit))
print("ブロー"+str(blow))
if hit == 4:
print("当たり")
break
2[1][2][3]
数を入れてね>

P.158
tkinterにはお武家くとという仕組みを使ってウィンドウを操作する。オブジェクトには「メソッドmethodと呼ばれる関数があり、それを実行することで、さまざまな操作が可能
ウィンドウを作る
root=tk.Tk()
振動を表示する。作成したウィンドウを表示するには、mainloopというメソッドを実行

root=tk.Tk()
root.mainloop()
この2行はtkinterでウィンドウを表示するときの決まり文句

P.161
メッセージを「ラベルlabel」という。
ラベルはLabelメソッドを実行する
import tkinter as tk
root=tk.Tk()
root.geometry("400x150")
root.title("数当てゲーム")
labell=tk.Label(root,text="数を入力してね")
labell.place(x=20,y=20)
root.mainloop()

P.162
入力値を配置する
editbox1=tk.Entry(width=4)
labell.place(x=20,y=20)

P.164
フォントの種類とサイズを変える
・Times 明朝体っぽいもの
・Helvetica ゴシック体っぽいもの
・Courier 等幅のタイプライタのようなもの
labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))
editbox1=tk.Entry(width=4,font=("Helvetica",28))

P.165
利用できるフォント一覧を取得する
import tkinter as tk
for f in tk.Tk().call("font","families"):
print(f)

P.166
ボタンを配置する
button1=tk.Button(root,text="チェック",font=("Helvetica",14))
button.place(x=220,y=60)

P.167
クリックされたときに実行される関数を結びつける
①クリックされたときに実行する関数を作る
def ButtonClick()
・・・ここに好きな処理を書・・・
②ボタンがクリックされたときに①の関数を実行するように結びつける
button1=tk.Button(root,text="チェック",font=("Helvetica",14),command=ButtonClick)

P.168
メッセージを表示してみよう
tkinter.messagebosの関数
showinfo 情報を表示
showwarning 警告を表示
showerror エラーを表示
askquestion テキストボックスを持つメッセージを表示し、文字入力できる
askokcancel [OK]と[キャンセル]の2つのボタンを持つメッセージを表示
askyeno [はい]と[いいえ]の2つのボタンを持つメッセージを表示
askretrycancel [再実行]と[キャンセル]の2つのボタンを持つメッセージを表示

showinfo関数
tmsg.showinfo("タイトル","表示したい文字")
そこでButtonClick関数を次のように定義
def ButtonClick():
tmsg.showinfo("テスト"、"クリックされたよ")

P.171
ヒット&ブローの当たり判定を組み込もう

入力されたテキストの値を取得する
入力されたテキストはgetメソッドを使うと取得できる。
editbox1.get()

P.173
ヒット&ブローの値判定を作る
import tkinter as tk
import tkinter.messagebox as tmsg
def ButtonClick():
b=editbox1.get()
isok=False
if len(b)!=4:
tmsg.showerror("エラー","4桁の数字を入力してください")
else:
kazuok=True
for i in range(4):
if (b[i]<"0") or (b[i]>"9"):
tmsg.showerror("エラー","4桁の数字を入力してください")
kazuok=False
break
if kazuok:
isok=True
if isok :
hit=0
for i in range(4):
if a[i]==int(b[i]):
hit=hit+1
blow=0
for j in range(4):
for i in range(4):
if (int(b[j])==a[i]) and (a[i]!=int(b[i])) and (a[j]!=int(b[j])):
blow=blow+1
break
if hit == 4:
tmsg.showinfo("当たり","おめでとうございます。当たりです")
root.destroy()
else:
rirekibox.insert(tk.END,b+"ヒット:"+str(hit)+"ブロー:"+str(blow)+"\n")
a =[random.randint(0,9),
random.randint(0,9),
random.randint(0,9),
random.randint(0,9),]
# print(str(a[0])+str(a[1])+str(a[2])+str(a[3]))
root=tk.Tk()
root.geometry("600x400")
root.title("数当てゲーム")
rirekibox=tk.Text(root,font=("Helvetica",14))
rirekibox.place(x=400,y=0,width=200,height=400)
labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))
labell.place(x=20,y=20)
editbox1=tk.Entry(width=4,font=("Helvetica",28))
editbox1.place(x=120,y=60)
button1=tk.Button(root,text="チェック",font=("Helvetica",14),command=ButtonClick)
button1.place(x=220,y=60)
root.mainloop()

P.184 
ウィンドウのなかに円を描こう
import tkinter as tk
root=tk.Tk()
root.geometry("600x400")
canvas=tk.Canvas(root,width=600,height=400,bg="white")
canvas.place(x=0,y=0)
canvas.create_oval(300-20,200-20,300+20,200+20)
root.mainloop()

P.186 
Canvasに備わる描画のためのメソッド
create_arca8x1,y1,x2,y2,オプション) 弧を描く
create_bitmap(x,y,オプション) ビットマップを描く
create_image(x,y,オプション) 画像を描く
create_line(x1,y1,x2,y2,オプション 直線を描く
create_oval(x1,y1x2,y2,オプション) 楕円または円を描く
create_polygon(x1,y1,x2,y2,オプション) 四角形を描く
create_text(x,y,オプション) テキストを描く

P.187
縁の色を変えてみよう
・widt:線の幅
・outline:緑の色
・fill:塗りの色

import tkinter as tk
root=tk.Tk()
root.geometry("600x400")
canvas=tk.Canvas(root,width=600,height=400,bg="white")
canvas.place(x=0,y=0)
canvas.create_oval(300-20,200-20,300+20,200+20,fill="red",width=0)
root.mainloop()

P.209
たくさんの円をループで動かす
import tkinter as tk
balls=[
{"x":400,"y":300,"dx":1,"dy":1,"color":"red"},
{"x":200,"y":100,"dx":-1,"dy":1,"color":"green"},
{"x":100,"y":200,"dx":1,"dy":-1,"color":"blue"}
]
def move():
global balls
for b in balls:
canvas.create_oval(b["x"]-20,b["y"]-20,b["x"]+20,b["y"]+20,fill="white",width=0)
b["x"]=b["x"]+b["dx"]
b["y"]=b["y"]+b["dy"]
canvas.create_oval(b["x"]-20,b["y"]-20,b["x"]+20,b["y"]+20,fill=b["color"],width=0)
if b["x"]>=canvas.winfo_width():
b["dx"]=-1
if b["x"]<=0:
b["dx"]=+1
if b["y"]>=canvas.winfo_width():
b["dy"]=-1
if b["y"]<=0:
b["dy"]=+1
root.after(10,move)
root=tk.Tk()
root.geometry("600x400")
canvas=tk.Canvas(root,width=600,height=400,bg="white")
canvas.place(x=0,y=0)
root.after(10,move)
root.mainloop()

import tkinter as tk
balls=[
{"x":400,"y":300,"dx":1,"dy":1,"color":"red"},
{"x":200,"y":100,"dx":-1,"dy":1,"color":"green"},
{"x":100,"y":200,"dx":1,"dy":-1,"color":"blue"},
{"x":50,"y":400,"dx":-1,"dy":1,"color":"purple"},
{"x":400,"y":100,"dx":1,"dy":1,"color":"yellow"}
]
def move():
global balls
for b in balls:
canvas.create_oval(b["x"]-20,b["y"]-20,b["x"]+20,b["y"]+20,fill="white",width=0)
b["x"]=b["x"]+b["dx"]
b["y"]=b["y"]+b["dy"]
canvas.create_oval(b["x"]-20,b["y"]-20,b["x"]+20,b["y"]+20,fill=b["color"],width=0)
if b["x"]>=canvas.winfo_width():
b["dx"]=-1
if b["x"]<=0:
b["dx"]=+1
if b["y"]>=canvas.winfo_width():
b["dy"]=-1
if b["y"]<=0:
b["dy"]=+1
root.after(10,move)
root=tk.Tk()
root.geometry("600x400")
canvas=tk.Canvas(root,width=600,height=400,bg="white")
canvas.place(x=0,y=0)
root.after(10,move)
root.mainloop()

P.213
プログラムは部品をコントロールしていく「オブジェクト」で、その命令は「メソッド」に相当する。

P.214
オブジェクトはクラスclassから作る
オブジェクトを使いたいときにはクラスからオブジェクトを作り出す。こうして作ったオブジェクトのことを「インスタンスinstance」というそしてクラスからオブジェクトを作り出す操作のことを「実体化する」とか「インスタンスを作る」という。

P.221
円を動かすメソッドを作る
# coding:utf-8
import tkinter as tk
class Ball:
def __init__(self, x, y, dx, dy, color):
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.color = color
def move(self, canvas):
# いまの円を消す
canvas.create_oval(self.x - 20, self.y - 20, self.x + 20, self.y + 20, fill="white", width=0)
# X座標、Y座標を動かす
self.x = self.x + self.dx
self.y = self.y + self.dy
# 次の位置に円を描画する
canvas.create_oval(self.x - 20, self.y - 20, self.x + 20, self.y + 20, fill=self.color, width=0)
# 端を超えていたら反対向きにする
if self.x >= canvas.winfo_width():
self.dx = -1
if self.x <= 0:
self.dx = 1
if self.y >= canvas.winfo_height():
self.dy = -1
if self.y <= 0:
self.dy = 1
# 円をひとつ作る
b = Ball(400, 300, 1, 1, "red")
def loop():
# 動かす
b.move(canvas)
# もう一回
root.after(10,loop)
# ウィンドウを描く
root = tk.Tk()
root.geometry("800x600")
# Canvasを置く
canvas =tk.Canvas(root, width =800,height = 600, bg="white")
canvas.place(x = 0, y = 0)
# タイマーをセット
root.after(10, loop)
root.mainloop()

たくさんの円を動かす
balls=(
Ball(400,300,1,1,"red"),
Ball(200,100,-1,1,"green"),
Ball(100,200,1,-1,"blue")
]
そして、これらのリストをforでループして処理するため、円を動かすためのloop関数を次のように修正する。
def loop():
#動かす
for b in balls:
b.move(canvas)
#もう一回
root.after(10,loop)

P.223
円だけでなく、四角、三画を混ぜてみよう
# coding:utf-8
import tkinter as tk
class Ball:
def __init__(self, x, y, dx, dy, color):
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.color = color
def move(self, canvas):
# いまの円を消す
self.erase(canvas)
# X座標、Y座標を動かす
self.x = self.x + self.dx
self.y = self.y + self.dy
# 次の位置に円を描画する
self.draw(canvas)
# 端を超えていたら反対向きにする
if (self.x >= canvas.winfo_width()):
self.dx = -1
if (self.x <= 0):
self.dx = 1
if (self.y >= canvas.winfo_height()):
self.dy = -1
if (self.y <= 0):
self.dy = 1
def erase(self, canvas):
canvas.create_oval(self.x - 20, self.y - 20, self.x + 20, self.y + 20, fill="white", width=0)
def draw(self, canvas):
canvas.create_oval(self.x - 20, self.y - 20, self.x + 20, self.y + 20, fill=self.color, width=0)
class Rectangle(Ball):
def erase(self, canvas):
canvas.create_rectangle(self.x - 20, self.y - 20, self.x + 20, self.y + 20, fill="white", width=0)
def draw(self, canvas):
canvas.create_rectangle(self.x - 20, self.y - 20, self.x + 20, self.y + 20, fill=self.color, width=0)
class Triangle(Ball):
def erase(self, canvas):
canvas.create_polygon(self.x, self.y - 20, self.x + 20, self.y + 20, self.x - 20, self.y + 20, fill="white", width=0)
def draw(self, canvas):
canvas.create_polygon(self.x, self.y - 20, self.x + 20, self.y + 20, self.x - 20, self.y + 20, fill=self.color, width=0)
# 円、四角形、三角形を、まとめて用意する
balls = [
Ball(400, 300, 1, 1, "red"),
Rectangle (200, 100, -1, 1, "green"),
Triangle(100, 200, 1, -1, "blue")
]
def loop():
# 動かす
for b in balls:
b.move(canvas)
# もう一回
root.after(10,loop)
# ウィンドウを描く
root = tk.Tk()
root.geometry("800x600")
# Canvasを置く
canvas =tk.Canvas(root, width =800,height = 600, bg="#fff")
canvas.place(x = 0, y = 0)
# タイマーをセット
root.after(10, loop)
root.mainloop()


P.236
https://pypi.python.org/


P.237
PDFを扱うためのモジュール
http://www.reportlab.com
スタートメニューのCprtanaにpip install reportlab


PDFを作る
# クラスのインポート
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
import reportlab.lib.units as unit
import reportlab.lib.pagesizes as pagesizes
# フォントの登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
# PDFを作る
pdf = canvas.Canvas("example.pdf", pagesize=pagesizes.A4)
pdf.setFont("HeiseiKakuGo-W5", 14)
pdf.drawString(10 * unit.mm, 270 * unit.mm, "はじめてのPDF")
pdf.save()


# クラスのインポート
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
import reportlab.lib.units as unit
import reportlab.lib.pagesizes as pagesizes
# フォントの登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
# PDFを作る
pdf = canvas.Canvas("example.pdf", pagesize=pagesizes.A4)
moji = "あ"
# フォントの大きさは用紙横幅と同じ210mmとする
pdf.setFont("HeiseiKakuGo-W5", 210 * unit.mm)
# 高さ
h = (297 - 210) / 2 * unit.mm
pdf.drawString(0 * unit.mm, h, moji)
pdf.save()


# クラスのインポート
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
import reportlab.lib.units as unit
import reportlab.lib.pagesizes as pagesizes
# フォントの登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
# PDFを作る
pdf = canvas.Canvas("example.pdf", pagesize=pagesizes.A4)
title = "新春セール!"
for moji in title:
# フォントの大きさは用紙横幅と同じ210mmとする
pdf.setFont("HeiseiKakuGo-W5", 210 * unit.mm)
# 高さ
h = (297 - 210) / 2 * unit.mm
pdf.drawString(0 * unit.mm, h, moji)
pdf.showPage()
# 保存
pdf.save()


# クラスのインポート
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
import reportlab.lib.units as unit
import reportlab.lib.pagesizes as pagesizes
# TrueType
from reportlab.pdfbase import ttfonts
# TrueTypeフォントの登録
pdfmetrics.registerFont(ttfonts.TTFont("HGGothic", "C:\\Windows\\Fonts\\HGRPP1.TTC"))
# PDFを作る
pdf = canvas.Canvas("example.pdf", pagesize=pagesizes.A4)
title = "新春セール!"
for moji in title:
# フォントの大きさは用紙横幅と同じ210mmとする
# フォントの種類は、TTFFontの1番目の引数に指定したもの
pdf.setFont("HGGothic", 210 * unit.mm)
# 高さ
h = (297 - 210) / 2 * unit.mm
pdf.drawString(0 * unit.mm, h, moji)
pdf.showPage()
# 保存
pdf.save()

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

なるほど(納得、参考になった、ヘー)

この記事へのコメント