IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第24回 ついに、ヒット&ブローのプログラムと画面がくっついた。 (菱沼佑香) 2021年11月

こんにちは、吉政創成 菱沼です。 今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。

さて前回は、ヒット&ブローのチェックボタンを押した後に値を取得する方法(getメソッド)を学びました。今回はついにTkinterで作成した画面と、ヒット&ブローのプログラムをくっつけます。 ちなみに最終的な完成時にはユーザーが入力してきた値の履歴が表示される部分が追加されますが、それは次回学ぶことにします。

おさらい。

Entry(入力ボックス)に入った値を引き継ぐために、まずはメッセージボックスに表示させました。 それにはdefの部分を以下のように書き換えます。

----------
>>>def ButtonClick():
>>> b = editbox1.get
>>> tmsg.showinfo("入力されたテキスト", b)

書き換えると、ボタンをクリックして表示されるメッセージボックスが次のように変化します。

fig01

getメソッドは辞書からkeyをもとにvalue(値)を取り出す(取得する)ものです。 この部分では「b = editbox1.get」と記述されていますが、editbox1は文字を入力するための箱(tkinter:Entry)で辞書ではありませんが、そこに入れられた値を取得するためにgetが使用されているということになります。 ということで、これで値をプログラムに引き渡せるようになりました。

ゲームが終わったら画面を閉じる方法

さて、今回は画面とゲームのプログラムをくっつける部分を学びますが、その前に、4桁の数字が当たったらゲーム画面を閉じるという処理を学びます。

----------

引用P.174 まだ説明していないのは42行目の当たったときにゲームを終了する操作です。当たったときには、次のようにしています。

>>>ヒットが4ならあたりで終了
>>>if hit == 4:
>>> tmsg.showinfo("当たり","おめでとうございます。当たりです")
>>> #終了
root.destroy()

このようにdestroyメソッドを実行すると、ウィンドウが破棄され、プログラムが終了します。

----------

プログラムでは数字が4つあっていればゲームが終了になりますので、if文で「hitの数が4なら」という条件を付けてあげればできるようです。 def関数で設定することもできるようなので、YesかNoかを問うメッセージボックスを使って、Yesの場合には画面を閉じるというものを前回のウィンドウの表示部分を使って試しにやってみました。

それがこちらです。サンプルコードに赤枠の部分を追記しています。

fig02

「おわる?」というボタンを追加し、ボタンを押すとメッセージボックス(askyesno)が表示させます。この時、「はい」を押した場合には画面を閉じ、「いいえ」を押されたときには終了せずに元の画面に戻るようにします。 そのためにまず、closeという関数をdefで作ります。askyesnoの「はい」の戻り値は「True」なので、「True」の値が入ったときには、root.destroyで画面を閉じるという処理を設定します。 button2(おわる?)を作成し、command=closeを書いてあげれば完成です。あとは、「おわる?」ボタンに対して、[command = close]を設定してあげればclose関数が適用されます。

実際にやってみると画像の通り、「はい」で画面が閉じられ、「いいえ」でメッセージボックスが消え、元のゲームの画面だけになります。

画面の終了ボタン(windowsなら×、macなら赤丸)に対して終わっていいかのメッセージを表示して終処理を行うという方法もあるようです。興味のある方は参考リンクをご参照ください。

参考:Tkinterの使い方:メインウィンドウを作成する(destroy)|だえうホームページ

別で作ったプログラム同士をくっつけけた。変更箇所は?

ではここからようやく!第18回でできたゲーム部分のプログラムと、前回できた画面のプログラムを一部改変しながらくっつけていく作業をやってみます。

----------

引用P.173
関数の処理のうち、以下の部分には「変数bにユーザーが入力した値」が格納されています。

>>>def ButtonClick():
>>>b = editbox1.get

これはLesson5-5で作成したexample05_05_01.pyでも、変数bに入れていたので、

>>>while True :
>>> b = input("数を入れてね")
これをそのままコピー&ペーストし、プログラムを調整すればよいのです。

----------

教科書では図でどのように結合したかが説明されていますが、細かい部分の説明は入っていなかったのでひとつひとつ見比べて確認した図を作成しました。

fig03

青枠の部分がTkinterで作成した画面の部分です。 変更された場所は矢印や赤枠の部分ですが、こんな感じでこまごまと変更が入っています。

ところで、なぜこの並びなのかがよくわからず、いろいろ移動して実験してもみました。(数字をチェックする部分をわざわざ分解する必要はないので、それ以外の部分で。) 例えば、ランダムな値を作成する部分をimportの後に持ってきても動きますが、Tkinterの部分をimportの後に持ってくると正常には動きませんでした。(mainloopを最後に残したままにしても正常に動きませんでした。)

ButtonClickが後ろにいるせいかなと思い調べてみるとどうやらそのようで、Pythonがインタプリタ言語であるためのようです。(インタプリタ言語の場合、全体を読んでからプログラムを実行するのではなく、一行ずつ実行していくため。)

というわけで、この件でいえば、def関数でButtonClick関数が作成される前に、ButtonClick関数が必要なTkinterのbutton1が作成されたところで、button1にButtonClick関数が適用できないので、正確に適用できないせいなのかなと理解することにしました。

Pythonの変数や関数の定義位置について説明しているサイトがありましたのでご興味のある方はこちらもご参照ください。

Python♪変数や関数の定義位置について整理してみました|Snow Tree in June
定義前の変数、関数、クラスを参照するときは関数定義内で参照する。

それでは今回はこちらで終了です。お付き合いいただきありがとうございました。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes