ロボ団泉大津校のホームページにようこそ!

Pythonで簡単なGUIアプリを作ろう〜おみくじ編②

Python

Pythonで簡単なデスクトップアプリを作ってみよう!シリーズ。(2回目!シリーズにできそう?)

このブログで紹介しているプログラミングの記事は、教室で取り上げたものが中心なので、ちょっとプログラミングに興味がある中学生が理解できるような内容のつもりで書いています。

ですので、Pythonのクラスなど、なかなか理解が難しいものは出来るだけ使わないで書こうと思っています。

前回、おみくじアプリを紹介したので、今回は、その応用編です!
今も朝の情報番組などでやっているのかわかりませんが、今日のラッキーな星座は〇〇!みたいなやつです。

ポイントは、

今日の一位と最下位の二つの星座を出せるようにし、一位で出た星座が最下位でも出ないようにすること。

一位の星座を出したら、最下位の星座を出せるようにすること

の二つです。
前と同じく、Tkinterを使いますが、ウインドウの作り方、ラベルやボタンの置き方は前回、説明したので、今回は省略して、上のポイントのみに絞って解説します。

コードの全体像

はじめにコードの全体像です。今回は25行程度のプログラムです。
内容は次から説明していきますね!

import random
import tkinter as tk

lst_fortune = ["牡羊座","牡牛座","双子座","蟹座","獅子座","乙女座",
                "天秤座","蠍座","射手座","山羊座","水瓶座","魚座"]  #星座リスト

#--星座をランダムに選択し、ラベルに星座を表示
def changeText1(): 
    lb_value1['text'] = random.choice(lst_fortune)
    lb_value2['text'] = ""
    bt_disp2.config(state="active")
    lst_fortune.remove(lb_value1['text'])

def changeText2():
    lb_value2['text'] = random.choice(lst_fortune)
    bt_disp2.config(state="disable")

root = tk.Tk()
root.title("星座占い")
root.geometry("450x300")  #幅450,縦:300

bt_disp1=tk.Button(text="今日の運勢 1位の星座は?",command=changeText1)  #ボタン作成
bt_disp2=tk.Button(text="今日の運勢 最下位位の星座は?",command=changeText2)  #ボタン作成
bt_disp2.config(state="disable")
lb_value1=tk.Label(text="",height=2,width=10)  #ラベル作成
lb_value2=tk.Label(text="",height=2,width=10)  #ラベル作成

bt_disp1.pack()  #ボタン配置
lb_value1.pack()  #ラベル配置
bt_disp2.pack()  #ボタン配置
lb_value2.pack()  #ラベル配置

root.mainloop()

動かしてみると、以下のような感じになります。

星座のリストをつくる

おみくじアプリと同じように、表示する星座のリストを作っておきます。

lst_fortune = ["牡羊座","牡牛座","双子座","蟹座","獅子座","乙女座",
                "天秤座","蠍座","射手座","山羊座","水瓶座","魚座"] 

ボタンとラベルを表示する

ウインドウに表示するボタンとラベルの作成をします。一位の星座と、最下位の星座の二つを表示するので、ボタンとラベルは二つずつ必要になります。最下位のボタン(bt_disp2)は初めは押せない状態にしておきたいので、configure()を使って、無効化(disable)しておきます。
configure()はボタン以外のウィジェットにも使うことができるメソッドで、ウィジェットのステータスを変更することができます。

bt_disp1=tk.Button(text="今日の運勢 1位の星座は?",command=changeText1)  #ボタン作成
bt_disp2=tk.Button(text="今日の運勢 最下位の星座は?",command=changeText2)  #ボタン作成
bt_disp2.config(state="disable")
lb_value1=tk.Label(text="",height=2,width=10)  #ラベル作成
lb_value2=tk.Label(text="",height=2,width=10)  #ラベル作成

bt_disp1.pack()  #ボタン配置
lb_value1.pack()  #ラベル配置
bt_disp2.pack()  #ボタン配置
lb_value2.pack()  #ラベル配置

実行ボタンの関数をつくる

ボタン1を押したら<一位を表示>、ボタン2を押したら<最下位を表示>というアクションを実行したいので、ボタンのcommandで指定した関数changeText1とchangeText2を作ります。ボタンを押すとcommandで設定した関数が呼び出されます。

import random

関数内で、ランダムにリスト内の要素を一つ選ぶので、プログラム1行目にimport randomを記述しておきます。

コマンドで指定したchangeText関数を作ります。

#--星座をランダムに選択し、ラベルに星座を表示
def changeText1(): 
    lb_value1['text'] = random.choice(lst_fortune)
    lb_value2['text'] = ""
    bt_disp2.config(state="active")
    lst_fortune.remove(lb_value1['text'])
#--
def changeText2():
    lb_value2['text'] = random.choice(lst_fortune)
    bt_disp2.config(state="disable")

changeText1()の説明です。
random.choiceで星座リスト(lst_fortune)の中からランダムに値を一つ取り出します。
ラベル1のテキストを取り出した値に置き換えることで、一位の星座は?のボタンの下に表示されます。
ラベル2は空白にし、ボタン2のステータスを有効化(active)します。
remove()を使って、星座リスト(lst_fortune)から、先ほど、ランダムで取り出した星座(一位の星座)を取り除きます。remove()はリストから、指定した要素を除いたリストを返す関数です。

changeText2()の説明です。
random.choiceで星座リスト(lst_fortune)の中からランダムに値を一つ取り出します。changeText1()で行ったremove()により、この星座リスト(lst_fortune)からは一位の星座は取り除かれています。取り出した値を最下位の星座として表示します。ボタン2のステータスを無効化(disable)します。

完成です^^/
実行してみましょう。
*注意 今回はremove()を使っているので、繰り返し実行すると星座リストの要素が空になりエラーになります。