第4回講座資料
https://gyazo.com/c2909989ce460eb86e4f61fa3fe09e8e
NWaka.iconグラフィカルユーザーインターフェース(GUI)を実現するPython標準二大ライブラリを扱います。
p.s. 各演習の解答を載せておいたので,参考にしてみてください。
今回のスライド
GUIとは
ユーザーに視覚的に分かりやすいように設計されたUI。反対に文字だけで構成されたUIをCUIという。皆がいつも使っているアプリケーションのほとんどがこれ。
Turtle
ライブラリの使用方法について
import turtle
と記述することでturtleを使用することができるようになります。
IDLEで作業していない方は…
turtle._Screen.mainloop(turtle)
もしくは
turtle.exitonclick()
とプログラムの最後に記述しましょう。ウィンドウが閉じなくなります。忠告メッセージ等が表示されるかもしれませんが問題ありません。
後者に関してはウィンドウ上をクリックすることでウィンドウを閉じることができます。
座標
https://gyazo.com/c0ee5d8eda96ad7a04a89617e6688468
turtleの場合ウィンドウ中央が(0,0)になります。右側がx座標正向き,上側がy座標正向きと,一般的なグラフと同じ構造です。初期でturtleが向いているのが,右側(x座標正向き)であることに注意しましょう。
ちょびっと演習1-1
それでは一辺が100の正三角形を描いてみましょう。
https://gyazo.com/554bda7f6eb71abac388c148caded3cb
code:sample_tri.py
import turtle
for i in range(3):
t.forward(100)
t.left(120)
角度
実際に走らせて分かったと思いますが,turtleは向いている方向を0°として角度を決定しています。left()やright()などを使用する際に気を付けましょう。
https://gyazo.com/740d423ee11af220a537fc75d8cb9c79
ちょびっと演習1-2
それでは次に,角度のことも踏まえつつ正五角形に挑戦してみましょう。今回も一辺は100にして作成してみましょう。
https://gyazo.com/ce638787e7b53dd5d9e9550f16a7a428
code:sample_penta.py
for i in range(5):
t.forward(100)
t.left(72)
他にも機能はありますが,今回は省きます。気になる人は公式ドキュメントなどを参考にしてみましょう。(正直春学期Pythonくらいでしか使わないので…,極めたい方は独学もしくは授業で!) Tkinter(Tk)
ライブラリ使用方法について
code:tk_from_import_sample.py
from tkinter import *
tk=Tk()
と記述することでTkinterを使用することができるようになります。
先ほどのturtleと書き方が異なりますね?
これは「tkinterというライブラリ(モジュール)から*(全ての機能・クラス)をimportするよ」という意味です。
別にimport tkinterと書けないわけではありませんが,
code:tk_import_sample.py
import tkinter
tk=tkinter.Tk()
と書かなければいけなくなります。そのほか,Canvasなどを使用する際もいちいちtkinter.Canvasとする必要が出てきます。ここら辺は少し踏み込んだ内容なので,しばらくの間はfrom tkinter import *と書けばいいんだな程度に考えといてください。
ウィンドウの表示
亀さんは勝手にウィンドウを作成してくれますが,tkinterくんはfrom tkinter import *やtk=Tk()だけではウィンドウの作成しかされません。ウィンドウ上に描画したい際は、
code:canvas_sample.py
from tkinter import *
tk=Tk()
canvas.pack()
のようにしましょう。これで500×500サイズのウィンドウが作成されます。
canvas.pack()ってなんだよ?って思った方。はい,僕です。僕も正直こいつ誰だよ状態です笑
しかし,こいつをしとかないとエラーをはくことはないものの,ウィンドウ上に何も表示されません。
忘れないように気をつけましょう。
NWaka.icon「packに関する補足資料を用意したので,興味のある方は覗いてみてください」
ちなみにwidth=500などは記述しなくても,初期値が設定されているので動きます。
https://gyazo.com/defc1eea87804e33b485e0ab7f9d7889
IDLEで作業していない方は…
mainloop()
とプログラムの最後に記述しましょう。ウィンドウが閉じなくなります。
座標
https://gyazo.com/dc9f678d82ceaeb3eba6f9379e728e2e
turtleとは異なり,ウィンドウの左上が(0,0)となっています。また,x方向に関しては右側が正ですが,y方向に関しては下側が正となっています,注意しましょう。最初は違和感を覚えるかもしれませんが,案外この座標の取り方をするソフト(ライブラリ)も多いので慣れておきましょう(Unityは違いますけどね…)。
ちょびっと演習2-1
それではturtleと同じく正三角形を描いてみましょう!
https://gyazo.com/59ff0df778b09d9e822c0694ac425c36
canvas.create_polygon()という多角形を描画できるメソッドを使用してみましょう。ちなみにデフォルトで中まで真っ黒に仕上がります。
code:sample_tri_tk.py
from tkinter import *
from math import sqrt # import mathで十分
tk = Tk()
canvas = Canvas(tk, width=300, height=150,bg="White")
canvas.pack()
s = 100
start_pos_x = 100
start_pos_y = 100
canvas.create_polygon((start_pos_x, start_pos_y), (start_pos_x + s, start_pos_y),
(start_pos_x + s / 2, start_pos_y - sqrt(3) * s / 2))
mainloop()
ちょびっと演習2-2
それでは法政大学のtkinter恒例の「家を描く」に挑戦しましょう!
https://gyazo.com/9cdb7ec3ad2c83edd6b9dcf61b0a2367
四角形についてはcanvas.create_rectangle()という専用のメソッドがあるので,そちらを使ってみましょう。
色が無いのは寂しいので,今回は屋根を赤色"#f00" or "red",家の色を灰色"gray"で塗りつぶしてみましょう。塗りつぶしの際にはfill=[color]を使用しましょう。また,線の色もoutline=[color]を使用してそれぞれ塗りつぶした色にしてみましょう。
code:sample_house.py
from tkinter import *
tk=Tk()
canvas=Canvas(tk, width=500, height=500)
canvas.pack()
canvas.create_polygon(100, 100, 200, 100, 150, 50, outline="red", fill="#f00") #屋根の作成・正三角形での必要はない canvas.create_rectangle(110, 100, 190, 200, outline="gray", fill="Gray") #おうちの作成 色の指定方法について
tkinterでは色をstring型で指定します。内容として,主要な色("red", "blue", "green", "lightgreen"など)はカラーの名称を英語で入力するだけで使用できます。
しかし,それだけではすべての色を表すことはできませんから,16進数表記でも指定することができます。この指定にもいくつかの種類がありますので,白を例に見てみましょう。
各色1桁表記(4bit):"#fff"("#rgb")
各色2桁表記(8bit):"#ffffff"("#rrggbb")
各色3桁表記(16bit):"#fffffffff"("#rrrgggbbb")
先頭の#がないとエラーになるので注意しましょう。
ちなみに16進数指定は大学の授業では触れないと思うので,へぇ~こんな指定方法もあるんだぁ!程度にとどめておいてくれて構いません。
グラフの描画
簡単な図形が描けた所で,続いてグラフの描画に挑戦しましょう。
$ f(x)=x^2,$ g(x)=\frac{1}{x}として,$ f(x)を黒で,$ g(x)を青で描画してみましょう。
ウィンドウサイズは500×500のウィンドウで,原点は(250, 250)の
https://gyazo.com/34655627cf5b60e4e8a888e728837b66
code:graphs.py
from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=500, height=500)
canvas.pack()
scale_x = 50 # スケール
scale_y = 50
# 座標の点を描画する
def draw_point(x, y, r=1, c="Black"):
canvas.create_oval(x - r, y - r, x + r, y + r, fill=c, outline=c)
def plot(x, y, color="Black"):
draw_point(scale_x * x + x_o, y_o - scale_y * y, c=color)
# 関数
def f(x):
return x ** 2
def g(x):
return 1 / x
# 原点
x_o, y_o = 250, 250
# 軸
canvas.create_line(0, y_o, 500, y_o)
canvas.create_line(x_o, 0, x_o, 500)
# 定義域
x_min = -10.0
x_max = 10.0
x = x_min
while (x <= x_max):
plot(x, f(x))
plot(x, g(x), "Blue")
x += 0.001
mainloop()