Tkinterでシュルテ・テーブルをつくる

 今日も見に来てくださってありがとうございます。

 みなさん、シュルテ・テーブルというものをご存知でしょうか。先日読んだ本に、脳のトレーニングとして紹介されていました。少し前にこれをtkinterで作ったので、紹介したいと思います。

できあがりイメージ

 シュルテ・テーブルは、以下のような表です。これで、周辺視野、注意力、セルフコントロール、集中力などが鍛えられるということです。表の中心に視線を固定して、周辺視野だけを使って、1~25を順番に探すだけです。しばらく続けれていれば、12秒~15秒ほどで25まで数えられるようになるそうです。そして、これだけで、観察力が高まるそうですよ。

シュルテ・テーブル

ソースコード

 ソースコードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from tkinter import Tk, Button, Canvas, Frame, Label, messagebox
from random import sample
from time import time
class SchulteTable(Frame):
MARGIN = 10
DISTANCE = 50
WIDTH = 5
HEIGHT = 5
FONT_SIZE = 25
text = list()
def __init__(self, master=None):
if master == None:
master = Tk()
super().__init__(master)
master.title("Schulte Table")
self.master = master
self.pack()
self.create_widgets()
self.bind("<Button-1>", self.redraw_text)
def create_widgets(self):
self.info = Label(self, text="Tap anywhere to start", font=("",14))
self.info.pack(side="top")
self.info.bind("<Button-1>", self.redraw_text)
self.canvas = Canvas(self,width=self.MARGIN*2+self.WIDTH*self.DISTANCE, height=self.MARGIN*2+self.HEIGHT*self.DISTANCE)
for i in range(self.WIDTH+1):
self.line1 = self.canvas.create_line(self.MARGIN+i*self.DISTANCE,self.MARGIN,self.MARGIN+i*self.DISTANCE,self.MARGIN+self.DISTANCE*self.HEIGHT)
for i in range(self.HEIGHT+1):
self.line1 = self.canvas.create_line(self.MARGIN,self.MARGIN+i*self.DISTANCE,self.MARGIN+self.WIDTH*self.DISTANCE,self.MARGIN+i*self.DISTANCE)
self.canvas.pack(side="top")
self.canvas.bind("<Button-1>", self.redraw_text)
self.quit = Button(self, text="QUIT", fg="red",
command=self.master.destroy)
self.quit.pack(side="bottom")
def redraw_text(self, event):
if not len(self.text):
self.info["text"] = "Tap anywhere to STOP"
self.time = time()
self.after(100, self.time_update)
else:
for t in self.text:
self.canvas.delete(t)
self.text = list()
messagebox.showinfo("結果",f"かかった時間は、{self.elapse_time:0.2f}秒です。")
self.info["text"] = "Tap anywhere to start"
return
counter = 0
answer = sample(range(1,self.WIDTH*self.HEIGHT+1),self.WIDTH*self.HEIGHT)
for x in range(self.WIDTH):
for y in range(self.HEIGHT):
self.text.append(self.canvas.create_text(self.MARGIN+x*self.DISTANCE+self.DISTANCE/2,self.MARGIN+y*self.DISTANCE+self.DISTANCE/2,text=str(answer[counter]),font=("",self.FONT_SIZE)))
counter+=1
def time_update(self):
if not len(self.text):
return
self.elapse_time = time() - self.time
self.info["text"] = f"Tap anywhere to STOP:{self.elapse_time:0.2f}"
if len(self.text):
self.after(10, self.time_update)
if __name__ == '__main__':
shulteTable = SchulteTable()
shulteTable.mainloop()
from tkinter import Tk, Button, Canvas, Frame, Label, messagebox from random import sample from time import time class SchulteTable(Frame): MARGIN = 10 DISTANCE = 50 WIDTH = 5 HEIGHT = 5 FONT_SIZE = 25 text = list() def __init__(self, master=None): if master == None: master = Tk() super().__init__(master) master.title("Schulte Table") self.master = master self.pack() self.create_widgets() self.bind("<Button-1>", self.redraw_text) def create_widgets(self): self.info = Label(self, text="Tap anywhere to start", font=("",14)) self.info.pack(side="top") self.info.bind("<Button-1>", self.redraw_text) self.canvas = Canvas(self,width=self.MARGIN*2+self.WIDTH*self.DISTANCE, height=self.MARGIN*2+self.HEIGHT*self.DISTANCE) for i in range(self.WIDTH+1): self.line1 = self.canvas.create_line(self.MARGIN+i*self.DISTANCE,self.MARGIN,self.MARGIN+i*self.DISTANCE,self.MARGIN+self.DISTANCE*self.HEIGHT) for i in range(self.HEIGHT+1): self.line1 = self.canvas.create_line(self.MARGIN,self.MARGIN+i*self.DISTANCE,self.MARGIN+self.WIDTH*self.DISTANCE,self.MARGIN+i*self.DISTANCE) self.canvas.pack(side="top") self.canvas.bind("<Button-1>", self.redraw_text) self.quit = Button(self, text="QUIT", fg="red", command=self.master.destroy) self.quit.pack(side="bottom") def redraw_text(self, event): if not len(self.text): self.info["text"] = "Tap anywhere to STOP" self.time = time() self.after(100, self.time_update) else: for t in self.text: self.canvas.delete(t) self.text = list() messagebox.showinfo("結果",f"かかった時間は、{self.elapse_time:0.2f}秒です。") self.info["text"] = "Tap anywhere to start" return counter = 0 answer = sample(range(1,self.WIDTH*self.HEIGHT+1),self.WIDTH*self.HEIGHT) for x in range(self.WIDTH): for y in range(self.HEIGHT): self.text.append(self.canvas.create_text(self.MARGIN+x*self.DISTANCE+self.DISTANCE/2,self.MARGIN+y*self.DISTANCE+self.DISTANCE/2,text=str(answer[counter]),font=("",self.FONT_SIZE))) counter+=1 def time_update(self): if not len(self.text): return self.elapse_time = time() - self.time self.info["text"] = f"Tap anywhere to STOP:{self.elapse_time:0.2f}" if len(self.text): self.after(10, self.time_update) if __name__ == '__main__': shulteTable = SchulteTable() shulteTable.mainloop()
from tkinter import Tk, Button, Canvas, Frame, Label, messagebox
from random import sample
from time import time

