TkinterとflaskでToDoリストの作成

はじめに

今回、tkinterでtodoリストを作成して、それをflaskでAPI化してウェブからも操作できるようにしました。

Blockchainサーバをflaskで実装してみたときに自分でもサーバ関係の実装をしてみたいと思い、今回の実装に至りました。

Demo動画作ったのでよければ見てみてください。

左側がTkinterで作ったUiで、右側はHTML, css, JavaScriptで構成しています。

データベース

また、todoリストを管理するためSQLite3でデータベースを作成しました。

tasksという名前でデータベースは事前に作成してあります。

以下コード

class DataBase():
    def insert_database(self, id, task):
        conn = sqlite3.connect('sqlite.db')
        c = conn.cursor()
        sql = "INSERT INTO tasks (id, task) values(?, ?)"
        c.execute(sql, (id, task))
        conn.commit()
        print('saved!!')
        conn.close()
    
    def delete_task(self, id):
        conn = sqlite3.connect('sqlite.db')
        c = conn.cursor()
        sql = f"DELETE FROM tasks WHERE id={id}"
        c.execute(sql)
        conn.commit()
        print('deleted!!')
        conn.close()
        
    def get_task_item(self):
        conn = sqlite3.connect('sqlite.db')
        c = conn.cursor()
        rows = []
        c.execute("SELECT * FROM tasks")
        for row in c:
            rows.append(row)
        conn.close()
        return rows[::-1]
    
    def get_selected_task_item(self, id):
        conn = sqlite3.connect('sqlite.db')
        c = conn.cursor()
        rows = []
        sql = f"SELECT * FROM tasks WHERE id={id}"
        c.execute(sql)
        for row in c:
            rows.append(row)
        conn.close()
        return rows[::-1]
    
    def get_item_id(self):
        conn = sqlite3.connect('sqlite.db')
        c = conn.cursor()
        rows = []
        sql = f"SELECT id FROM tasks"
        c.execute(sql)
        for row in c:
            rows.append(row)
        conn.close()
        return rows[::-1]

またtkinterのコードはこちらです。

5秒に一回データベースからデータを読み出して更新するようなコード構成になっています。

class TodoList(Canvas):
    def __init__(self, master):
        super().__init__(master, bg="white")
        self.item = []
        self.title = Label(self, text="ToDo List", bg="white", font=("DSEG7 Classic", 35, "bold"))
        self.title.grid(row=0, column=0, ipady=20, sticky="news")
        self.update()
        
    def generate_items(self, tasks):
        if len(self.item) != 0:
            for item in self.item:
                item.destroy()
                self.item = []

        for i, task in enumerate(tasks):
            newlined_task = self.adjust_text(task[1])
            self.task = Label(self, text=newlined_task, bg="white", font=("DSEG7 Classic", 22, "bold"), justify=tk.LEFT, anchor=tk.W)
            self.task.grid(row=i+1, column=0, ipadx=5, sticky="news")
            self.item.append(self.task)
            
    def adjust_text(self, text, length=16):
        text = '- ' + text
        text_length = len(text)
        newlined_text = ''
        
        for i in range(int(text_length/length)+1):
            newlined_text += text[i*length:(i+1)*length]
            newlined_text += '\n'
        return newlined_text
    
    def get_todo_items(self):
        url = "http://127.0.0.1:5000/"
        response = requests.get(url)
        json_data = response.json()
        self.generate_items(json_data)            
            
    def update(self):
        self.get_todo_items()
        self.master.after(5000, self.update)

おわりに

Flaskを使ってAPI化することで、tkinterでtodoリストを確認しながらwebサイト側で操作することができるようになりました。復習も兼ねた面白い実装ができたかなと思います。

おすすめの記事