【Python】tkinter:1/8192選択アプリ

■概要

tkinterのライブラリを使用して、1/2を選択し続け、1/8192を目指すアプリを作成する。
実装概要は以下の通り。

  • ラジオボタンで「左」または「右」を選択する
    「左」を選択した場合、「0」を設定する
    「右」を選択した場合、「1」を設定する
  • 「回答」ボタンを押下し、ラジオボタンで選択した左右と一致しているか判定する
  • 正解の場合、現在の正解数と確率(例:1/2、1/4など・・・)をラベルで表示する
    不正解の場合、正解数と確率を初期化する
  • 直近10件の過去の正解を記録し、表示する

■フローチャート

  • メイン処理
開始
開始
tkinterのインスタンス
tkinterのインスタンス
タイトル設定
タイトル設定
画面幅の設定
画面幅の設定
左右ラジオボタンの値を保持
左右ラジオボタンの値を保持
正解数・確率ラベルの値を保持
正解数・確率ラベルの値を保持
直近10件の回答一覧リスト初期化
直近10件の回答一覧リスト初期化
正解数と確率(分母)の初期化
正解数と確率(分母)の初期化
ラジオボタン「左」・「右」をセット
ラジオボタン「左」・「右」をセット
正解数・確率ラベルをセット
正解数・確率ラベルをセット
直近10件の回答ラベルをセット
直近10件の回答ラベルをセット
回答ボタンセット
回答ボタンセット
画面処理
画面処理
終了
終了
Text is not SVG – cannot display
  • 1/2判定処理(回答ボタン押下処理)
開始
開始
0,1か乱数をセット
0,1か乱数をセット
正解判定
正解判定
初回正解判定
初回正解判定
確率分母に2をセット
確率分母に2をセット
確率分母を2倍
確率分母を2倍
正解回数をインクリメント
正解回数をインクリメント
正解数と確率分母を初期化
正解数と確率分母を初期化
直近回答数
直近回答数
一番古い正解を削除
一番古い正解を削除
回答乱数
回答乱数
左をセット
左をセット
右をセット
右をセット
回答ラベルの文字を更新
回答ラベルの文字を更新
回答一覧ラベル文字初期化
回答一覧ラベル文字初期化
直近10回分の回答リスト分繰り返し
直近10回分の回答リスト分繰り返し
回答一覧ラベル文字をセット
回答一覧ラベル文字をセット
回答一覧ラベルをセット
回答一覧ラベルをセット
終了
終了
正解
正解
不正解
不正解
初回
初回
その他
その他
>10
>10
その他
その他
0
0
その他
その他
Text is not SVG – cannot display

■サンプルコード

import random

import tkinter as tk
import tkinter.ttk as ttk


# 1/2判定処理
def check_answer():
    # 0, 1か乱数を取得
    ans_int = random.randint(0, 1)

    # 正解:乱数と選択したラジオボタン判定
    if ans_int == radiobtn_value.get():

        # 初回正解判定
        if result_Count.get() == 0:
            # 確率分母に2をセット
            result_Denominator.set(2)

        else:
            # 確率分母を2倍
            result_Denominator.set(result_Denominator.get() * 2 )
            
        # 正解回数インクリメント
        result_Count.set(result_Count.get() + 1)

    # 不正解
    else:
        # 正解数と確率分母を初期化
        result_Count.set(0)
        result_Denominator.set(0)

    # 回答ラベルの文字を更新
    label_result["text"] = str(result_Count.get()) + "回正解:1/" + str(result_Denominator.get())

    # 直近回答数が10より多い
    if len(list_ans_top_10) > 10:
        # 一番古い正解を削除
        list_ans_top_10.pop(0)

    # 回答乱数が0:左、1:右をセット
    if ans_int == 0:
        list_ans_top_10.append('左')
    else:
        list_ans_top_10.append('          右')

    # 回答一覧ラベル文字列初期化
    ans_top_10 = ''

    # 直近10回分の回答リスト分繰り返し
    for ans in list_ans_top_10:
        # 回答ラベル文字列をセット
        ans_top_10 = ans_top_10 + ans + '\n'

    # 回答一覧ラベルをセット
    label_ans_list["text"] = ans_top_10


# メイン処理
if __name__ == '__main__':

    # tkinterのインスタンス
    base = tk.Tk()
    # タイトル設定
    base.title("1/8192")
    # 画面幅の設定
    base.geometry("500x300")

    # ラジオボタンの値を保持
    radiobtn_value = tk.IntVar()

    # ラベルの値を保持
    result_Count = tk.IntVar()
    result_Denominator = tk.IntVar()
    
    # 回答一覧リスト
    list_ans_top_10 = []

    # 初期値:正解数と確率分母の数
    result_Count.set(0)
    result_Denominator.set(0)

    # ラジオボタン:左
    radiobtn_right_left = ttk.Radiobutton(
        base,
        text='左',
        value=0,
        variable=radiobtn_value)
    radiobtn_right_left.place(x=100, y=100)

    # ラジオボタン:右
    radiobtn_right_left = ttk.Radiobutton(
        base,
        text='右',
        value=1,
        variable=radiobtn_value)
    radiobtn_right_left.place(x=300, y=100)

    # 正解数と確率ラベルをセット
    label_result = tk.Label(base)
    label_result.place(x=180, y=40) 
    label_result["text"] = str(result_Count.get()) + "回正解:1/" + str(result_Denominator.get())

   # 回答ラベルセット
    label_ans = tk.Label(base)
    label_ans.place(x=400, y=40) 
    label_ans["text"] = "直近の正解"
    
    # 回答一覧ラベルセット
    label_ans_list = tk.Label(base)
    label_ans_list.place(x=400, y=80) 
    label_ans_list["text"] = ""

    # 回答ボタンの設定
    btn_answer = tk.Button(base, text="回答", command=check_answer)
    btn_answer.place(x=200, y=200)

    # 画面の表示
    base.mainloop()

■実行結果

  • 初期画面

  • 2回正解&直近正解数が5回

  • 4回正解&直近正解数が10回

コメント