class SchulteTable(Frame):
    MARGIN = 10
    DISTANCE = 50
    WIDTH = 5
    HEIGHT = 5
    FONT_SIZE = 25
    text = list()
    def __init__(self, master=None):
        if master == None:
            master = Tk()
        super().__init__(master)
        master.title("Schulte Table")
        self.master = master
        self.pack()
        self.create_widgets()
        self.bind("<Button-1>", self.redraw_text)

    def create_widgets(self):
        self.info = Label(self, text="Tap anywhere to start", font=("",14))
        self.info.pack(side="top")
        self.info.bind("<Button-1>", self.redraw_text)
        self.canvas = Canvas(self,width=self.MARGIN*2+self.WIDTH*self.DISTANCE, height=self.MARGIN*2+self.HEIGHT*self.DISTANCE)
        for i in range(self.WIDTH+1):
            self.line1 = self.canvas.create_line(self.MARGIN+i*self.DISTANCE,self.MARGIN,self.MARGIN+i*self.DISTANCE,self.MARGIN+self.DISTANCE*self.HEIGHT)
        for i in range(self.HEIGHT+1):
            self.line1 = self.canvas.create_line(self.MARGIN,self.MARGIN+i*self.DISTANCE,self.MARGIN+self.WIDTH*self.DISTANCE,self.MARGIN+i*self.DISTANCE)
        self.canvas.pack(side="top")
        self.canvas.bind("<Button-1>", self.redraw_text)

        self.quit = Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

    def redraw_text(self, event):
        if not len(self.text):
            self.info["text"] = "Tap anywhere to STOP"
            self.time = time()
            self.after(100, self.time_update)
        else:
            for t in self.text:
                self.canvas.delete(t)
            self.text = list()
            messagebox.showinfo("結果",f"かかった時間は、{self.elapse_time:0.2f}秒です。")
            self.info["text"] = "Tap anywhere to start"
            return
        counter = 0
        answer = sample(range(1,self.WIDTH*self.HEIGHT+1),self.WIDTH*self.HEIGHT)
        for x in range(self.WIDTH):
            for y in range(self.HEIGHT):
                self.text.append(self.canvas.create_text(self.MARGIN+x*self.DISTANCE+self.DISTANCE/2,self.MARGIN+y*self.DISTANCE+self.DISTANCE/2,text=str(answer[counter]),font=("",self.FONT_SIZE)))
                counter+=1

    def time_update(self):
        if not len(self.text):
            return
        self.elapse_time = time() - self.time
        self.info["text"] = f"Tap anywhere to STOP:{self.elapse_time:0.2f}"
        if len(self.text):
            self.after(10, self.time_update)

if __name__ == '__main__':
    shulteTable = SchulteTable()
    shulteTable.mainloop()

 このシュルテ・テーブル、ちょっと昔に作ったのですが、いけてませんね。なぜかFrameを継承しているし、そのせいでmasterをセットしなきゃいけなくなってるし、一行が異様に長いところがあるし、自分で作ったプログラムなのですが、、、ちょっとわかりずらいなぁ。

 とりあえず、動いているので、公開しようと思います。見れば見るほど修正したくなってきましたので、次回、リファクタリングします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。