【python】作りながら覚えるデスクトップアプリ開発|tkinter

python

5ページ目になりました。

前回の「設定ファイル(*.ini)」は、例えば、メディアプレーヤーアプリを作成して、「何曲目まで再生したか?」「ボリュームは?」などの状態を保存して、次回起動時に同じ設定で続きを聴きたいと言う場合に役立ちます。

今回からは、もっと柔軟にデータを扱う用途に適した、JSON形式のファイルの読み書きを実装していきます。

ではまず、あなたのお気に入りサイトのURLをリスト化して保存して呼び出せるようにしてみましょう。

  1. python×tkinterでGUI作成
    1. python の開発環境は Anaconda がおすすめ
    2. ウィンドウの各種設定項目を追加
  2. tkinterのボタンクリックでリンク開く方法
  3. ここまでの全コード
  4. 【python】tkinter基礎⇒応用編
    1. URLをクリックするとリンクを開くようにカスタマイズ
    2. リンクを開く処理の実装
  5. 今回カスタマイズした結果の全コード
  6. 複数ページのリンクを表示する
    1. forループでページ数の連番を追加する処理
    2. リストにしたURLをlistboxで表示してみよう!
    3. submit 関数のカスタマイズ
  7. 今回のカスタマイズした全コード
  8. 設定ファイル(*.ini)の処理をコーディング
    1. 設定ファイルの保存フォルダを作成
    2. 保存フォルダに設定ファイル(*.ini)を保存
    3. 設定ファイル(*.ini)を扱うモジュール
  9. これまでのコードに設定ファイル(*.ini)の処理を組み込む
  10. JSONファイルで、お気に入りサイトのURLを管理
    1. サブアプリの画面をカスタマイズ
    2. 辞書型(ディクショナリー型)
  11. JSONファイルにデータを追加するツールを作成
  12. JSON書き込み処理の実装
    1. コードの解説
    2. URLの正規表現によるチェック
    3. URLの存在チェック
  13. 動作確認
  14. 今回使用するJSONファイル
  15. コンボボックスとリストボックスの追加
    1. コンボボックスにカテゴリーを追加する関数
    2. URLをブラウザで開く処理
  16. 今回の全コード
    1. 動作確認
  17. カテゴリーやURLの追加や削除の関数
    1. add_category 関数の説明
    2. remove_category関数の説明
    3. remove_url関数の説明
  18. 関数を操作する例
  19. ここからは・・・
  20. まとめ

JSONファイルで、お気に入りサイトのURLを管理

ではまず、JSONファイルを手動で作成してみましょう。

{
    "site": {
        "google": "https://www.google.com/",
        "yahoo": "https://www.yahoo.co.jp/",
        "amazon": "https://www.amazon.co.jp/",
        "rakuten": "https://item.rakuten.co.jp/"
    }
}

ファイル名は「sitelist.json」として、jupyter Notebook の実行フォルダに「json」というサブフォルダを作成して、そこに保存しました。

~Pythonが実行されているカレントディレクトリ\json\sitelist.json

形式は見ての通り、分かりやすいので、自由に書き換えるなり、追加するなりできると思いますが、まず最初はそのままコピペして動作を確認してからにしましょう。

インポート

import json
import os

JSONファイルのパス

#jsonファイルのパス
sub_folder = os.path.join(os.getcwd(),'json')
json_path = os.path.join(sub_folder,'sitelist.json')

JSONの読み込み

#jsonの読み込み
with open(json_path) as f:
    json_load = json.load(f)
# print(json_load) の結果
{'site': {'google': 'https://www.google.com/', 'yahoo': 'https://www.yahoo.co.jp/', 'amazon': 'https://www.amazon.co.jp/', 'rakuten': 'https://item.rakuten.co.jp/'}}

JSONの書き込み(確認のため、書き込みの前にファイルのコピーを作っておく)

#jsonの書き込み
with open(json_path, 'w') as f:
    json.dump(json_load, f, indent=4)

「sitelist.json」を「sitelist - コピー.json」と比べてみると中身は同じものになりますが、更新日時が保存した日時になっていればOKです。

では次に、JSONファイルの保存フォルダを開くツールを作成しておきましょう。

といっても、ゼロからではなく、前回のサブアプリのコードを流用します。

サブアプリの画面をカスタマイズ

「エクスプローラで ini フォルダを開く」サブアプリのコードを元にカスタマイズしていきます。

前回の「エクスプローラでフォルダを開く」を流用

ini ファイルのコーディングを JSON ファイル用に書き換えれば完成です。

import tkinter as tk
import subprocess
import os
import json

# ウィンドウの作成
bg_color = 'LightSteelBlue1'
root = tk.Tk()
root.title('python×tkinter')
root.geometry('300x200')
root.resizable(1, 1)
root.config(bg=bg_color)
root.attributes("-topmost", True)  #常に前面に表示

