PythonistaでListを作成!タスクを管理できるアプリを作ってみる

Pythonistaでタスクアプリ

今回はPythonistaでListを作成していきます。日々のタスクを管理していくアプリなので実用性があると思います。それではGUI部分の作成とコードの解説をしていきます。

このようなアプリを作っていきます。

Pythonistaとは何?という方はぜひこちらの記事を読んでみてください!

目次

GUIの作成

まずはGUIを作成していきます。

とりあえずこのようにパーツを設置しました。

それぞれのパーツにはNameとActionを設定しているのでまとめておきます。またこれらのパーツで何を実現するのかも明確にしていきます。

NameAction機能
TableViewtblTaskタスク一覧を表示する
TextFieldtxtAdd追加項目を書く
表示ボタンbtnDispbtn_disp押すと一覧を表示
追加ボタンbtnAddbtn_add項目を追加する
削除ボタンbtnDelbtn_del項目を削除する

Nameはその部品をコード側で指定するときに使うものなので分かりやすく、また他のものと識別できる名前をつけましょう。次にActionですが主にボタンだけに設定をしており、ボタンが押された時の処理がActionとなります。コード側でActionに設定した名前を使いメソッド(処理)を書いていきます。

追加ボタンの実装

ここからは追加ボタンの実装に入ります。

軽く説明をしますと、追加ボタンを押してテキストボックスに入れた文字をテーブルビューに表示するといった流れでです。実装自体はそこまで難しくないので安心してください。

こちらがコードになります。

import ui

class task (object):
	def __init__ (self):
		# ロード
		self.v = ui.load_view()
		
		# ボタン初期化
		self.v['btnAdd'].action = self.btn_add
	
	# 追加ボタンの実装	
	def btn_add (self, sender):
		# テーブルとテキストボックスを初期化
		self.tblTask_data = sender.superview['tblTask']
		self.txtAdd_data = sender.superview['txtAdd']
		
		# テーブルに値をセット
		self.tblTask_data.data_source.items.append(self.txtAdd_data.text)

task = task()
task.v.present('sheet')

順番に説明していきます。

def __init__ (self):
		# ロード
		self.v = ui.load_view()
		
		# ボタン初期化
		self.v['btnAdd'].action = self.btn_add

まずこの部分は、「__init__」という名前のメソッドを作ることによりこちらの中の処理が一番最初に実行されます。最初にUIをロードして表示し、ボタンもメソッドが使えるように初期化をしているという感じです。

# 追加ボタンの実装	
	def btn_add (self, sender):
		# テーブルとテキストボックスを初期化
		self.tblTask_data = sender.superview['tblTask']
		self.txtAdd_data = sender.superview['txtAdd']
		
		# テーブルに値をセット
		self.tblTask_data.data_source.items.append(self.txtAdd_data.text)

次は実際に追加ボタンが押された時の処理を書いていきます。ボタンを初期化したようにテーブルとテキストボックスも初期化をして使えるようにしなくてはなりません。

テーブルに値を表示する場合はappendメソッドを使います。appendメソッドの引数には表示したいデータを入れます。テキストボックスのあとに.textをつけないと入力した文字が入らないので気をつけてください。

・classの中に入れるメソッドを使う場合は必ず「self」を要素につけること
・「sender」はボタンなどの要素そのものだと思ってください

データベースに保存する

今のままだと追加しても一旦アプリを落としてしまうとデータが消えてしまいます。それだとまた登録しないといけないのでここで追加したものをデータベースに保存していきます。

import ui
import os
import sqlite3

