list index out of range が解消できない
タイピングゲームの結果をスコア降順にcsvファイルへと記録したいです。
実行するとエラーが発生しました。
解決方法を教えて下さい。
2つのファイルのソースコードがあります。
エラーが発生しているのは記事152行目です。
エラー内容
<lambda>
Ranki.rl = Ranki.rl.sort(reverse=True, key=lambda x:x[2])
~^^^
IndexError: list index out of range
該当するソースコード
import tkinter as tk
from tkinter import messagebox
import sys
import time
import threading
from his import His
from ranki import Ranki
QUESTION = ["tkinter", "geometry", "widgets", "messagebox", "configure",
"label", "column", "rowspan", "grid", "init"]
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("タイピングゲーム!")
# 問題数インデックス
self.index = 0
# 正解数カウント用
self.correct_cnt = 0
self.create_widgets()
# 経過時間スレッドの開始
t = threading.Thread(target=self.timer)
t.start()
# Tkインスタンスに対してキーイベント処理を実装
self.master.bind("<KeyPress>", self.type_event)
# ウィジェットの生成と配置
def create_widgets(self):
self.q_label = tk.Label(self, text="お題:", font=("",20))
self.q_label.grid(row=0, column=0)
self.q_label2 = tk.Label(self, text=QUESTION[self.index], width=10, anchor="w", font=("",20))
self.q_label2.grid(row=0, column=1)
self.ans_label = tk.Label(self, text="解答:", font=("",20))
self.ans_label.grid(row=1, column=0)
self.ans_label2 = tk.Label(self, text="", width=10, anchor="w", font=("",20))
self.ans_label2.grid(row=1, column=1)
self.result_label = tk.Label(self, text="", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
# # 時間計測用のラベル
self.time_label = tk.Label(self, text="", font=("",20))
self.time_label.grid(row=3, column=0, columnspan=2)
self.flg2 = True
# キー入力時のイベント処理
def type_event(self, event):
# 入力値がEnterの場合は答え合わせ
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="正解!", fg="red")
self.correct_cnt += 1
else:
self.result_label.configure(text="残念!", fg="blue")
# 解答欄をクリア
self.ans_label2.configure(text="")
# 次の問題を出題
self.index += 1
if self.index == len(QUESTION):
self.flg = False
self.q_label2.configure(text="終了!")
messagebox.showinfo("リザルト", f"あなたのスコアは{self.correct_cnt}/{self.index}問正解です。\nクリアタイムは{self.second}秒です。")
score_his = self.correct_cnt
time_his = self.second
# score_rank = self.correct_cnt
# time_rank = self.second
numque = len(QUESTION)
His.set_csv(self,score_his,time_his,numque)
Ranki.ranki_score(self)
sys.exit(0)
self.q_label2.configure(text=QUESTION[self.index])
elif event.keysym == "BackSpace":
text = self.ans_label2["text"]
self.ans_label2["text"] = text[:-1]
else:
# 入力値がEnter以外の場合は文字入力としてラベルに追記する
self.ans_label2["text"] += event.keysym
def timer(self):
self.second = 0
self.flg = True
while self.flg:
self.second += 1
self.time_label.configure(text=f"経過時間:{self.second}秒")
time.sleep(1)
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
と、
from his import His
from file import File
import csv
import os
import datetime
path = os.getcwd()
rankilist = []
class Ranki(His) :
rl = rankilist
def __init__(self,score_rank,time_rank) :
self.score_rank = score_rank
self.time_rank = time_rank
def ranki_score(self) :
# 時間求める
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
nowtime = now.date().strftime('%Y/%m/%d')
# 二重リスト
Ranki.rl.append([f'[{nowtime},{self.numque}問中,{int(self.score_his)},問{self.time_his}秒]'])
print(Ranki.rl)
# 降順に並び替え
Ranki.rl = Ranki.rl.sort(reverse=True, key=lambda x:x[2])
with open(path + '\\rank1.csv','w',encoding='utf-8',newline='') as file:
csv.writer(file).writerows(Ranki.rl)
return True
自分で試したこと
クラスの中のリスト?が悪さをしているのかと思い、位置やら名前やらを変えてみましたが解決されず、困っています。