⑤ FrameとLabelFrameの違い【python tkinter sqlite3で家計簿を作る】
⑤ FrameとLabelFrameの違い【python tkinter sqlite3で家計簿を作る】
今回は、FrameとLabelFrameという機能を掘り下げていきたい。
前回の記事では、Buttonのウィジェットをpackメソッドを用いて、画面上に配置したが、packメソッドでは、思った通りの場所にウィジェットを配置できないことが多い。
そのため、Frameというウィジェットを配置する枠を画面上に配置して、その中にウィジェットを入れると簡単にレイアウトできるようになる。
設計図
前回までに作成したGUI
フレーム 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()
仕切りのあるフレームが作成された
ラベル フレーム 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()
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部分の作成をしてみたい。
(現在、司法書士の資格取得に向けて勉強中!笑)
設計図
Tkinterの基本
始めにTkinterの一番簡単な画面を作ってみる。
# -*- coding: utf-8 -*- # モジュールのインポート import tkinter # 空の画面を作成して表示 root = tkinter.Tk() # ~~~アプリの処理はこの間に記述する~~~ # 画面(アプリ)にイベント(ユーザからの入力・操作など)を待機させる root.mainloop()
空の画面が表示された!
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()
タイトルが設定されて、サイズが大きくなった画面が作成された
③ データベースの実装【python tkinter sqlite3で家計簿を作る】
③ データベースの実装【python tkinter sqlite3で家計簿を作る】
今回は、sqlite3のデータベース部分を実装をする。
スキーマ設計
今回のアプリのデータベースとして2つのテーブルを設計する。
データベースの接続
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で何ができるか把握しきれていないので、画面レイアウトは開発段階で柔軟に変更することにする。
仕様要求
①入力機能
- ユーザが日付、金額、収支内訳等の情報(以下、「家計情報」という。)を入力することにより、家計情報をデータベースに登録できること。
②一覧表示機能
- ユーザからの要求により、指定した期間の家計情報を一覧表示できること。
プログラム基本設計
質問や記事の間違いがありましたらコメントお願いします。
前の記事
Python,Tkinter,sqlite3でGUIアプリ(家計簿ソフト)を作りたい。
次の記事
③ データベースの実装【python tkinter sqlite3で家計簿を作る】
Python3,Tkinter,sqlite3でGUIアプリ(家計簿ソフト)を作りたい
Python,Tkinter,sqlite3でGUIアプリ(家計簿ソフト)を作りたい。
CUIアプリだったら簡単に作れるけど、やはりユーザーにとって使いやすいのはGUIアプリ。GUIアプリは、Excel VBAのFormでよく作っていたけど、Pythonでは(簡単に)作れるのだろうか・・・?
ちなみに、開発環境はWindows10で。
要旨(開発方針)
今回作りたいアプリ
まずは、何を作りたいか。目的は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つがメジャーらしい。
Tkinterは、Python標準モジュールで、PyQtとwxPythonは、サードパーティらしい。インストールとか大変なので、とりあえずTkinterから攻めてみて、限界を感じたら別のものを試してみたい。
データベース
データベース部分はどうしよう。Excel VBAで作ってしまえば、シートにそのままデータを格納してしまえばいいし、Accessと連接させてもいい。GUI問題も解決。やっぱり、Excel VBAの開発性というか生産性はすごいと思う。WindowsでExcelインストールされていないPCなんて今時ないでしょ?MacだってExcel VBA使えるし。
脱線したが、DB候補は次の3つに。
- sqlite3
- MySQL
- PostgreSQL
sqlite3は、標準モジュール。MySQLは前に大学の実習で使ったことある程度でPostgreSQLは職場で使っている程度。両方ともオープンソース。やったことないが、Pythonからも動かせる。
GUIと同様に、とりあえず標準モジュールのsqlite3でやってみよう。
IDE(開発環境)
開発環境ってなにがいいの?
- メモ帳
- IDLE
- Visual Studio
- PyScripter
「男はだまってメモ帳!」といいたいところだが(笑)。。。なにがいいだろうか。IDLEは標準IDEだが、デバッグが大変。だが、職場ではIDLEしか使っていない。
ほかには、Visual Studioとか商用大規模じゃなければフリーで使えるし有名だけど、インストールとか大変そう。というか、IDEの使い方を覚えるので体力消耗しそう。
PyScripterは評判はいいけど、Python3.6に対応していない。調べてみると、2.7と3.4までは対応しているとか。わざわざバージョンダウンするのも面倒なので、標準(IDLE)で攻めます。
まとめ(開発方針)
- 開発環境はWindows10
- 家計簿ソフトを作る
- GUIアプリ
- バージョンは、Python3.6 (32bit)
- すべて標準モジュールで開発してみる。
質問や記事の間違いがありましたらコメントお願いします。
次の記事
アプリ開発の設計【python tkinter sqlite3で家計簿を作る】 - memopy