class task (object):
	def __init__ (self):
		# ロード
		self.v = ui.load_view()
		
		# ボタン初期化
		self.v['btnAdd'].action = self.btn_add
	
	# 追加ボタンの実装	
	def btn_add (self, sender):
		# テーブルとテキストボックスを初期化
		self.tblTask_data = sender.superview['tblTask']
		self.txtAdd_data = sender.superview['txtAdd']
		
		# テーブルに値をセット
		self.tblTask_data.data_source.items.append(self.txtAdd_data.text)
		
		"""DB作成"""
		if os.path.exists('../tools/task.db'):
			dbname = 'task.db'
			conn = sqlite3.connect(dbname)
			# sqliteを操作するカーソルオブジェクトを作成
			cur = conn.cursor()

			print('DB存在しています!!')
		else:
			dbname = 'task.db'
			conn = sqlite3.connect(dbname)
			# sqliteを操作するカーソルオブジェクトを作成
			cur = conn.cursor()

			# taskテーブルを作成
			print('DBありません!!')
			cur.execute("CREATE TABLE task(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)")
		
		"""データ保存"""
		dbname = 'task.db'
		conn = sqlite3.connect(dbname)
		cur = conn.cursor()
		
		cur.execute("INSERT INTO task(name) values('" + self.txtAdd_data.text + "')")
		
		conn.commit() 

task = task()
task.v.present('sheet')

では追加されたコードを解説していきます。

import os
import sqlite3

「import os」はファイルのパスを取得するためにインポートしなくてはなりません。のちに、データベースファイルがあるかどうかのチェック処理を入れるのでそれに活用します。
「import sqlite3」はデータベースを使うためにインポートしなくてはなりません。Pythonistaには標準でSQLite3が使えます。データベースを使う場合にはインポートを忘れないようにしてください。

   """DB作成"""
		if os.path.exists('../tools/task.db'):
			dbname = 'task.db'
			conn = sqlite3.connect(dbname)
			# sqliteを操作するカーソルオブジェクトを作成
			cur = conn.cursor()

			print('DB存在しています!!')

まずはifの条件の部分ですがここでは指定したパスにファイルが存在しているかのチェックをしています。このコードで言うと、toolsというフォルダの中にtask.dbというファイルが存在するのかをチェックしています。つまり、初回だけtask.dbは存在しないのでfalseになり、2回目以降はtrueになるはずです。

ではtrueになった場合の解説をしますとdbファイルを参照しにいって、操作ができるようにしています。そのあと一応コンソールに’DB存在しています‘のメッセージを出します。ここは書いても書かなくてもどちらでも大丈夫です。

    else:
			dbname = 'task.db'
			conn = sqlite3.connect(dbname)
			# sqliteを操作するカーソルオブジェクトを作成
			cur = conn.cursor()

			# taskテーブルを作成
			print('DBありません!!')
			cur.execute("CREATE TABLE task(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)")

elseではデータベースを作成する処理を書きます。最後の行にあるCREATE文ではidとnameというカラムを作成しています。idはユニークとなり連番で振られていきます。主に使うのはnameでタスク名を格納します。

    """データ保存"""
		dbname = 'task.db'
		conn = sqlite3.connect(dbname)
		cur = conn.cursor()
		
		cur.execute("INSERT INTO task(name) values('" + self.txtAdd_data.text + "')")
		
		conn.commit() 

ここではテキストボックスの値をデータベースに追加する処理を書いています。このINSERT文ではtaskテーブルのname列にテキストボックスの値を追加するということをしています。その後にコミットをしてデータの追加を確定します。INSERT文を実行しただけではデータは追加されません。コミットを忘れないように注意してください。

表示ボタンの実装

次はデータベースに保存したデータを表示ボタンで表示できるようにします。実装の難易度的には追加よりも簡単なので安心してください。

import ui
import os
import sqlite3

class task (object):
	def __init__ (self):
		# ロード
		self.v = ui.load_view()
		
		# ボタン初期化
		self.v['btnAdd'].action = self.btn_add
		self.v['btnDisp'].action = self.btn_disp
	
