Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
百人一首の練習用ソフトです。
import tkinter as tk
import tkinter.ttk as ttk
import pandas as pd
import random
import sys
from tkinter import messagebox
import datetime
import csv
class App(ttk.Frame):
def __init__(self, app):
super().__init__(app)
self.pack()
self.i = 0 # 間違えた回数のカウント
self.k = 0 # 問題数
# 問題のラベル
self.var = tk.StringVar() # ラベル更新用
self.var.set("")
# ラベルの表示
self.label = tk.Label(textvariable=self.var, font=("", 50, "bold"))
self.label.place(x=50, y=70)
# n問目の表示
self.n = tk.StringVar()
self.n.set("1問目")
self.n_lr = tk.Label(textvariable=self.n, font=("", 20, "bold"))
self.n_lr.place(x=0, y=0)
# 正解のラベル
self.correct = tk.StringVar()
self.correct.set("")
self.co_label = tk.Label(textvariable=self.correct, font=("", 80, "bold"), fg="#FF0000")
self.co_label.place(x=100, y=350)
# 不正解のラベル
self.incorrect = tk.StringVar()
self.incorrect.set("")
self.inc_label = tk.Label(textvariable=self.incorrect, font=("", 80, "bold"), fg="#0000FF")
self.inc_label.place(x=50, y=350)
# 前の問題の答えのラベル
self.num = tk.StringVar()
self.num.set("")
self.num_label = tk.Label(textvariable=self.num, font=("", 15))
self.num_label.place(x=50, y=300)
# 入力ボタン
self.btn = tk.Button(text="入力(Enter)", command=self.decision, width=50)
self.btn.place(x=80, y=250)
# 終了ボタン
self.fin_btn = tk.Button(text="終了", command=self.fin)
self.fin_btn.place(x=450, y=450)
self.box = ttk.Entry(width=50) # 入力ボックス
self.box.place(x=80, y=200)
self.box.bind("<Return>", self.decision)
self.chance = 2 # 答えられる回数
# 上の句、下の句を初期化
self.up = None
self.under = None
# データの読み込み
self.df = pd.read_csv("uta.csv")
self.uta = [(up, under) for up, under in zip(self.df[""], self.df[""])]
# セーブ用データ
self.times = [0] * 100 # 出題問題数
self.miss = [0] * 100 # 間違えた問題
# 問題番号を初期化
self.o = None
# 1問目を表示
self.question()
def fin(self):
"""終了"""
# 本当に終了するか確認
ret = messagebox.askyesno('確認', 'ウィンドウを閉じますか?')
if ret:
# Saveするか確認
save_yn = messagebox.askyesno("Save", "セーブしますか?")
if save_yn:
self.save()
print("セーブします")
# 画面とプログラムの終了
self.quit()
sys.exit()
def save(self):
"""問題数、間違えた回数をcsvファイルに保存"""
# 日付を取得
date = datetime.date.today()
date.isoformat()
# 日付を追加
self.miss.insert(0, date)
self.times.insert(0, date)
# 間違えた回数を保存
with open('miss_save.csv', 'a', newline='') as f:
writer = csv.writer(f) # 行末は改行
writer.writerow(self.miss)
# 問題数を保存
with open("times_save.csv", "a", newline="") as f:
writer = csv.writer(f)
writer.writerow(self.times)
def question(self):
"""問題作成"""
self.k += 1
# 前の問題の答え表示
set_label = str(self.up) + "の答えは" + str(self.under) + "でした。"
# 問題数、(正解数)/(解いた問題数)
num_label = str(self.k) + "問目 " + str(sum(self.times) - sum(self.miss)) + "/" + str(sum(self.times))
self.num.set(set_label)
self.n.set(num_label)
self.i = 0 # 答える回数を初期化
self.o = random.randint(0, 15) # 問題番号生成
self.up, self.under = self.uta[self.o] # 上の句と下の句
self.var.set(self.up) # 問題の上の句のラベルに更新
self.times[self.o] += 1 # 問題数をカウント
def over(self):
"""回数オーバーか判定"""
if self.i == self.chance:
print("回数オーバーです")
self.miss[self.o] += 1
return True
else:
return False
def decision(self, event=0): # eventは使わない
"""正解か不正解か判定"""
ans = self.box.get()
self.box.delete(0, tk.END)
self.i += 1
# 正誤判定
if ans == self.under:
self.incorrect.set("")
self.correct.set("正解!!!")
print("正解")
self.question()
else:
self.correct.set("")
self.incorrect.set("不正解…")
print("不正解")
pass
if self.over(): # 回数オーバーしているか判定
self.question()
if __name__ == "__main__":
app = tk.Tk()
app.geometry("500x500")
app.title("チズチズの百人一首トレーニング")
frame = App(app) # クラス呼び出し
app.mainloop()
import random
from itertools import count
import datetime
import pandas as pd
import csv
def load():
df = pd.read_csv("uta.csv")
uta = [(ue, sita) for ue, sita in zip(df[""], df[""])]
return uta
def save(miss, times):
date = datetime.date.today()
date.isoformat()
miss.insert(0, date)
times.insert(0, date)
with open('miss_save.csv', 'a', newline='') as f:
writer = csv.writer(f) # 行末は改行
writer.writerow(miss)
with open("times_save.csv", "a", newline="") as f:
writer = csv.writer(f)
writer.writerow(times)
print("またね!")
def question(n, uta, miss, times, chance=1):
ut_len = len(uta)
o = random.randint(0, ut_len - 1)
times[o] += 1
ue, sita = uta[o]
print("", n, "問目】上の句は", ue)
for i in range(chance)[::-1]:
ans = input("下の句は? ")
if ans == "end":
save(miss, times)
return "end"
if ans == sita:
print("正解です!\n")
return "正解"
if i > 0:
print("不正解です…\n")
print("", i, "回チャンスを与えます")
print("下の句の一文字目は", sita[0])
print(len(ue), "文字です。")
if i == 0:
"""a = miss[o]
a += 1
miss[o] = a"""
miss[o] += 1
print("不正解です\n")
print(ue, "の正解は", sita, "でした。\n")
return "不正解"
def main():
print("【チズチズの決まり字特訓】\n")
print("【ルール】")
print("上の句(決まり字)を詠むので、下の句の決まり字を答えて下さい。")
print("辞めたかったら「end」って言ってね!\n")
miss = [0] * 100
times = [0] * 100
uta_len = slice(0, 15)
uta = load()[uta_len]
for uta_le in count(1):
if question(uta_le, uta, miss, times) == "end":
return
if __name__ == "__main__":
main()
Id
1
2 ゆめ
3 くもか
4 むへ
5 いつこ
6 たた
7 われ
8 うか はけ
9 うら こひに
10 うき わかみひ
11 つく こひそ
12 しの もの
13 しら
14 もも なほあ
15 もろ はなよ
16 ゆう あし
17 ゆら ゆく
18 いに けふこ
19 いまこ あり
20 いまは ひとつ
21 ちぎりお あはれ
22 ちぎりき
23 ちは から
24 ひさ しつ
25 ひとは はなそ
26 ひとも よをお
27 きみがためお なかく
28 きみがためは わかころもてに
29 きり ころもか
30 はなさ ふり
31 はなの わかみよ
32 はるす ころもほ
33 はるの かひ
34 やえ ひとこそみ
35 やす かた
36 やまが なかれ
37 やまざ ひとめ
38 よのなかは あまの
39 よのなかよ やま
40 よも
41 よを よに
42 かく
43 かさ しろ
44 かぜそ みそ
45 かぜを くた
46 みかき ひる
47 みかの いつみ
48 みせ
49 みち みたれそ
50 みよ ふる
51 たか
52 たき なこ
53 たご ふし
54 たち まつと
55 たま しの
56 たれ まつも
57 こい ひとし
58 こころあ
59 こころに こひし
60 こぬ やく
61 この もみ
62 これ しる
63 おおえ また
64 おおけ わかた
65 おおこ ひとを
66 おく こゑ
67 おぐ いまひとたひのみ
68 おと かけ
69 おも うき
70 わがい よをう
71 わがそ ひとこそし
72 わすら ひとの
73 わすれ けふを
74 わたのはらこ くもゐ
75 わたのはらや ひとには
76 わび みをつくしても
77 ながか みたれて
78 ながら うし
79 なげき いか
80 なげけ かこ
81 なつ くもの
82 なにし ひとにし
83 なにわえ みをつくしてや
84 なにわが あはて
85 あい むか
86 あきか もれ
87 あきの わかころもては
88 あけ なほう
89 あさじ あまり
90 あさぼらけあ よし
91 あさぼらけう あら
92 あし なかな
93 あまつ
94 あまの みか
95 あらざ いまひとたひのあ
96 あらし たつ
97 ありあ あか
98 ありま いて
99 あわじ いく
100 あわれ みの
@Chizuchizu

This comment has been minimized.

Copy link
Owner Author

Chizuchizu commented Dec 18, 2018

詳しいことは https://chizuchizu.com/2018/12/18/pythonと共に百人一首で勝つ!!/
こちらに書いてあります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.