デザイン演習 第6回

メモ



課題

班で出た案:ゲーム、スケジュール帳→杉野:ToDoリスト作成を選択

完成品(画像)


ネットで探したソースコードは:Qiita 簡単で早い!Python3のTkinterを使って作るTODOアプリ(外部サイト)より

元のコード

  1. # -*- coding: utf-8 -*-
  2. import tkinter as tk
  3. class App:
  4.     def __init__(self):
  5.         # ウィンドウを初期化
  6.         self.master = tk.Tk()
  7.         self.master.title('TODOアプリ')
  8.         self.master.geometry('400x300')
  9.         self.master.configure(padx=16, pady=16)
  10.         # TODO入力エリアを作成
  11.         self.input_area = InputArea(self.master)
  12.         self.input_area.pack(side='top', fill='x')
  13.         self.input_area.click_add_btn = self.click_add_btn
  14.         # TODOリストの表示エリアを作成
  15.         self.list_area = ListArea(self.master)
  16.         self.list_area.pack(side='bottom', expand=True, fill='both')
  17.     def mainloop(self):
  18.         # masterに処理を委譲
  19.         self.master.mainloop()
  20.     def click_add_btn(self):
  21.         """
  22.         入力エリアの追加ボタンが押されたら呼ばれる
  23.         入力エリアの入力値をリストエリアに追加する
  24.         """
  25.         todo = self.input_area.entry.get() # 入力値を取得
  26.         self.input_area.entry.delete(0, 'end') # 入力行に残ったテキストを削除
  27.         self.list_area.listbox.insert('end', todo) # リストにTODOを追加
  28. class InputArea(tk.Frame):
  29.     """
  30.     TODOの入力エリア
  31.     ユーザーの入力を処理する
  32.     ユーザーが入力したTODOテキストを追加ボタンでリストに追加するのが役割
  33.     """
  34.     def __init__(self, master):
  35.         super(InputArea, self).__init__(master)
  36.         # ハンドル
  37.         self.click_add_btn = None
  38.         # ラベルの作成
  39.         self.label = tk.Label(self, text='TODO')
  40.         self.label.pack(side='left')
  41.         # 入力行の作成
  42.         self.entry = tk.Entry(self)
  43.         self.entry.pack(side='left', expand=True, fill='x')
  44.         # 追加ボタンの作成
  45.         self.add_btn = tk.Button(self, text='追加', command=self._click_add_btn)
  46.         self.add_btn.pack(side='left')
  47.     def _click_add_btn(self):
  48.         if self.click_add_btn:
  49.             self.click_add_btn()
  50. class ListArea(tk.Frame):
  51.     """
  52.     TODOリストの表示エリア
  53.     ユーザーが入力したTODOが表示される
  54.     """
  55.     def __init__(self, master):
  56.         super(ListArea, self).__init__(master)
  57.         # リストの作成
  58.         self.listbox = tk.Listbox(self, height=5)
  59.         self.listbox.pack(side='top', expand=True, fill='both')
  60.         # 削除ボタンの作成
  61.         self.del_btn = tk.Button(self, text='削除', command=self._click_del_btn)
  62.         self.del_btn.pack(side='bottom', fill='x')
  63.     def _click_del_btn(self):
  64.         """
  65.         選択中のTODOを削除する
  66.         """
  67.         sel = self.listbox.curselection()
  68.         for i in sel[::-1]:
  69.             self.listbox.delete(i)
  70. def main():
  71.     app = App()
  72.     app.mainloop()
  73. if __name__ == '__main__':
  74.     main()
イメージ

上記ソースコードをコピペし、ここから自分用に一部変更した。