#jsonファイルのパス
json_dir= os.path.join(os.getcwd(),'json')
json_path = os.path.join(json_dir,'sitelist.json')
    
#関数の作成
def open_json_dir():
    subprocess.Popen(['explorer',json_dir])

button = tk.Button(root,text='JSONフォルダを開く',command=open_json_dir)
button.pack(expand = True)

# ウィンドウのループ処理
root.mainloop()

実行するとこのようなウィンドウが表示されます。

ボタンを押して、JSONのフォルダが開いて、ファイル(ここでは「sitelist.json」)があることを確認できればOKです。

辞書型(ディクショナリー型)

ここで、JSONフォーマットと辞書型の関係を簡単に説明しておきます。

JSONファイルのデータは、python の中では辞書型(ディクショナリー型)として扱われます。

# 辞書型:KeyとValueのペアで保持するデータ型
辞書名 = {"Key" : "Value", ...}

「JSONファイル」➔デコード➔「辞書型」➔エンコード➔「JSONファイル」というイメージですね。

JSONというフォーマットで書かれた文字列のデータを、辞書型というpython のデータ型に変換することで、編集や追加、削除などの処理ができるということです。

JSONファイルは他の言語でも、それぞれのデータ型に変換されて処理できるので、異なる言語間のデータの受け渡しにも用いられます。

JSONファイルにデータを追加するツールを作成

最終的には、JSONファイルから読み込んで、データをリストに入れ、サイト名とURLを入力して「保存」ボタンを押すと辞書にデータを追加してファイルに書き込むようにします。

まずは、ウィンドウを実装しましょう。

形から入るというのも良いですね!イメージが明確になり、その後の作業がしやすくなります。

import tkinter as tk
import webbrowser
import subprocess
import os
import json

#色の設定
bg_color1='cornsilk2'
bg_color2='LightSteelBlue1'
bg_color3='Silver'

# ウィンドウの作成
root = tk.Tk()
root.title('python×tkinter')
root.geometry('360x240')
root.resizable(1, 1)
root.config(bg=bg_color3)
root.attributes("-topmost", True)  #常に前面に表示

# frameの作成
frame1 = tk.Frame(root,bg=bg_color1)
frame2 = tk.Frame(root,bg=bg_color2)
frame1.pack(fill=tk.BOTH, expand=True)
frame2.pack(fill=tk.BOTH, expand=True)

#jsonファイルのパス
json_dir= os.path.join(os.getcwd(),'json')
json_path = os.path.join(json_dir,'sitelist.json')
    
#関数の作成
def open_json_dir():
    subprocess.Popen(['explorer',json_dir])
    
def read_json():
    pass
def add_dict():
    pass
def write_json():
    pass

#ラベルとEntryの作成
#frame1にpack
lbl01 = tk.Label(frame1,text='python_tkinter JSONに追加',bg=bg_color1)
lbl01.pack()
lbl02 = tk.Label(frame1,text='サイト名とURLを入力してください',bg=bg_color1)
lbl02.pack()
#frame2にgrid
lbl_name = tk.Label(frame2,text='サイト名:',bg=bg_color2)
lbl_name.grid(row=0, column=0, padx=5, pady=5)
txt_name = tk.Entry(frame2,width=28)
txt_name.grid(row=0, column=1, padx=5, pady=5)
lbl_url = tk.Label(frame2,text='URL:',bg=bg_color2)
lbl_url.grid(row=1, column=0, padx=5, pady=5)
txt_url = tk.Entry(frame2,width=28)
txt_url.grid(row=1, column=1, padx=5, pady=5)

#ボタンの作成(rootにpack)
btn_ini_write = tk.Button(root,text='保存',command=write_ini)
btn_ini_write.pack()

button = tk.Button(root,text='JSONフォルダを開く',command=open_json_dir)
button.pack(expand = True)

# ウィンドウのループ処理
root.mainloop()

実行すると、以下のようなウィンドウが表示されます。

今まで、Widget を配置する方法として、「pack」しか使ってきませんでしたが、ラベルとEntryを横に並べたかったので、「grid」という方法を使いました。

そして、「pack」と「grid」を混在させることができないので、「Frame」を作成して、「Frame1」は「pack」、「Frame2」は「grid」、余りの「root」にボタンを「pack」としました。

「Frame」の形がわかりやすいように、色分けしてあります。

Frame1='cornsilk2'
Frame2='LightSteelBlue1'
root='Silver'

JSONの読み書きと辞書への追加の3つの関数は箱だけ用意して、中身が「pass」としてあります。

「pass」と書いておけば、中身の処理が無くてもエラーにならないので便利ですよ。


長くなりましたので、今回はここまでとします。

次回は各関数の処理を実装していきましょう!

コメント

タイトルとURLをコピーしました