LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

より良い数当てゲームに!

Posted at

リンク集

はじめてのPython
Markdown

ウィンドウ関連

ウィンドウ表示

# coding:utf-8
import tkinter as tk

#ウィンドウを作る
root = tk.Tk()
#ウィンドウを表示
root.mainloop()

as tkの部分は、tkinterを省略表記している。これ以降「tk」と表記するだけで、「tkinter」を使う意味と同じになる。
またroot~の2行はウィンドウを表示するときの決まり文句である。

ウィンドウサイズの変更

root.geometry("400x150")

このように打てばウィンドウのサイズを調節できる。形状としては(幅×高さ)となっており、この場合だと[400×150(ピクセル)]のウィンドウが出来上がる。しかし、かける(×)のマークではなく、エックス(x)を使う点には注意が必要である。

ウィンドウタイトル設定

root.title("数当てゲーム")

titleメソッドを実行し、「.title("~")」と入力すると、ウィンドウのタイトルが「~」に設定される。

結果

ここまでのプログラムを実行してみると、下のように表示される。
キャプytu.PNG

メッセージと入力欄の配置

<最終的な完成例>

# coding:utf-8
import tkinter as tk

root = tk.Tk()
root.geometry("400x150")
root.title("数当てゲーム")

labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))
labell.place(x=20,y=20)

editbox1=tk.Entry(width=4,font=("Helvetica",28))
editbox1.place(x=120,y=60)

root.mainloop()

メッセージの配置

labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))

「root」にてラベルを貼り付ける対象となるウィンドウを決め、「text=""」の部分がメッセージとして表示される。
ここまではラベルを作成する作業。

labell.place(x=20,y=20)

「(x=x座標,y=y座標)」という形でウィンドウに配置する。
この場合はx座標が20,y座標が20の位置に配置することとなる。

入力欄の配置

editbox1=tk.Entry(width=4)

「width」はテキスト入力欄の幅であり、文字を4個入力させるため「=4」としている
これを「editbox1」という変数に代入。

editbox1.place(x=120,y=60)

ウィンドウに配置する行程でラベル配置の時と同様である。

フォントの種類・サイズ変更

labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))

「font=("フォント名",フォントサイズ)」という引数を追加。
この場合、「Helvetica」というフォントで、「14ポイント」というサイズを指定している。

editbox1=tk.Entry(width=4,font=("Helvetica",28))

これに関しても同様。

結果

ここまでのプログラムを実行すると下のようになる。
うyキャプチャ.PNG

ボタンが押された時のメッセージ表示

<最終的な完成例>

# coding:utf-8
import tkinter as tk
import tkinter.messagebox as tmsg

#ボタンがクリックされたときの処理
def ButtonClick():
    tmsg.showinfo("テスト","クリックされたよ")

root = tk.Tk()
root.geometry("400x150")
root.title("数当てゲーム")

labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))
labell.place(x=20,y=20)

editbox1=tk.Entry(width=4,font=("Helvetica",28))
editbox1.place(x=120,y=60)

button1=tk.Button(root,text="チェック",font=("Helvetica",14),command=ButtonClick)
button1.place(x=220,y=60)

root.mainloop()

ボタンの配置

button1=tk.Button(root,text="チェック",font=("Helvetica",14))
button1.place(x=220,y=60)

Buttenメソッドを利用する。一行目で作成したボタンを「butten1」という変数に代入。
2行目はplaceメソッドを利用し、基本的にはこれまでと同様。

メッセージ表示

command=ButtonClick

ここでクリック時に関数が実行されるようになる。

#ボタンがクリックされたときの処理
def ButtonClick():
    tmsg.showinfo("テスト","クリックされたよ")

1行目で関数を作り、2行目ではshowinfo関数(情報を表示する)を利用する。
showinfo("タイトル","表示したい文字")という形になる

結果

青丸の部分にボタンが追加され、チェックを押すと2枚目の画像のように表示される。
うキャプチャ.PNG
ghdytキャプチャ.PNG

ヒット&ブローの当たり判定組み込み

<最終的な完成例>

# coding:utf-8
import random
import tkinter as tk
import tkinter.messagebox as tmsg

