打撃成績計算機

# はじめに

はじめまして。初投稿になります。
文章、成果物ともに稚拙なものとなりますが、温かい目で見ていただけるとうれしいです。

---
# 動機

現代の野球において、指標というものは一般化しつつあります。
このような計算機を作ったのは、指標を自分で算出できるようになれば、趣味である野球観戦をもっと楽しめると考えたからです。

---

# 制作手順

まず、ウィンドウを作ります。

```Python:window
# coding-utf:8
import tkinter as tk

# ウィンドウを作る
root = tk.Tk()
root.geometry("400x300")
root.title("打撃成績計算機")

# 実行
root.mainloop()
```
---

次にラベルを作ります。

```Python:label
# ラベル
labell = tk.Label(root, text="打席数",font=("Helvetica", 12))
labell.place(x = 20, y = 20)
label2 = tk.Label(root, text="単打",font=("Helvetica", 12))
label2.place(x = 20, y = 70)
label3 = tk.Label(root, text="二塁打",font=("Helvetica", 12))
label3.place(x = 20, y = 120)
label4 = tk.Label(root, text="三塁打",font=("Helvetica", 12))
label4.place(x = 20, y = 170)
label5 = tk.Label(root, text="本塁打",font=("Helvetica", 12))
label5.place(x = 220, y = 20)
label6 = tk.Label(root, text="四死球",font=("Helvetica", 12))
label6.place(x = 220, y = 70)
label7 = tk.Label(root, text="犠打犠飛",font=("Helvetica", 12))
label7.place(x = 220, y = 120)
```
---

テキストボックスを作ります。

```Python:editbox
# テキストボックス
editbox1 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox1.place(x = 90, y = 20)
editbox2 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox2.place(x = 90, y = 70)
editbox3 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox3.place(x = 90, y = 120)
editbox4 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox4.place(x = 90, y = 170)
editbox5 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox5.place(x = 310, y = 20)
editbox6 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox6.place(x = 310, y = 70)
editbox7 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox7.place(x = 310, y = 120)
```
---

ボタンを作り、メッセージが表示されるように処理を設定します。

```Python:button
import tkinter.messagebox as tsmg

# ボタンがクリックされたときの処理
def ButtonClick():
    a = editbox1.get()
    b = editbox2.get()
    c = editbox3.get()
    d = editbox4.get()
    e = editbox5.get()
    f = editbox6.get()
    g = editbox7.get()
    tsmg.showinfo("打率",(int(b) + int(c) + int(d) + int(e))/(int(a) - int(f) - int(g)))
    tsmg.showinfo("出塁率",(int(b) + int(c) + int(d) + int(e) + int(f))/int(a))
    tsmg.showinfo("長打率",((int(b) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g))))
    tsmg.showinfo("ops",((int(b) + int(c) + int(d) + int(e) + int(f))/int(a))+(((int(b) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g)))))

# ボタン
buttan1 = tk.Button(root, text = "計算", font=("Helvetica", 26), command=ButtonClick)
buttan1.place(x = 80, y = 220)
```
---

合体して完成。

# コード

