プログラミング

遂に…GUI化完成!!(百人一首練習ソフト

こんにちは、チズチズです!

百人一首練習ソフト、作るだけ作っておいて全然練習してないですw

こだわりつつ練習しつつ…頑張ります。

このGUI化はとっても大変でした。

エラーが出まくり、もう破茶滅茶。辞めようかとも思いました。

何とか完成しました…

こんなウィンドウです。

ラベルを更新させたい!

ラベルは大抵…

こう書きますよね。

このソフト…問題数は1問だけじゃないので、どんどんラベルを変える必要があります。

しかし、問題が変わる度にこれを実行しているとどんどんラベルが下へ下へと下がって画面外に出てしまい余計なラベルも表示されてしまいます。

StringVarとの出会い

更新の方法が全然わからなくてさまよってたときに出てきたのがこの「StringVar」です。これを使うことで、ラベルの更新ができるのです!

使い方

var.set()でラベルの文字を変えられるんです!

簡単でしょ! 知らなかった人はぜひ使ってみてください。

コード鑑賞

一応完成ですが、まだβ版みたいなもんです。なぜなら

  • セーブ機能未搭載
  • 問題数カウント未搭載
  • 間違えた時答えの表示がされない

等々…

というかめっちゃコードスッキリした!!

理由は後程わかります。

クラス定義やウィンドウ作成のところは前回説明したので省きます。

GitHubにも置いてあります。

前のCUIバージョンもあります。

GitHub

色々と初期化

self.i は間違えた回数です。

チャンスの数と同じになると間違いになる判定をします。

ラベル

始めに表示させるものを無しにしています(処理速度一瞬だけど

font= のところでは

  1. フォント
  2. サイズ
  3. 普通か太字か
  4. 斜体ありか無しか
  5. 下線ありかナシか
  6. 取り消し線ありか無しか

変えたいものが3番だけだったら456の設定は省いても大丈夫です。

ノーマルのままにしたい場合は、(変えない

“”にしておけば大丈夫です。

ボタン、入力ボックス

入力ボタンと入力ボックスの横幅を揃えました。

….pack()の代わりに….place()を使うことで、縦や横や縦幅横幅も設定できます。

ソフトの終了

終了ボタンのコマンドのfin関数です。

self.quit()で画面を消して、sys.exit()でソフトを終了。

問題作成

これは、CUIバージョンと同じようにランダムの数を指定させて色々やるってやつです。

self.iを0にします。(新しい問題になるから

self.var.set(self.ue)ラベルを更新させます。問題の上の句を表示させます。

回数判定

self.i(答えた回数)がチャンス回数と同じだったらTrue。そうじゃなかったらFalseを返します。

正誤判定

入力ボタンが押されたらこの関数が呼ばれます。

まずは入力ボックスの中身を取り出して、入力ボタンを空にします。

self.iに1を足します。(答えた回数だから

if~else~で正誤判定してから回数オーバーしているかのover関数で判定。

Trueが返ってきたら新しい問題に変わります。

(回数オーバーです。とか書いておくの忘れてた…

回数判定を最初に持ってくると、答えがあってた場合に回数で打ち切りにさせられてしまうかもしれないので最後に持ってきます。

つまづいたところ

入力ボックスに文字を入力してボタンを押したら入力ボックスの中身を取り出すというコードを書きたかったんですけど上手くいきませんでした。

ボタンが入力されるまでボタンが入力されたら~というイベントをループさせ続ける

こんなことしていると、無限ループに陥ってエラーになります。

じゃあどうすればいい

Sleepさせて、タイム制限を設けよう!

Sleep関数はあくまでもコードの進みを止めるだけであって、止まってる間にボタン押しても何も起きません。しかも、無限ループの中に置いてもさっきと変わりません。

mainloop()に戻ってこい!

無限ループ回してたら戻るわけないじゃないですか。

Twitterで教えてもらったんですが、mainloop()に来たら監視みたいなものをします。

ボタンが押されたらこの関数を実行する… このラベルを表示するとか

今まで宣言されたものはmainloop()に来たらなにか引っかかる事(例えばボタン)イベントが起きたらこれが起きると監視しているんです。

CUIのときのコードを当てにせず、ボタンが押されたらの処理だけを書いていく!

下手にループの中でボタン定義させたりでもしたら重くなって正常な処理が行われません。

ボタンが押されたら~だけの処理をしましょう。

そうすることで、処理も簡略化されました。

前は多重ループがありましたが、今回のはループさえありません。

きっと余計な処理があったからでしょう。

固定概念にとらわれずこうしてみたら~って考えてみると案外成功するもんですよ(5時間位かかった人俺

コードがスッキリした理由をまとめる

不必要だったループを消した。

これが一番の原因です。

CUIではやってませんが、ボタンが押されたら関数を実行してその関数でカウントもできるしってなってループが不必要になりました。

しかも、ループさせると無限ループに陥って終わります。

反面教師… これからはできるだけループを減らします。

というかループを入れないように努めます。(自力デバッグ

今後の予定

  • セーブ機能搭載
  • スコア機能搭載
  • エンターキーでも入力できるようにする
  • 暗記モードを付ける(先になりそう

まずは、セーブ機能エンターキーを実装させて数週間は必死で覚えたいです(予定

そっから色んな機能を付け足してみます。

機械学習の更新が止まっている理由(茶番

メモリ不足だからです。

ディープラーニングしていたときに、PyCharmがメモリ落ちしました。

タスクマネージャーで監視したところ…

90%近く… これでも軽めの機械学習ですが、これからもっと重くなったらパソコンが壊れてもおかしくありません。

お正月にメモリ8gbか16gb買って増設するつもりです。

本当のこと言うとマザボのスペーサー何本か締め忘れててマザボ不安定だからメモリさしたらマザボ折れるかどっかに触れてショートするかもしれないっていうめっちゃ危険な状況で約1年間過ごしてる相棒です。

スペーサーってマザボ取り外さなきゃ取り付けられなかった気がするけどスペーサーあったら外そうかな。でも失敗しそうだから辞めよう(金欠

今までの人生でも上位に入る失敗したことです。

正常動作を期待。

Pythonでは良いけどPCにはエラー出ないでほしい。(金かかるから

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です