pythonで生徒を当てるアプリをつくる

#はじめに
私の通っている高校で,数学科の先生がExcelを使って"生徒を当てるヤツ"を作って生徒を当てるといに使っていたので,その改良版をpythonを作って作ってみた.

#Excel版の仕組み
1.生徒をランダムに選択して画面上に表示する
2.もしその生徒が過去にあたっていた場合は名前の隣のセルが赤くなる
3.あたった生徒を記録する(一巡した場合クリア)

(先生に許可は取っていないので詳細は控える)

#改良点
1.生徒は毎回全員の中から選ばれ,一度あたったかどうかを人が判断しなければいけない.
　→一度あたった生徒は一巡するまで表示されないようにする
2.あたった生徒を教師がコピペで手動で記録している.
　→記録を自動化する

#実装する機能
1.名前の表示
2.欠席者を飛ばす
3.リストのリセット
4.リストの表示
5.履歴の表示
6.履歴の消去
7.名簿の更新
8.コンソールのクリア

#プログラム

```python:生徒当てるヤツ.py
import random
import pickle
import os
import sys
import datetime

name = None

if os.name == 'nt':
    os.system('cls')
elif os.name == 'posix':
    os.system('clear')

print("使い方はhelpを参照")

while True:

    a = input('>')

    if a == "help":
        print("Enter----名前の表示\n"
              "pass-----欠席者を飛ばす\n"
              "reset----リストのリセット\n"
              "ls-------リストの表示\n"
              "history--履歴の表示\n"
              "         clearを後ろにつけて履歴消去\n"
              "setup----名簿の更新\n"
              "clear----コンソールのクリア\n"
              "exit-----終了")

    elif a == "ls":

        if name != None and name in list:
            list.remove(name)
            f = open('list.txt', 'wb')
            pickle.dump(list, f)
        if list == []:
            f = open("./list_raw.txt", "rb")
            list_raw = pickle.load(f)

            list = list_raw

            f = open('list.txt', 'wb')
            pickle.dump(list, f)

        f = open("./list.txt", "rb")
        list = pickle.load(f)
        for i in list:
            print(i)

    elif a == "reset":
        f = open("./list_raw.txt", "rb")
        list_raw = pickle.load(f)

        list = list_raw

        f = open('list.txt', 'wb')
        pickle.dump(list, f)
        name = None

    elif a == "clear":
        if os.name == 'nt':
            os.system('cls')
        elif os.name == 'posix':
            os.system('clear')

    elif a == "setup":

        if os.name == 'nt':
            os.system('cls')
        elif os.name == 'posix':
            os.system('clear')

        print("1)任意のファイル名のテキストファイル(*.txt)を作成します.\n"
              "2)その中に\n1.名前\n2.名前\n・\n・\n・\nと入力します.\n"
              "3)setup>の後ろにファイル名を入力します.\n"
              "4)exitと入力して終了します.")

        while True:

            a = input("setup>")

            if a == "exit":
                if os.name == 'nt':
                    os.system('cls')
                elif os.name == 'posix':
                    os.system('clear')
                break

            else:

                if os.path.isfile(a):

                    f = open(a, "r")
                    list = []

                    for x in f:
                        list.append(x.rstrip("\n"))
                    f.close()

                    f = open('list.txt', 'wb')
                    pickle.dump(list, f)

                    f = open('list_raw.txt', 'wb')
                    pickle.dump(list, f)

                    history = []
                    f = open('history.txt', 'wb')
                    pickle.dump(history, f)

                else:
                    print("正確なファイル名を入力してください.")

    elif a == "history":

        f = open("./history.txt", "rb")
        history = pickle.load(f)

        for i in history:
            print(i)

        f = open('history.txt', 'wb')
        pickle.dump(history, f)

    elif "history" in a and "clear" in a:

        f = open("./history.txt", "rb")
        history = pickle.load(f)

        history = []

        f = open('history.txt', 'wb')
        pickle.dump(history, f)

    elif a == "exit":
        sys.exit()

    elif a == "pass":
        pass

    elif a == "":
        if name == None:
            pass

        else:
            if name in list:
                list.remove(name)

            if list != None:
                f = open('list.txt', 'wb')
                pickle.dump(list, f)

            if list == []:
                f = open("./list_raw.txt", "rb")
                list_raw = pickle.load(f)

                list = list_raw
                f = open('list.txt', 'wb')
                pickle.dump(list, f)

    else:
        print(a + ":コマンドが見つかりません")

    if a == "" or a == "pass":

        f = open("./list.txt", "rb")
        list = pickle.load(f)

        # print(list)

        name = random.choice(list)

        print(name)

        f = open("./history.txt", "rb")
        history = pickle.load(f)

        now = datetime.datetime.now()

        history.append(now.strftime('%m月%d日') + ":" + name)

        f = open('history.txt', 'wb')
        pickle.dump(history, f)

```

#使うための準備
1.プログラムと同じディレクトリに以下のファイルを作成
　1.list.txt
　2.list_raw.txt
　3.history.txt
　4.namelist.txt

2.namelist.txt以下のように編集

```txt:namelist.txt
1.山田 太郎
2.山田 花子
```

3.プログラムを実行してsetupを実行

#動作風景

![Screenshot from 2020-02-16 11-07-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/b92cee96-09fe-0497-59e9-f10c08dbf6e5.png)
![Screenshot from 2020-02-16 11-07-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/d7945d28-c2b5-3e1b-02c0-4a5a33cee2e4.png)
![Screenshot from 2020-02-16 11-07-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/186badcd-af0b-dbbe-8d97-75035e053e88.png)
![Screenshot from 2020-02-16 11-07-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/fcad281e-0d0d-bddc-01cc-ee2307607967.png)
![Screenshot from 2020-02-16 11-07-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/ca055b11-67ff-6c97-df8e-97d1f3c190f3.png)
![Screenshot from 2020-02-16 11-08-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/8f536f15-e15d-dc06-6908-bdbdc9f48c5c.png)
![Screenshot from 2020-02-16 11-08-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/9ada7cc2-e188-eef4-9401-5371a8cd7237.png)
![Screenshot from 2020-02-16 11-08-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/0bc03baf-2266-0317-18d0-6cce3ff16976.png)
![Screenshot from 2020-02-16 11-08-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284999/0430db9a-7073-b5ff-702d-23cedded12ab.png)

#まとめ
CUIなので万人が使いやすいとは言えないのが残念なところ.
だからといってGUIにしようとは思わない.
(デザインの能力がないので作りたくても作れない...)

なんだかんだでGUI版作りました
[pythonで生徒を当てるアプリをつくる-GUI版](https://qiita.com/mochihisa/items/9165fc0ffc56508c9be5)