#ボタンがクリックされたときの処理
def ButtonClick():
    #テキストが入力欄に入力された文字列を取得
    b=editboxl.get()

    #Lesson 5-4のプログラム
    #4桁の数字かどうかを判定する
    isok=False
    if len(b) !=4:
        tmsg.showerror("エラー","4桁の数字を入力してください")
    else:
        kazuok=True
        for i in range(4):
            if (b[i]<"0")or(b[i]>"9"):
                tmsg.showerror("エラー","数字ではありません")
                kazuok=False
                break
        if kazuok:
            isok=True

    if isok:
        #4桁の数字であったとき
        #ヒットを判定
        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:
            tmsg.showinfo("当たり","おめでとうございます。当たりです")
            #終了
            root.destroy()
        else:
            #ヒット数とブロー数を表示
            tmsg.showinfo("ヒント","ヒット"+str(hit)+
        "/"+"ブロー"+str(blow))

#メインのプログラム
#最初にランダムな4つの数字を作成しておく
a=[random.randint(0,9),
   random.randint(0,9),
   random.randint(0,9),
   random.randint(0,9)]


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

#ラベルを作る
labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))
labell.place(x=20,y=20)

#テキストボックスを作る
editbox1=tk.Entry(width=4,font=("Helvetica",28))
editbox1.place(x=120,y=60)

#ボタンを作る
button1=tk.Button(root,text="チェック",font=("Helvetica",14),command=ButtonClick)
button1.place(x=220,y=60)

#ウィンドウを表示する
root.mainloop()

入力されたテキストの値を取得

def ButtonClick():
    #テキストが入力欄に入力された文字列を取得
    b=editboxl.get()
    #メッセージとして表示する
    tmsg.showinfo("入力されたテキスト",b)

「editbox1」をbに代入し、チェックを押した際に別ウィンドウで表示する。

いおjキャプチャ.PNG

ヒット&ブローの値判定

Lesson5のプログラムと合成する。

履歴の表示

<最終的な完成形>

# coding:utf-8
import random
import tkinter as tk
import tkinter.messagebox as tmsg

#ボタンがクリックされたときの処理
def ButtonClick():
    #テキストが入力欄に入力された文字列を取得
    b=editbox1.get()

    #Lesson 5-4のプログラム
    #4桁の数字かどうかを判定する
    isok=False
    if len(b) !=4:
        tmsg.showerror("エラー","4桁の数字を入力してください")
    else:
        kazuok=True
        for i in range(4):
            if (b[i]<"0")or(b[i]>"9"):
                tmsg.showerror("エラー","数字ではありません")
                kazuok=False
                break
        if kazuok:
            isok=True

    if isok:
        #4桁の数字であったとき
        #ヒットを判定
        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:
            tmsg.showinfo("当たり","おめでとうございます。当たりです")
            #終了
            root.destroy()
        else:
            #ヒット数とブロー数を表示
            rirekibox.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("数当てゲーム")

履歴表示のテキストボックスを作る

rirekibox=tk.Text(root,font=("Helvetica",14))
rirekibox.place(x=400,y=0,width=200,height=400)

ラベルを作る

labell=tk.Label(root,text="数を入力してね",font=("Helvetica",14))
labell.place(x=20,y=20)

テキストボックスを作る

editbox1=tk.Entry(width=4,font=("Helvetica",28))
editbox1.place(x=120,y=60)

ボタンを作る

button1=tk.Button(root,text="チェック",font=("Helvetica",14),command=ButtonClick)
button1.place(x=220,y=60)

ウィンドウを表示する

root.mainloop()

履歴表示のテキストボックス作成

root.geometry("600x400")

ウィンドウのサイズを変更しテキストボックスを作るスペースを空ける。

rirekibox=tk.Text(root,font=("Helvetica",14))
rirekibox.place(x=400,y=0,width=200,height=400)

一行目でTextメソッドを実行し、フォントサイズを14と定める。
これをplaceメソッドを用いて、(400,0)の位置に幅200,高さ400に設定

履歴を表示

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

テキストボックスに文字を追加するためにinsertメソッドを追加する。
「tk END」とすることで末尾に挿入することができる。
ここではヒットは「H:」,ブローは「B:」と表示するようにしている。

結果

テキストボックスが表示され、打ち込んだ数の履歴とヒット数、ブロー数が残るようになった。
キャプチャ.PNGy.PNG

df.PNG

1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up