※さらに30日間返金保証ありなので、実質リスクゼロ。
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
今回はPythonのGUIライブラリ、Tkinterを使って、簡単な星占いを作っていきたいと思います。
生年月日を入力して、今日の運勢を判定する簡単なプログラムなので、是非一緒に作ってみてください。
Tkinterの基礎と復習
では、Tkinterを使って星占いを作っていきましょうっ...といきたいところですが、Tkinterって何?って人もいると思うのでまずはそこから簡単に説明していきます。
TkinterはGUIアプリを作るためのPythonのライブラリです。
まあ、分からない人はGUIアプリを作りたい時に使うものだなくらいに思っておいてください。
Tkinterを使うときは以下のようにインポートしてから使います。
import tkinter as tk
また、Tkinterには基本的な形があり、以下のように書きます。
win = tk.Tk() #ここで部品を作ってウィンドウに配置 win.mainloop()
簡単に説明すると、1行目でTkというウィジェット(部品)によってウィンドウを生成しています。
3行目ではmainloop関数でイベント処理をしています。
そして間の部分でウィジェット(部品)を作って、ウィンドウに配置していきます。
このウィンドウ生成→ウィジェットを生成&配置→イベント処理の流れが基本なるので覚えておいてください。
これの簡単な例は以下の記事で詳しく解説しています。初めてで分からない人はこの記事から読んでみてください。
Tkinterで星占い①画像、テキスト、エントリーボックス、ボタンを配置する
ここではウィンドウにウィジェット(部品)を配置していきます。
全体のコード
ウィジェット配置の説明に入る前に全体のコードを示しておきます。
import tkinter as tk from PIL import ImageTk import datetime #ボタンを押したら占い結果を出力するための関数↓ def uranai(): seiza_list = ['やぎ座', 'みずがめ座', 'うお座', 'おひつじ座', 'おうし座', 'ふたご座', 'かに座', 'しし座', 'おとめ座', 'てんびん座', 'さそり座', 'いて座'] d = datetime.datetime.today() rank = ((d.day + seiza())%12) + 1 yourseiza = seiza_list[seiza()] first_text['text'] = '{0}: {1}位'.format(yourseiza,rank) #誕生日から星座を判定するための関数↓ def seiza(): month = int(month_entry.get()) day = int(day_entry.get()) a = 100*month + day if 121<=a<=219: return 1 elif 220<=a<=320: return 2 elif 321<=a<=420: return 3 elif 421<=a<=521: return 4 elif 522<=a<=621: return 5 elif 622<=a<=723: return 6 elif 724<=a<=823: return 7 elif 824<=a<=923: return 8 elif 924<=a<=1023: return 9 elif 1024<=a<=1122: return 10 elif 1123<=a<=1222: return 11 else: return 0 win = tk.Tk() win.title('今日の運勢') win.geometry('650x400') img = ImageTk.PhotoImage(file='Pictures/nagasima.jpg') can = tk.Canvas(win, width=650, height=400) can.pack() can.create_image(325, 150, image=img) first_text = tk.Label(text='今日の運勢は?') first_text.place(x=300, y=370) birthday_text = tk.Label(text='あなたの誕生日 月 日') birthday_text.place(x=50, y=370) month_entry = tk.Entry(width=5) month_entry.place(x=135, y=370) day_entry = tk.Entry(width=5) day_entry.place(x=195, y=370) button = tk.Button(text='占う', command=uranai) button.place(x=500, y=370) win.mainloop()
順序だてて説明していくので、さらっと流し読みしておいてください。
画像を配置する
それではまず生成したウィンドウ、winに画像を配置していきます。
全体のソースコードの2行目でPILモジュールのImageTkをインポートしているのが分かると思います。
これを使うと、画像をフォルダから取り込むことができます。
img = ImageTk.PhotoImage(file='Pictures/nagasima.jpg') can = tk.Canvas(win, width=650, height=400) can.pack() can.create_image(325, 150, image=img)
1行目でPictures/nagasima.jpgという画像ファイルを指定して、それにimgという名前を付けています。
2行目以降では、キャンバスを作ってウィンドウに配置し、そのキャンバスの上に画像を貼り付けています。
ウィンドウに画像を配置すると、こんな感じになります。
星占いということで目覚ましテレビの画像を持ってきました。
女の人はながしまアナウンサー。多分。間違ってたらごめん。(テレビ持ってないから許して...。)
Canvasモジュールを使って画像を配置するという作業は、以下の記事でより詳しく解説しているので、一度読んでみてください。
テキストを配置する
次はテキストを配置していきます。ウィンドウに表示したい文字のことです。
first_text = tk.Label(text='今日の運勢は?') first_text.place(x=300, y=370) birthday_text = tk.Label(text='あなたの誕生日 月 日') birthday_text.place(x=50, y=370)
1行目ではtkinter内のLabelウィジェットを使ってテキストを生成し、それにfirst_textという名前を付けています。
そして、引数に指定していますが、テキストに表示される文字列は「今日の運勢は?」です。
2行目では生成したテキストをplace関数でウィンドウに配置しています。
引数ではウィンドウに表示したい位置を指定できます。
3、4行目も同じことです。
こんな感じで文字列が入ります。
あるウィジェットを生成したら終わりではなく、基本的にはウィンドウに配置するという作業までする必要があります。(pack関数やplace関数を使って)
エントリーボックスを配置する
エントリーボックスはユーザの入力を受け取る場所です。
month_entry = tk.Entry(width=5) month_entry.place(x=135, y=370) day_entry = tk.Entry(width=5) day_entry.place(x=195, y=370)
tkinter内のEntryウィジェットを使っていますが、基本的には上の場合と同じで、エントリーボックスを作って、配置してあげます。
1、3行目で幅が5のエントリーボックスを作っています。
2、4行目では作ったエントリーボックスをウィンドウ上に配置しています。
位置はいい感じに調整してあげてください。
このように2つのエントリーボックスができたと思います。
最終的にはここに入力した誕生日から、星座を判定して星占いをします。
ボタンを配置する
ボタンを配置する時は Buttonウィジェットを使います。
button = tk.Button(text='占う', command=uranai) button.place(x=500, y=370)
1行目を見てください。Buttonウィジェットの第2引数のcommandというのはボタンを押したときに実行したい関数を指定します。
ここではボタンを押したときにuranai関数が実行されるように設定されています。
uranai関数については後から説明します。
2行目ではボタンを位置を指定して配置しています。
はい、このようにボタンが配置されたはずです。
これで一応見た目はできあがりました。
Tkinterで星占い②関数を作る
ここまでで大体の見た目は完成しました。
次は受け取った誕生日から星座を判定する関数と、ボタンを押したときに実行される関数についての説明をしていきます。
誕生日から星座を判定するseiza関数
まずはseiza関数について見ていきます。
タイトルにもある通り、誕生日と星座を紐づけます。
def seiza(): month = int(month_entry.get()) day = int(day_entry.get()) a = 100*month + day if 121<=a<=219: return 1 elif 220<=a<=320: return 2 elif 321<=a<=420: return 3 elif 421<=a<=521: return 4 elif 522<=a<=621: return 5 elif 622<=a<=723: return 6 elif 724<=a<=823: return 7 elif 824<=a<=923: return 8 elif 924<=a<=1023: return 9 elif 1024<=a<=1122: return 10 elif 1123<=a<=1222: return 11 else: return 0
seiza関数の中身で最初の部分を見てください。
私たちがエントリーボックス内に入力した数字をget関数によって取得しています。
このままではこれは文字列なのでint()でint型に直して、新しくmonthとdayという名前を付けています。
これでmonthとdayは整数になったので、条件分岐によって星座を判定していきましょう。
monthに100をかけてdayを足すことで日にちを3桁もしくは4桁の整数で表せるので上のように条件分岐していきます。
参考までに以下に星座と日にちの対応を載せておきます。
これで全ての星座がそれぞれ0~11の整数と対応付けられました。
ボタンを押したときに実行されるuranai関数
次にボタンを押したときに実行される関数について解説していきます。
Buttonウィジェットの第2引数にcommandで指定していたやつです。
def uranai(): seiza_list = ['やぎ座', 'みずがめ座', 'うお座', 'おひつじ座', 'おうし座', 'ふたご座', 'かに座', 'しし座', 'おとめ座', 'てんびん座', 'さそり座', 'いて座'] d = datetime.datetime.today() rank = ((d.day + seiza())%12) + 1 yourseiza = seiza_list[seiza()] first_text['text'] = '{0}: {1}位'.format(yourseiza,rank)
uranai関数の中ではまず、全ての星座が入ったリストがあります。
次にインポートしたdatetimeモジュールによって今日の日付を取得します。
これは日にちによってそれぞれの星座の順位を変動させるためです。
rankでは占いの結果(順位)を決めます。
今日の日付にseiza関数の返り値を足して、12で割った余りを求めています。(%は余りを求める演算子)
最後に1を足しているのは0位~11位じゃおかしいので1位~12位に直すためです。
yourseizaではseiza_listのインデックスにseiza関数の返り値を渡すことで自分の星座を取り出しています。
最後の行ではこのように書くと、first_text(今日の運勢は?)の部分を消して、右辺で指定した文字列を新しく表示してくれます。
このようにエントリーボックスに1月1日と入力して、ボタンを押すと結果が表示されました。(やぎ座: 6位)
まとめ
今回は少し長くなりましたが、Pythonのライブラリ、Tkinterを使って、簡単な星占いを作っていきました。
実際の占いの計算方法は、日付とseiza関数の返り値を足して12で割っただけの至極単純なものですが、この辺の計算方法に何かこだわりがある人は自分なりにアレンジしてみてください。
今後も定期的にコンピュータ系の記事を発信していくので是非、興味のある人はブックマークして見にきてくれると嬉しいです!!
※さらに30日間返金保証ありなので、実質リスクゼロ。
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル