memopy

pythonで作ってみました的なブログ

⑤ FrameとLabelFrameの違い【python tkinter sqlite3で家計簿を作る】

⑤ FrameとLabelFrameの違い【python tkinter sqlite3で家計簿を作る】

今回は、FrameとLabelFrameという機能を掘り下げていきたい。
前回の記事では、Buttonのウィジェットをpackメソッドを用いて、画面上に配置したが、packメソッドでは、思った通りの場所にウィジェットを配置できないことが多い。
そのため、Frameというウィジェットを配置する枠を画面上に配置して、その中にウィジェットを入れると簡単にレイアウトできるようになる。

設計図
f:id:memopy:20170528110228p:plain
前回までに作成したGUI
f:id:memopy:20170527213534p:plain

フレーム Frame

# -*- coding:utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title("家計簿アプリ")
root.geometry("300x300")

# フレームの作成(フレームをrootに配置,フレーム淵を2pt,フレームの形状をridge)
frame = tk.Frame(root,bd=2,relief="ridge")
# フレームを画面に配置し、横方向に余白を拡張する
frame.pack(fill="x")

# 作成したフレームにボタン1を配置
button1 = tk.Button(frame,text="入力")
# ボタンを左から配置する
button1.pack(side="left")

# 作成したフレームにボタン2を配置
button2 = tk.Button(frame,text="表示")
# ボタンを左から配置する
button2.pack(side="left")

# 作成したフレームにボタン3を配置
button3 = tk.Button(frame,text="終了")
# ボタンを右から配置する
button3.pack(side="right")

root.mainloop()

仕切りのあるフレームが作成された
f:id:memopy:20170528111550p:plain

Frameのオプション(抜粋)
オプション名 入力型式 説明
background
bg
背景色
borderwidth
bd
integer フレーム枠の幅
padx integer フレーム内の横の余白
pady integer フレーム内の縦の余白
relief flat(デフォルト),
sunken,raised,groove,ridge
フレームの形状
f:id:memopy:20170611094823p:plain
フレームの形状を有効にするためには、必ずborderwidthの値を1以上に設定しなければならない

ラベル フレーム LabelFrame

フレームにラベルを付けたウィジェットも存在する

# -*- coding:utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title("家計簿アプリ")
root.geometry("300x300")

# ラベルフレームの作成(ラベルフレームのtextをmenuに設定)
frame = tk.LabelFrame(root,bd=2,relief="ridge",text="menu")
frame.pack(fill="x")

button1 = tk.Button(frame,text="入力")
button1.pack(side="left")
button2 = tk.Button(frame,text="表示")
button2.pack(side="left")
button3 = tk.Button(frame,text="終了")
button3.pack(side="right")

root.mainloop()

f:id:memopy:20170528113235p:plain

LabelFrameのオプション(抜粋)※フレームからの差分のみ
オプション名 入力型式 説明
text string ラベルに表示するテキスト
labelanchor n,ne,e,se,s,sw,w,nw(デフォルト) ラベルの配置場所
font font_object 文字のフォント

今回はここまで!
質問や記事の間違いがありましたらコメントお願いします。

前の記事
④ Buttonウィジェットの配置【python tkinter sqlite3で家計簿を作る】
次の記事
⑥ LabelとEntryの配置【python tkinter sqlite3で家計簿を作る】

④ Buttonウィジェットの配置【python tkinter sqlite3で家計簿を作る】

④ Buttonウィジェットの配置【python tkinter sqlite3で家計簿を作る】

前回の投稿からかなり時間が空いてしまったが、今回からGUI部分の作成をしてみたい。
(現在、司法書士の資格取得に向けて勉強中!笑)

設計図
f:id:memopy:20170528101451p:plain

Tkinterの基本

始めにTkinterの一番簡単な画面を作ってみる。

# -*- coding: utf-8 -*-
# モジュールのインポート
import tkinter
# 空の画面を作成して表示
root = tkinter.Tk()

# ~~~アプリの処理はこの間に記述する~~~

# 画面(アプリ)にイベント(ユーザからの入力・操作など)を待機させる
root.mainloop()

空の画面が表示された!
f:id:memopy:20170526201709p:plain

python2系と3系の違い

ちなみに、Python2系では、

import Tkinter

と、2系と3系では、宣言するモジュール名が異なっている。
他の資料を参照する場合、pythonのバージョンに注意。ただし、モジュール名以外(メソッド名など)は基本的に変わっていないようだ。

モジュール名の省略

また、tkinterは、モジュール名が長いので、今後、次のように相関名?を用いて省略する。

import tkinter as tk
root = tk.Tk()
root.mainloop()

他方、from ~ import * 句を用いると、モジュール名をすべて省略できる。

from tkinter import *
root = Tk()
root.mainloop()

しかし、これでは何のモジュールを参照しているのか分かりづらくなるので、ここでは使わないこととする。

画面のタイトル設定とサイズ設定

先ほど設定した空の画面をカスタマイズして、目的のアプリを作成することになる。
始めに画面のタイトル表示設定とサイズ設定

# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()

# タイトル設定
root.title("家計簿アプリ")

# 画面サイズ(横x縦ピクセル)の設定
# ※ xは、ASCII小文字のx
root.geometry("300x300")

root.mainloop()

タイトルが設定されて、サイズが大きくなった画面が作成された
f:id:memopy:20170526205916p:plain

続きを読む

③ データベースの実装【python tkinter sqlite3で家計簿を作る】

③ データベースの実装【python tkinter sqlite3で家計簿を作る】

今回は、sqlite3のデータベース部分を実装をする。

スキーマ設計

今回のアプリのデータベースとして2つのテーブルを設計する。
f:id:memopy:20170601211307p:plain

データベースの接続

pythonからSqlite3を使用するには、モジュールをインポートして、データベースに接続するだけで使える。
2017/5/31追記:外部キー制約のオプションはデフォルトで無効になっているため、データベース接続後に"PRAGMA foreign_keys = 1"を発行しなければならない。
2017/6/11追記:sqlite3には、DATE(日付)型というものは存在しない。DATE型で宣言してもTEXT型に変換される。また、日付はYYYY-MM-DD HH:MM:SSを始めとしたいくつかの形式しかサポートされない。

このサイトに整理されていたので参考にした。
SQLiteのデータ型 | SQLite

# -*- coding: utf-8 -*-
# filename: database.py

import sqlite3

# 空のデータベースを作成して接続する
dbname = "database.db"
c = sqlite3.connect(dbname)
# 外部キー制約のオプションは、デフォルトでは無効になっているため、これを有効にする
c.execute("PRAGMA foreign_keys = 1")

SQLの発行

SQLを発行するには、executeメソッドを使用して、SQLを発行する。
SQLは予め変数に格納しておくと、見やすく記載できる。

# itemテーブルの定義
ddl = """
CREATE TABLE item
(
   item_code INTEGER PRIMARY KEY,
   item_name TEXT NOT NULL UNIQUE
);
 """
# SQLの発行
c.execute(ddl)

# acc_dataテーブルの定義    
ddl = """
CREATE TABLE acc_data
( 
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    acc_date DATE NOT NULL,
    item_code INTEGER NOT NULL,
    amount INTEGER,
    FOREIGN KEY(item_code) REFERENCES item(item_code)
);
"""
#sqlの発行
c.execute(ddl)
続きを読む

② アプリ開発の設計【python tkinter sqlite3で家計簿を作る】

② アプリ開発の設計【python tkinter sqlite3で家計簿を作る】

今回は非常にざっくりだが、家計簿ソフトの設計をする。
いまいち、Tkinterで何ができるか把握しきれていないので、画面レイアウトは開発段階で柔軟に変更することにする。

仕様要求

①入力機能

  • ユーザが日付、金額、収支内訳等の情報(以下、「家計情報」という。)を入力することにより、家計情報をデータベースに登録できること。

②一覧表示機能

  • ユーザからの要求により、指定した期間の家計情報を一覧表示できること。

③その他

  • 入力、一覧表示機能は、GUIにより直感的な操作ができること。
  • 将来の機能拡張に対応するため、可能な限りでパラメータ化及びモジュール化を図ること。

システム設計

  • 開発プログラムを作成する。
  • 本プログラムは、Windows 10を必要OSとする。

プログラム基本設計

f:id:memopy:20170216203158p:plain
f:id:memopy:20170216211145p:plain


質問や記事の間違いがありましたらコメントお願いします。
前の記事
Python,Tkinter,sqlite3でGUIアプリ(家計簿ソフト)を作りたい。
次の記事
③ データベースの実装【python tkinter sqlite3で家計簿を作る】

Python3,Tkinter,sqlite3でGUIアプリ(家計簿ソフト)を作りたい

Python,Tkinter,sqlite3でGUIアプリ(家計簿ソフト)を作りたい。

 CUIアプリだったら簡単に作れるけど、やはりユーザーにとって使いやすいのはGUIアプリ。GUIアプリは、Excel VBAのFormでよく作っていたけど、Pythonでは(簡単に)作れるのだろうか・・・?

 ちなみに、開発環境はWindows10で。

要旨(開発方針)

  • 開発環境はWindows10
  • 家計簿ソフトを作る
  • GUIアプリ
  • バージョンは、Python 3.6 (32bit)
  • すべて標準モジュールで開発してみる。

今回作りたいアプリ

 まずは、何を作りたいか。目的はGUIアプリを作ってみたい。本末転倒だが、題材はなんでもいいので、とりあえず簡単な家計簿アプリを作ってみることにする。というか、家計簿アプリだったら、Excel VBAのFormで充分な気もするが・・・。一応、クロスプラットフォームに対応させるためということに位置付けよう。

Pythonのバージョン

  Pythonのバージョンで微妙な違いがある。WEBの情報も、Python2系で書かれた情報だと、Python3系で動かないし、時々行き詰る。

 職場のPythonは2系だから、2系に使い慣れているんだけど、今後の大勢はやはり3系なんだろうか。print文に()をつけるのがめんどくさいが、今回は3系(最新は3.6か?)でやってみよう。

 別に、今回作るアプリに、4GBもメモリ食わせないので、32bit版でいいだろうか。

GUIを作る部分

 とりあえず、googleで「Python GUI」や「Python GUI おすすめ」で検索してみると、次の3つがメジャーらしい。

  1. Tkinter
  2. PyQt
  3. wxPython

 Tkinterは、Python標準モジュールで、PyQtwxPythonは、サードパーティらしい。インストールとか大変なので、とりあえずTkinterから攻めてみて、限界を感じたら別のものを試してみたい。

データベース

 データベース部分はどうしよう。Excel VBAで作ってしまえば、シートにそのままデータを格納してしまえばいいし、Accessと連接させてもいい。GUI問題も解決。やっぱり、Excel VBAの開発性というか生産性はすごいと思う。WindowsExcelインストールされていないPCなんて今時ないでしょ?MacだってExcel VBA使えるし。

 脱線したが、DB候補は次の3つに。

  1. sqlite3
  2. MySQL
  3. PostgreSQL

 sqlite3は、標準モジュール。MySQLは前に大学の実習で使ったことある程度でPostgreSQLは職場で使っている程度。両方ともオープンソース。やったことないが、Pythonからも動かせる。

 GUIと同様に、とりあえず標準モジュールのsqlite3でやってみよう。

IDE(開発環境)

 開発環境ってなにがいいの?

  1. メモ帳
  2. IDLE
  3. Visual Studio
  4. PyScripter

 「男はだまってメモ帳!」といいたいところだが(笑)。。。なにがいいだろうか。IDLEは標準IDEだが、デバッグが大変。だが、職場ではIDLEしか使っていない。

 ほかには、Visual Studioとか商用大規模じゃなければフリーで使えるし有名だけど、インストールとか大変そう。というか、IDEの使い方を覚えるので体力消耗しそう。

 PyScripterは評判はいいけど、Python3.6に対応していない。調べてみると、2.7と3.4までは対応しているとか。わざわざバージョンダウンするのも面倒なので、標準(IDLE)で攻めます。

まとめ(開発方針)

  • 開発環境はWindows10
  • 家計簿ソフトを作る
  • GUIアプリ
  • バージョンは、Python3.6 (32bit)
  • すべて標準モジュールで開発してみる。

 

質問や記事の間違いがありましたらコメントお願いします。

次の記事

アプリ開発の設計【python tkinter sqlite3で家計簿を作る】 - memopy

 

主にPython周りのメモ

ここ数年プログラミングをやってて、覚えてきたことも増えてきたので備忘録みたいなのを兼ねてメモ

 

ここ数年の流れ

Excel VBA 

 →仕事で使うエクセル周りの自動化

 →仕事でいつも見ているwebのスクレイビング

 →趣味的にFormでGUI作ってみたり

Python

 →仕事で使ってる地理空間ソフト(ArcGIS)のAPIPythonなので、同じく自動化として

これからやりたいこと

・趣味的にPythonGUIやWEBアプリ作りたい

C++でデータ解析(←通信大学の授業で2単位分)

JavaScriptとかやってみたいな