```Python
# coding-utf:8
import tkinter as tk
import tkinter.messagebox as tsmg

# ボタンがクリックされたときの処理
def ButtonClick():
    a = editbox1.get()
    b = editbox2.get()
    c = editbox3.get()
    d = editbox4.get()
    e = editbox5.get()
    f = editbox6.get()
    g = editbox7.get()
    tsmg.showinfo("打率",(int(b) + int(c) + int(d) + int(e))/(int(a) - int(f) - int(g)))
    tsmg.showinfo("出塁率",(int(b) + int(c) + int(d) + int(e) + int(f))/int(a))
    tsmg.showinfo("長打率",((int(b) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g))))
    tsmg.showinfo("ops",((int(b) + int(c) + int(d) + int(e) + int(f))/int(a))+(((int(b) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g)))))

# ウィンドウを作る
root = tk.Tk()
root.geometry("400x300")
root.title("打撃成績計算機")

# ラベル
labell = tk.Label(root, text="打席数",font=("Helvetica", 12))
labell.place(x = 20, y = 20)
label2 = tk.Label(root, text="単打",font=("Helvetica", 12))
label2.place(x = 20, y = 70)
label3 = tk.Label(root, text="二塁打",font=("Helvetica", 12))
label3.place(x = 20, y = 120)
label4 = tk.Label(root, text="三塁打",font=("Helvetica", 12))
label4.place(x = 20, y = 170)
label5 = tk.Label(root, text="本塁打",font=("Helvetica", 12))
label5.place(x = 220, y = 20)
label6 = tk.Label(root, text="四死球",font=("Helvetica", 12))
label6.place(x = 220, y = 70)
label7 = tk.Label(root, text="犠打犠飛",font=("Helvetica", 12))
label7.place(x = 220, y = 120)



# テキストボックス
editbox1 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox1.place(x = 90, y = 20)
editbox2 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox2.place(x = 90, y = 70)
editbox3 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox3.place(x = 90, y = 120)
editbox4 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox4.place(x = 90, y = 170)
editbox5 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox5.place(x = 310, y = 20)
editbox6 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox6.place(x = 310, y = 70)
editbox7 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox7.place(x = 310, y = 120)


# ボタン
buttan1 = tk.Button(root, text = "計算", font=("Helvetica", 26), command=ButtonClick)
buttan1.place(x = 80, y = 220)

# 実行
root.mainloop()
```

---

# 実行した様子
<img width="321" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638199/5da21eb6-a21c-f28f-d0b7-851af6b4d103.png">
<img width="329" alt="b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638199/a1bd1803-ca14-39db-3afb-cdcae7b53892.png">
<img width="323" alt="c.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638199/8cd78c84-65d1-6894-456b-5fba92954f75.png">
<img width="322" alt="d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638199/53878ce1-f99d-6584-1754-172f396a25df.png">

