なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

とりうご第2.5回 python

 とりあえず動けばいいやという趣旨でpythonのプログラミングを説明しようと過去に2回ほど記事を書いたけど、こんなの一体誰が参考にするんだ!?と思い、頓挫していたわけですが、今日はとりあえず、「とりうご」で1番最初に作ることになるであろうと思っていたキッチンタイマーの解説をしちゃいたいと思います。またとりうご第3回以降は気分が乗って暇なときにやっていこうと思ってます。

それじゃあ、まずはソースコードから50行でタイマーがかけちゃいます。


from Tkinter import *
from tkMessageBox import *
import time


def pop():
showinfo(title="test",message="バルス!!")
def count():
one_count()
if mode.get() == 0:
pop()
else :
root.after(1000,count)
def one_count():
i = mode.get()
i = i - 1
mode.set(i)
string = str(i / 60)
string = string + ":" + str(i % 60)
count_str.set(string)

def set5min():
count_str.set("5:00")
def set3min():
count_str.set("3:00")




root = Tk()

string = ""

mode = IntVar()
mode.set(180)

count_str = StringVar()
count_str.set("3:00")

label = Label(text="timer")
label.pack()

Radiobutton(root,text="3分間待ってやる",variable=mode,value=18,command = set3min).pack()
Radiobutton(root,text="5分間待ってやる",variable=mode,value=300,command = set5min).pack()

Button(root,text="Start",command=count).pack()

label2 = Label(textvariable = count_str)
label2.pack()
root.mainloop()



最初の3行はモジュールのインポートをしています。Pythonは初期状態では必要最低限の機能しか備えておらず、必要な拡張モジュールをimport することでいろいろなことが簡単にできます。

次に def から始まるコードが続きますが、defは関数の定義です。
このプログラムではまずpopという名前の関数を定義しています。
popが呼ばれるとshowinfo関数(showinfo関数はtkMessageBox をimport することで自動的に使えるようになるのでこの関数は定義する必要ありません)を実行します。どのように動作するのか気になったときは対話モードでpythonを使うと分かりやすくてお勧めです。たとえば今回の場合は
対話モードで
>>> from tkMessageBox import *
>>> showinfo(title="test",message="barusu")
と入力すれば何が起きるか実験することが簡単にできます。(WINDOWSの場合 IDLE (Python GUI) というpythonをインストールしたときについてきたプログラムを実行すれば対話モードが使えます)

次はcout関数の定義です。この関数はプログラムの数行先に定義されているone_count関数を呼び出します。
そして、ifによる分岐命令により、mode.get()という後に使われているmode変数の値を取り出す関数で取り出した値が0と等しかった場合(mode.get() = 0ではなくmode.get() == 0)はpop関数を呼び出し、そうでない場合(else)は一秒後にまたcount関数が呼ばれるようにroot.after(1000,count)を呼びます。

次はone_count関数で
iにmodeの値をmode.get関数により代入し、次にi に i-1 の値を代入する、つまりはiから1引く。
そしてmodeにiの値を代入する。このときmode = iとはしない。なぜならmode変数はIntVar()という特殊な変数のようなものだからである。なのでmode.set(i)でmodeにiの値を入れる。
そしてstringという名前の変数にまず、str()関数により文字列型に変換されたiから60を割った値を代入する。
つぎにそのstring変数に":"という文字列とiを60で割ってでた余りを文字列型に変更したものとを合体させてものを代入する。この文字列がタイマーの表示に使われる。
そしてcount_strという特殊な変数にstring変数を代入する。

残る関数の定義はあと2つ
しかし
どちらもやっていることは大して変わらない
cout_str変数に文字列を代入しているだけ。

これで関数の定義はおしまい。

このプログラムではまず、
Tk()関数により、rootという変数に最初のwindowのようなものを与える。
そしてstring = "" とすることによりなにも文字列が入っていないstring変数を用意しておく
つぎにmodeというIntVar()という特殊な、整数がはいっている変数を用意し、それに180を入力しておく。

つぎにcount_strという変数をStringVar()というこれまた特殊な変数として用意し、"3:00"という文字列を入力しておく。

そして
label = Label(text="timer")
によりwindowに貼る文字を入れておく変数を用意し、
label.pack()
でwindowに貼り付ける。

labelの次はwindowにラジオボタンという選択式のボタンを貼り付ける。
この2行は上のlabelのように

Radiobutton(root,text="3分間待ってやる",variable=mode,value=18,command = set3min).pack()
Radiobutton(root,text="5分間待ってやる",variable=mode,value=300,command = set5min).pack()

      ↓

x1 = Radiobutton(root,text="3分間待ってやる",variable=mode,value=18,command = set3min)
x1.pack()
x2 = Radiobutton(root,text="5分間待ってやる",variable=mode,value=300,command = set5min)
x2.pack()

という風にかいても同じである。

Rudiobutton関数のvariableにmodeを指定してやることにより、そのラジオボタンが選択されたときに、valueに指定した、ここれは18とか300とかの値をmodeに代入することができる。そしてcommandに関数を指定するとそのラジオボタンが押されたときその関数を実行することができる。

Button(root,text="Start",command=count).pack()
は先と同様の考え方で
b = Button(root,text="Start",command=count)
b.pack()
として書いてしまってもいける。
Button関数はtextに指定した文字列の名前がついたボタンをつくることができ、ボタンが押されたときcommandに指定された関数、ここではcountが実行される。『つまりこのプログラムはこのボタンが押されたときに始めてcount関数が
呼ばれ、あとはroot.after(1000,count)により、いっていのインターバルで同関数が呼ばれるようになる。』


これは先に同じような散々説明したので飛ばす
label2 = Label(textvariable = count_str)
label2.pack()


最後の
root.mainloop()
はTkinterモジュールをつかってwindowがあるアプリケーションを使うときに最後に書いておいておかないといけないおまじないのようなものと今は考えておいてください。

以上説明おわり。

こんな雑でいい加減な説明では理解できないと思うので、まずはソースをコピペして、実行してみて、徐々にソースを弄っていけばなんとなく分かるようになっていくはず。

質問があればコメントでください。
スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/60-3a63b909

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。