変更後

  1. # -*- coding: utf-8 -*-
  2. import tkinter as tk
  3. #ウインドウを作る。関数をラップしていく。(クッションのように関数の中に関数を隠すことを、関数をラップ(Wrap)すると言う。関数の外側にクッションを1つ作り、設計をしやすくする)
  4. class App:
  5.     def __init__(self):#defに続いて関数を宣言、()に引数(関数に処理してもらう値)を入れられる。__init__はある型から個別の実体を作成する感じ。
  6.         # ウィンドウを初期化
  7.         self.master = tk.Tk()
  8.         self.master.title('TODOリスト')
  9.         self.master.geometry('1000x1000')
  10.         self.master.configure(padx=16, pady=16)
  11.         # TODO入力エリアを作成・4種類に入力を分ける
  12.         self.input_area = InputArea(self.master)
  13.         self.input_area.pack(side='top', fill='x')
  14.         self.input_area._click_add_btn_a = self.click_add_btn_a
  15.         self.input_area._click_add_btn_b = self.click_add_btn_b
  16.         self.input_area._click_add_btn_c = self.click_add_btn_c
  17.         self.input_area._click_add_btn_d = self.click_add_btn_d
  18.         # TODOリストの表示エリアを作成・4種類に表示エリアを分ける
  19.         self.list_area_a = ListArea_a(self.master)
  20.         self.list_area_a.pack(side='left', expand=True, fill='both')
  21.         self.list_area_b = ListArea_b(self.master)
  22.         self.list_area_b.pack(side='left', expand=True, fill='both')
  23.         self.list_area_c = ListArea_c(self.master)
  24.         self.list_area_c.pack(side='left', expand=True, fill='both')
  25.         self.list_area_d = ListArea_d(self.master)
  26.         self.list_area_d.pack(side='left', expand=True, fill='both')
  27.     def mainloop(self):#ループ処理
  28.         # masterに処理を委譲
  29.         self.master.mainloop()
  30.     def click_add_btn_a(self): # 追加ボタン(重要・緊急)
  31.         """
  32.         入力エリアの追加ボタンが押されたら呼ばれる
  33.         入力エリアの入力値をリストエリアに追加する
  34.         """
  35.         todo = self.input_area.entry.get() # 入力値を取得
  36.         self.input_area.entry.delete(0, 'end') # 入力行に残ったテキストを削除
  37.         self.list_area_a.listbox_a.insert('end', todo) # リストにTODOを追加
  38.     def click_add_btn_b(self): # 追加ボタン(緊急)
  39.         """
  40.         入力エリアの追加ボタンが押されたら呼ばれる
  41.         入力エリアの入力値をリストエリアに追加する
  42.         """
  43.         todo = self.input_area.entry.get() # 入力値を取得
  44.         self.input_area.entry.delete(0, 'end') # 入力行に残ったテキストを削除
  45.         self.list_area_b.listbox_b.insert('end', todo) # リストにTODOを追加
  46.     def click_add_btn_c(self): # 追加ボタン(緊急)
  47.         """
  48.         入力エリアの追加ボタンが押されたら呼ばれる
  49.         入力エリアの入力値をリストエリアに追加する
  50.         """
  51.         todo = self.input_area.entry.get() # 入力値を取得
  52.         self.input_area.entry.delete(0, 'end') # 入力行に残ったテキストを削除
  53.         self.list_area_c.listbox_c.insert('end', todo) # リストにTODOを追加
  54.     def click_add_btn_d(self): # 追加ボタン(その他)
  55.         """
  56.     入力エリアの追加ボタンが押されたら呼ばれる
  57.     入力エリアの入力値をリストエリアに追加する
  58.     """
  59.         todo = self.input_area.entry.get() # 入力値を取得
  60.         self.input_area.entry.delete(0, 'end') # 入力行に残ったテキストを削除
  61.         self.list_area_d.listbox_d.insert('end', todo) # リストにTODOを追加
  62. class InputArea(tk.Frame):
  63.     """
  64.     TODOの入力エリア
  65.     ユーザーの入力を処理する
  66.     ユーザーが入力したTODOテキストを追加ボタンでリストに追加するのが役割
  67.     """
  68.     def __init__(self, master):
  69.         super(InputArea, self).__init__(master)
  70.         # ハンドル
  71.         self.click_add_btn = None
  72.         # ラベルの作成
  73.         self.label = tk.Label(self, text='TODO')
  74.         self.label.pack(side='top')
  75.         # 入力行の作成
  76.         self.entry = tk.Entry(self)
  77.         self.entry.pack(side='left', expand=True, fill='x')
  78.         # 追加ボタンの作成・4種類に分ける
  79.         self.add_btn_a = tk.Button(self, text='重要・緊急', command=self._click_add_btn_a)
  80.         self.add_btn_a.pack(side='left')
  81.         self.add_btn_b = tk.Button(self, text='重要', command=self._click_add_btn_b)
  82.         self.add_btn_b.pack(side='left')
  83.         self.add_btn_c = tk.Button(self, text='緊急', command=self._click_add_btn_c)
  84.         self.add_btn_c.pack(side='left')
  85.         self.add_btn_d = tk.Button(self, text='その他', command=self._click_add_btn_d)
  86.         self.add_btn_d.pack(side='left')
  87.     def _click_add_btn_a(self):
  88.         if self._click_add_btn_a:
  89.             self._click_add_btn_a()
  90.     def _click_add_btn_b(self):
  91.         if self._click_add_btn_b:
  92.             self._click_add_btn_b()
  93.     def _click_add_btn_c(self):
  94.         if self._click_add_btn_c:
  95.             self._click_add_btn_c()
  96.     def _click_add_btn_d(self):
  97.         if self._click_add_btn_d:
  98.             self._click_add_btn_d()
  99. class ListArea_a(tk.Frame):#(重要・緊急)
  100.     """
  101.     TODOリストの表示エリア
  102.     ユーザーが入力したTODOが表示される
  103.     """
  104.     def __init__(self, master):
  105.         super(ListArea_a, self).__init__(master)
  106.         self.label = tk.Label(self, text='重要・緊急')#リストのラベル
  107.         self.label.pack(side='top')
  108.         # リストの作成
  109.         self.listbox_a = tk.Listbox(self, height=5)
  110.         self.listbox_a.pack(side='top', expand=True, fill='both')
  111.         # 削除ボタンの作成
  112.         self.del_btn = tk.Button(self, text='削除', command=self._click_del_btn_ad)
  113.         self.del_btn.pack(side='bottom', fill='x')
  114.     def _click_del_btn_ad(self):
  115.         """
  116.         選択中のTODOを削除する
  117.         """
  118.         sel = self.listbox_a.curselection()
  119.         for i in sel[::-1]:
  120.             self.listbox_a.delete(i)
  121. class ListArea_b(tk.Frame):#(重要)
  122.     """
  123.     TODOリストの表示エリア
  124.     ユーザーが入力したTODOが表示される
  125.     """
  126.     def __init__(self, master):
  127.         super(ListArea_b, self).__init__(master)
  128.         self.label = tk.Label(self, text='重要') # リストのラベル
  129.         self.label.pack(side='top')
  130.         # リストの作成
  131.         self.listbox_b = tk.Listbox(self, height=5)
  132.         self.listbox_b.pack(side='top', expand=True, fill='both')
  133.         # 削除ボタンの作成
  134.         self.del_btn = tk.Button(self, text='削除', command=self._click_del_btn_bd)
  135.         self.del_btn.pack(side='bottom', fill='x')
  136.     def _click_del_btn_bd(self):
  137.         """
  138.         選択中のTODOを削除する
  139.         """
  140.         sel = self.listbox_b.curselection()
  141.         for i in sel[::-1]:
  142.             self.listbox_b.delete(i)
  143. class ListArea_c(tk.Frame):#(緊急)
  144.     """
  145.     TODOリストの表示エリア
  146.     ユーザーが入力したTODOが表示される
  147.     """
  148.     def __init__(self, master):
  149.         super(ListArea_c, self).__init__(master)
  150.         self.label = tk.Label(self, text='緊急') # リストのラベル
  151.         self.label.pack(side='top')
  152.         # リストの作成
  153.         self.listbox_c = tk.Listbox(self, height=5)
  154.         self.listbox_c.pack(side='top', expand=True, fill='both')
  155.         # 削除ボタンの作成
  156.         self.del_btn = tk.Button(self, text='削除', command=self._click_del_btn_cd)
  157.         self.del_btn.pack(side='bottom', fill='x')
  158.     def _click_del_btn_cd(self):
  159.         """
  160.         選択中のTODOを削除する
  161.         """
  162.         sel = self.listbox_c.curselection()
  163.         for i in sel[::-1]:
  164.             self.listbox_c.delete(i)
  165. class ListArea_d(tk.Frame):#(その他)
  166.     """
  167.     TODOリストの表示エリア
  168.     ユーザーが入力したTODOが表示される
  169.     """
  170.     def __init__(self, master):
  171.         super(ListArea_d, self).__init__(master)
  172.         self.label = tk.Label(self, text='その他') # リストのラベル
  173.         self.label.pack(side='top')
  174.         # リストの作成
  175.         self.listbox_d = tk.Listbox(self, height=5)
  176.         self.listbox_d.pack(side='top', expand=True, fill='both')
  177.         # 削除ボタンの作成
  178.         self.del_btn = tk.Button(self, text='削除', command=self._click_del_btn_dd)
  179.         self.del_btn.pack(side='bottom', fill='x')
  180.     def _click_del_btn_dd(self):
  181.         """
  182.         選択中のTODOを削除する
  183.         """
  184.         sel = self.listbox_d.curselection()
  185.         for i in sel[::-1]:
  186.             self.listbox_d.delete(i)
  187. def main():
  188.     app = App()
  189.     app.mainloop()
  190. if __name__ == '__main__':
  191.     main()

デスクトップアプリにする方法はこちら
作成したデータのダウンロードはこちら

変更点

課題(解決方法がわからなかった)


参考サイト(外部サイト)



前の画面に戻る