これは2010年のマット・マートン選手の成績です。
[NPBの公式サイト](https://npb.jp/bis/players/53155131.html)を確認すると、計算が正しいことが分かります。

---

# 反省

・算出した成績をまとめて表示できない
OKを何回も押さなくてはならず、面倒です。

---

# 感想
初めて１からプログラミングして、あらためてその大変さが身に染みてわかりました。
今回作ったものは、特に新しくもなく便利でもないです。ここをスタートラインにして、これからもっと良いものを作れるように努力していきたいと思います。

---

# 補足

### 指標
今回算出したものは打率、出塁率、長打率、opsの４種類。
打率：ヒットを打った割合を示す指標
出塁率：出塁した割合を示す指標
長打率：どれだけ塁打を得たかを示す指標
ops:総合的な打撃能力を示す指標
詳しくは[こちら](https://1point02.jp/op/gnav/glossary/gls_index.aspx)を見てください。
ほんとはもっといろいろ計算したかったけど、メッセージ表示が多すぎると鬱陶しくなるので断念しました。

### 個人的な反省

**・余裕をもって、できる範囲で取り組む**
大事です、これ。とても大事。今回も最初はPyxelというのを使ってゲームを作ろうと考えていたのですが、完成の目途が立たず断念。結局、この作品にかける時間も足りず簡素なものとなってしまいました。計画を立てることの大切さを痛感しました。

・句読点
、。と,.
どちらを使えばよいのか・・・。

---

# 追記

- 入力する数値を単打から安打にしました。
- 結果がテキストボックスに表示されるようにしました。
- IsoD、IsoPを算出できるようにしました。

<img width="299" alt="333.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638199/25632895-546f-6831-177f-df1a3a9d25eb.png">

```Python:改良
# coding-utf:8
import tkinter as tk

# ボタンがクリックされたときの処理
def ButtonClick():
    a = editbox1.get()
    b = editbox2.get()
    c = editbox3.get()
    d = editbox4.get()
    e = editbox5.get()
    f = editbox6.get()
    g = editbox7.get()
    h = int(b) - int(c) - int(d) - int(e)

    # 打率
    drt = (int(h) + int(c) + int(d) + int(e))/(int(a) - int(f) - int(g))
    editbox8.delete(0,tk.END)
    editbox8.insert(0,drt)
    # 出塁率
    deru = (int(h) + int(c) + int(d) + int(e) + int(f))/int(a)
    editbox9.delete(0,tk.END)
    editbox9.insert(0,deru)
    # 長打率
    gori = ((int(h) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g)))
    editbox10.delete(0,tk.END)
    editbox10.insert(0,gori)
    # ops
    ops = ((int(h) + int(c) + int(d) + int(e) + int(f))/int(a))+(((int(h) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g))))
    editbox11.delete(0,tk.END)
    editbox11.insert(0,ops)
    # IsoD
    IsoD = (int(h) + int(c) + int(d) + int(e) + int(f))/int(a) - (int(h) + int(c) + int(d) + int(e))/(int(a) - int(f) - int(g))
    editbox12.delete(0,tk.END)
    editbox12.insert(0,IsoD)
    # IsoP
    IsoP = ((int(h) + int(c)*2 + int(d)*3 + int(e)*4 )/ (int(a) - int(f) - int(g))) - (int(h) + int(c) + int(d) + int(e))/(int(a) - int(f) - int(g))
    editbox13.delete(0,tk.END)
    editbox13.insert(0,IsoP)


# ウィンドウを作る
root = tk.Tk()
root.geometry("400x470")
root.title("打撃成績計算機")

# ラベル
labell = tk.Label(root, text="打席数",font=("Helvetica", 12))
labell.place(x = 20, y = 20)
label2 = tk.Label(root, text="安打",font=("Helvetica", 12))
label2.place(x = 20, y = 80)
label3 = tk.Label(root, text="二塁打",font=("Helvetica", 12))
label3.place(x = 20, y = 140)
label4 = tk.Label(root, text="三塁打",font=("Helvetica", 12))
label4.place(x = 20, y = 200)
label5 = tk.Label(root, text="本塁打",font=("Helvetica", 12))
label5.place(x = 20, y = 260)
label6 = tk.Label(root, text="四死球",font=("Helvetica", 12))
label6.place(x = 20, y = 320)
label7 = tk.Label(root, text="犠打犠飛",font=("Helvetica", 12))
label7.place(x = 20, y = 380)

label8 = tk.Label(root, text="打率",font=("Helvetica", 12))
label8.place(x = 220, y = 20)
label9 = tk.Label(root, text="出塁率",font=("Helvetica", 12))
label9.place(x = 220, y = 80)
label10 = tk.Label(root, text="長打率",font=("Helvetica", 12))
label10.place(x = 220, y = 140)
label11 = tk.Label(root, text="ops",font=("Helvetica", 12))
label11.place(x = 220, y = 200)
label12 = tk.Label(root, text="IsoD",font=("Helvetica", 12))
label12.place(x = 220, y = 260)
label13 = tk.Label(root, text="IsoP",font=("Helvetica", 12))
label13.place(x = 220, y = 320)

# テキストボックス
editbox1 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox1.place(x = 100, y = 20)
editbox2 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox2.place(x = 100, y = 80)
editbox3 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox3.place(x = 100, y = 140)
editbox4 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox4.place(x = 100, y = 200)
editbox5 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox5.place(x = 100, y = 260)
editbox6 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox6.place(x = 100, y = 320)
editbox7 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox7.place(x = 100, y = 380)

editbox8 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox8.place(x = 310, y = 20)
editbox9 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox9.place(x = 310, y = 80)
editbox10 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox10.place(x = 310, y = 140)
editbox11 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox11.place(x = 310, y = 200)
editbox12 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox12.place(x = 310, y = 260)
editbox13 = tk.Entry(width = 6,font=("Helvetica", 12))
editbox13.place(x = 310, y = 320)

# ボタン
buttan1 = tk.Button(root, text = "計算", font=("Helvetica", 26), command=ButtonClick)
buttan1.place(x = 240, y = 370)

# 実行
root.mainloop()
```

画像は2014年のマートン選手の成績です。

---

# 参考にした文献、サイト
大澤文孝著　いちばんやさしいPython入門教室　ソーテック社出版
https://npb.jp/bis/players/53155131.html
https://1point02.jp/op/gnav/glossary/gls_index.aspx