“””省略”””
		
		# 表示ボタンの実装
	def btn_disp (self, sender):
		dbname = 'task.db'
		conn = sqlite3.connect(dbname)
		cur = conn.cursor()
		
		self.tblTask_data = sender.superview['tblTask']
				
		cur.execute("SELECT * FROM task")
		print(cur.fetchall())
		for row in cur.execute("SELECT name FROM task"):
			datarow = str(row[0])
			self.tblTask_data.data_source.items.append(datarow)
		
		#コネクションを閉じる
		cur.close()
		conn.close()

“””省略”””

以下のように表示ボタンのactionを使えるように初期化しておきます。ここは追加ボタンと同じなので大丈夫かと思います。

		self.v['btnDisp'].action = self.btn_disp
		cur.execute("SELECT * FROM task")
		print(cur.fetchall())
		for row in cur.execute("SELECT name FROM task"):
			datarow = str(row[0])
			self.tblTask_data.data_source.items.append(datarow)

ここの部分ではデータベースから値を取得してきます。「cur.execute(“SELECT * FROM task”)」ではtaskテーブルを全て取得してくるというSQLになります。その後、for文でデータ分ループして一つづ値を取ってきてテーブルに追加をしています。

削除ボタンの実装

それでは最後の削除ボタンの実装に移っていきます。テーブルビューにはもともと横にスワイプするとその行のデータを削除することができますが、今回はデータベースの値も消したいのでボタンでの実装としました。フォーカスのある行に対して削除ボタンを押下するとその行が消えるといった仕様にします。

import ui
import os
import sqlite3

class task (object):
	def __init__ (self):
		# ロード
		self.v = ui.load_view()
		
		# ボタン初期化
		self.v['btnAdd'].action = self.btn_add
		self.v['btnDisp'].action = self.btn_disp
		self.v['btnDel'].action = self.btn_del
	

“””省略”””
		
	# 削除機能実装
	def btn_del (self, sender):
		"""データ保存"""
		dbname = 'task.db'
		conn = sqlite3.connect(dbname)
		cur = conn.cursor()
		
		self.tblTask_data = sender.superview['tblTask']

    # 選択行を取得
		self.sel = self.tblTask_data.data_source.selected_row
		
		cur.execute("DELETE FROM task WHERE name = '" + str(self.tblTask_data.data_source.items[self.sel]) + "'")
		
		# テーブルの行を削除
		del self.tblTask_data.data_source.items[self.sel]
		
		conn.commit()
		
		#コネクションを閉じる
		cur.close()
		conn.close()

“””省略”””

削除ボタンもまずは初期から始まります。何度も説明をしているのでここでは割愛します。

    # 選択行を取得
		self.sel = self.tblTask_data.data_source.selected_row
		
		cur.execute("DELETE FROM task WHERE name = '" + str(self.tblTask_data.data_source.items[self.sel]) + "'")
		
		# テーブルの行を削除
		del self.tblTask_data.data_source.items[self.sel]

		conn.commit()

ここではまず選択行を取得しておいてその行に対してDELETE文を実行します。DELETE文により選択行のタスク名は削除されます。その後にテーブルビューのデータを削除します。DELETE文実行前にテーブルビューの行を削除してしまうとずれて別のタスク名でDELETE文が実行されてしまうので注意してください。

		#コネクションを閉じる
		cur.close()
		conn.close()

最後に必ずコネクションを閉じることを忘れないでください。データベースをオープンしたら必ずクローズすると覚えておくだけで大丈夫です。

まとめ

本記事で解説したこと

・テーブルビューにデータを追加、表示、削除
・データベースを活用してデータを保存
・classを使ったコーディング

以上でタスク管理アプリは完成です。これはほんの簡易的なアプリでしかないので、まだまだ機能もつけられると思いますし、制御もしなくてはなりません。

もしよろしければご自身でここからオリジナルのタスク管理アプリにカスタマイズしてみるのもいいかもしれません。

また別の機会で新たなアプリの作成手順の解説もしていきますのでよろしくお願いします。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる