コンテンツにスキップ

Pythonアプリ(2):クリッカーを作ろう

クリッカーを作ろう

今回は、10秒間でボタンがクリックされた回数を表示するアプリを作ってみます。単純な仕組みですが、タイマーを付けたり工夫すると楽しいものになります。

前回まで

from tentoapp import *
app = App()
b = Button(app)
b.text = "クリックして"
b.pack()
app.start()

実行結果

tentoapp-02-00.png

ボタンのアクション

現在はボタンが表示されるだけで、ボタンを押しても何も変わりません。 そこで、ボタンを押したら「クリックしたよ!」という表示が出るようにします。以下のようにコードを変更しましょう。

from tentoapp import *
def click():
print("クリックしたよ!")
app = App()
b = Button(app)
b.text = "クリックして"
b.onclick = click
b.pack()
app.start()

変更箇所

def click():
print("クリックしたよ!")

まず、 click という 関数(かんすう) を追加します。関数は、プログラムをまとめて名前をつけたものです。今回は、「クリックしたよ!」という文字を出すだけの関数です。 defデフ と読みます。「定義する」という意味です。

追加部分
b.onclick = click

ここでは、ボタンが押されたときに動くもの(onclickオンクリック)としてさきほど作ったclick関数を割り当てています。

実際にプログラムを実行してボタンをクリックすると、このように実行する側の画面に文字が表示されます。

tentoapp-02-01.png

回数を表示するラベルの追加

次に、クリックした回数を表示できるようにします。

from tentoapp import *
def click():
print("クリックしたよ!")
app = App()
l = Label(app)
l.text = "0"
l.pack()
b = Button(app)
b.text = "クリックして"
b.onclick = click
b.pack()
app.start()

変更箇所

l = Label(app)
l.text = "0"
l.pack()

回数を表示するラベルを追加しています。

tentoapp-02-02.png

クリックしたら数字が増えるようにする

このままだといくらクリックしても数字が0のまま変わらないので、クリックしたら数字が増えるようにします。

from tentoapp import *
count = 0
def click():
global count
count += 1
l.text = count
app = App()
l = Label(app)
l.text = "0"
l.pack()
b = Button(app)
b.text = "クリックして"
b.onclick = click
b.pack()
app.start()

変更箇所

count = 0

まず、クリックした回数を記録するためにcountという変数を用意します。countは最初は0にしなければならいので、 count = 0 というふうにcountの中身を0にしています。

def click():
global count
count += 1
l.text = count

次に、クリックしたときに呼び出されるclick関数を修正して、countが増えるようにします。 count += 1 は、 count = count + 1 と同じで、countを1増やすという意味です。そして、 l.text = count でラベルの表示文字をこのcountにしています。

global宣言

ここでは、 global count が一番わかりにくいところでしょう。 実は、pythonの関数では、関数の外側で定義された変数の中身を変えることができません。そこで、global宣言(グローバルせんげん)をして関数の中でもcountの値(あたい)を変更できるようにしています。 ちなみに、関数などの外側で宣言された変数のことを グローバル変数 といいます。

タイマーを追加する

今の段階でもクリックすると数字が増えますが、ただ増えるだけだとつまらないですね。そこで、タイマーを付けて10秒間でクリックできなくなるようにします。これでクリック数の競争ができます。

from tentoapp import *
count = 0
stop = False
def click():
global count, stop
if stop == False:
count += 1
l.text = count
def end():
global stop
stop = True
app = App()
l = Label(app)
l.text = "0"
l.pack()
b = Button(app)
b.text = "クリックして"
b.onclick = click
b.pack()
app.after(10000, end)
app.start()

変更箇所

stop = False
def end():
global stop
stop = True

まず、終了したかどうかを表す変数stopを追加して、値(あたい)を False (フォールス)にしておきます。Falseは「ちがう」という意味なので、 stop = False は「ストップしてない」ということをあらわしています。 次にstopを True (トゥルー)にする end() 関数を用意します。Trueは「正しい」という意味なので、 stop = True は「ストップした」ということをあらわしています。

def click():
global count, stop
if stop == False:
count += 1
l.text = count

click() 関数もこのように修正します。if文を用い、stopがFalseのときだけcountを増やすようにします。

app.after(10000, end)

もうひとつ最後に、 after(アフター)命令 を呼び出します。これは、指定した時間のあとに関数を実行させるという命令です。ここでは、10000ミリ秒後、つまり10秒後にend関数を実行するように設定しています。

やってみよう!

1. 表示をリッチに☆

いまは数字が表示されるだけですが、 10回クリック! というような表示に変えてみましょう。

2. スタートボタンを作ろう☆☆

スタートボタンを作って、スタートボタンをクリックしてから始まるようにしよう。一回タイマーが終わっても、またスタートボタンをクリックすると新しく始められるようにします。

3. 最高点を表示しよう☆☆

最高点が表示されるように変えてみよう。最初の最高点は0点ですが、二回目からは最高点が記録されるようにします。