履歴を表示させてウィンドウ版数当てゲームを完成させるよ!

履歴を表示させてウィンドウ版数当てゲームを完成させるよ!

ウィンドウ内に履歴を表示させよう!

前回までで、ウィンドウを使った数当てゲームはちゃんと作れた。でも数字を入力するたびに新しいウィンドウが出たり履歴が見れないが遊びにくいよね。今回はそこを修正していくよ!

履歴用のテキストボックスをつくろう!

履歴の表示には「テキストボックス」という部品を使ってみるよ。ウィンドウを分割して左に入力欄、右に履歴って感じに表示しよう。これもtkinterを使うよ。書き方はこんな感じ。

rireki_01 = tk.Text(root, font=("Helvetica",14))

「rireki_01」という名前をつけて、そこにテキストボックスを作ってるんだね。そして次に他の部品と同じようにplace()使って置けばいいんだね。このときテキストボックスが幅を取るので、そのぶんウィンドウ自体も大きく調整してみた。こんな感じだ。

#ウィンドウを作る
root = tk.Tk()
root.geometry("600x400")
root.title("数当てゲーム")

#履歴のテキストボックスを作る
rireki_01 = tk.Text(root, font=("Helvetica",14))
rireki_01.place(x=400, y=0, width=200, height=400)

width=200っていうのは横幅が200pxって意味で、height=400は高さが400pxって意味なんだ。

テキストボックスに表示させよう!

次はいま作ったテキストボックスに実際に履歴を表示させるよ。テキストボックスに文字を出すには「insert()」を使う。前にshowinfo()で表示させてた部分をこれに書き換えていけばいいんだね。 実際に書くとこんな感じ。

rireki_01.insert(tk.END, b + " / H:" + str(hit) + ", B:" + str(blow) + "\n")

最初の引数の「tk.END」というのは、テキストを「末尾に追加する」という意味なんだ。

これでウィンドウ版の数当てゲームの完成!いままでのプログラムを全部まとめるとこんな感じだ。

# codeing=utf-8
import random
import tkinter as tk
import tkinter.messagebox as tkmsg


#ボタンをクリックしたとき
def ButtonClick():
    
    #入力欄の内容を取得
    b = entry_01.get()
    
    #正しい入力か判定する
    input_ok = False
    if len(b) != 4:
        tkmsg.showerror("エラー", "4桁の数字を入れてね")
    else:
        input_ok = True
        for i in range(4):
            if(b[i]<"0") or (b[i]>"9"):
                    input_ok = False
                    tkmsg.showerror("エラー", "数字じゃないよ")
                    break
                 
    #ヒットとブローを判定する①②
    if input_ok == True:
        #①ヒット
        hit = 0
          
        for i in range(4):
            if a[i] == int(b[i]):
                hit = hit+1
        #②ブロー
        blow = 0
        for j in range(4):
            for i in range(4):
                if (int(b[j]) == a[i]) and (a[i] != int(b[i])) and (a[j] !=int(b[j])):
                    blow = blow+1
                    break
                
        #ヒットが4なら終了
        if hit==4:
            #メッセージをだしてウィンドウを閉じる
            tkmsg.showinfo("アタリ", "アタリです!")
            root.destroy()
        else:
            #ヒット数とブロー数を表示
            #tkmsg.showinfo("ヒント","ヒット:"+str(hit)+" / ブロー:"+str(blow))
            rireki_01.insert(tk.END, b + " / H:" + str(hit) + ", B:" + str(blow) + "\n")
        

#4桁のランダムな数字をつくる
a = [random.randint(0,9),
     random.randint(0,9),
     random.randint(0,9),
     random.randint(0,9)]

#ウィンドウを作る
root = tk.Tk()
root.geometry("600x400")
root.title("数当てゲーム")

#履歴のテキストボックスを作る
rireki_01 = tk.Text(root, font=("Helvetica",14))
rireki_01.place(x=400, y=0, width=200, height=400)

#ラベルを作る
label_01 = tk.Label(root, text="4桁の数字をいれてね", font=("Helvetica",14))
label_01.place(x=20, y=20)

#入力欄を作る
entry_01 = tk.Entry(width = 4, font=("Helvetica",28))
entry_01.place(x=20, y=45)

#ボタンを作る
button_01 = tk.Button(root, text="チェック", font=("Helvetica",20), command=ButtonClick)
button_01.place(x=100, y=54)

root.mainloop()
今日のまとめ

  • Text()でテキストボックスを作ろう!
  • テキストボックスに文字を表示させよう!