今までは、Thonny(python開発ソフト)で動作確認をしてきましたが、開発ソフトではなく、Windowsパソコン上に表示させてみたいと思います。
使用するライブラリ(モジュール)
Pythonで使用するGUI(Graphical User Interface)はいくつもありますが、TkinterやPySimpleGUI(運用停止)が有名です。他にも、Kivy、PyQt、wxPythonなどがあります。
Tkinter
ティーケーインタと読むようです。標準ライブラリに収められているモジュールです。細かい内容については、公式サイトなどを参考にしてください。
実際に使ってみると、簡単なプログラムで表示することができるのがわかります。完全に理解していないからかもしれませんが、細かく設定しようとするとプログラマが色々と考えてプログラムを書く必要がありそうだと感じました。
ttk
Tkinterの拡張モジュール(Theme Tk)で、Tkinterをよりよくデザインすることができます。今回は紹介のみです。使う機会があったらまとめたいと思います。
PySimpleGUI
パイシンプルガイと読むようです。PyPIに収録されていた外部ライブラリです。現在は運用停止されています。ライブラリを運用するために商用利用する場合は、ライセンス料を求めていましたが支払いされないまま使われていて、運用コストの補填ができない為と経緯が書かれています。
動作確認(Tkinter)
以前に、APIを利用した気象情報を表示した記事があります。このプログラムを利用して、天気予報を表示させてみたいと思います。
プログラムを段階的に変えていって、どのように変化するかを確認していきます。
Thonnyで動作確認していきます。
とりあえず必要なものを表示
必要そうなアイテムを表示させます。
import tkinter as tk
m_window = tk.Tk()
m_window.title("気象情報")
cmt_1 = tk.Label(m_window, text="今日の天気", font=("Helvetica", 18, "bold"))
cmt_1.pack()
t_weather = tk.Label(m_window, text=(f"東京"))
t_weather.pack()
update_btn = tk.Button(m_window, text = '更新')
update_btn.pack()
m_window.mainloop()このプログラムだと次のようなウィンドウが表示されます。

表示させることはできましたが、明らかに物足りません。もう少しアレンジしていきます。
レイアウトを整理する
少しだけレイアウトを変更させて、上手く行ったら気象情報を表示させていきます。
import tkinter as tk
a = "今日"
b = "明日"
m_window = tk.Tk()
m_window.title("気象情報")
m_window.minsize(300,200)
cmt_1 = tk.Label(m_window, text=(f"{a}の天気"), font=("Helvetica", 18, "bold"))
cmt_1.place(x=85, y=15)
t_weather = tk.Label(m_window, text="東京", font=("Helvetica", 14))
t_weather.place(x=120, y=50)
update_btn = tk.Button(m_window, text = '更新')
update_btn.place(x=130, y=100)
m_window.mainloop()上のコードで下の画像が表示されます。

ウィンドウサイズ
m_window.minsize(300,200)は、最低でもこのサイズを表示するというコードです。
サイズを指定したい場合はコードを、m_window.geometry(“300×200”) に変更してください。
余白
指定がない場合は、全てのアイテムをギチギチに詰めた形になります。
それぞれに間隔(余白)を与えるために、cmt_1.pack() を cmt_1.place(x=85, y=15) に変更しました。
コメント表示
cmt_1 = tk.Label(m_window, text=(f”{a}の天気”), font=(“Helvetica”, 18, “bold”)) の {a} を {b} にすると、「今日の天気」が「明日の天気」に代わります。
ウィンドウが再表示されない
×ボタンでこのウィンドウを閉じて、再度表示させようとしても画面が表示されない場合は、Thonnyの「STOP」ボタンを押してみてください。
気象情報を表示させる
Webサイトの情報からデータを取得する方法(API)について書いた記事で気象情報を取得しました。この情報を使って、表示させた画面に東京の今日の情報を表示させてみます。
import requests
import json
import tkinter as tk
def weathercast():
r = requests.get('https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json')
rjson_data = r.json()
region_name = rjson_data[0]["timeSeries"][0]["areas"][0]["area"]["name"]
today_weather = rjson_data[0]["timeSeries"][0]["areas"][0]["weathers"][0]
tw_word_cnt = today_weather.count('')
tw_wcnt_width = tw_word_cnt * 14 + 120
if (300 <= tw_wcnt_width):
new_tw_wcnt_width = tw_wcnt_width + 40
m_window.geometry(f"{new_tw_wcnt_width}x200")
t_weather = tk.Label(m_window, text=(f"{today_weather}"), font=("Helvetica", 14))
t_weather.place(x=45, y=85)
m_window = tk.Tk()
m_window.title("気象情報")
m_window.minsize(300,200)
t_cnt = tk.Label(m_window, text="今日の天気", font=("Helvetica", 18, "bold"))
t_cnt.place(x=20, y=10)
w_area = tk.Label(m_window, text="地域:東京", font=("Helvetica", 14, "bold"))
w_area.place(x=20, y=50)
update_btn = tk.Button(m_window, text = '更新', command = weathercast)
update_btn.place(x=130, y=150)
m_window.mainloop()このプログラムを動作させると下記のようなウィンドウが表示されます。
ボタン
ボタンに動作( command = weathercast)を追加しました。ボタンを押すと、def weathercast() 関数が動作するようにしました。

この状態で、更新ボタンを押すと今日の天気が表示されます。

編集していた日の天気は「晴れ」でした。

違う日に天気を表示させると文字数が多すぎてウィンドウから見切れてしまうことが確認できたため、表示する文字数をカウントしてウィンドウを超えそうになった場合は、ウィンドウの幅を変更するようにしました。if (300 <= tw_wcnt_width): の周辺です。
プログラムを書いていて他の良いコードを使たとき、他のGUIモジュールを使ってみたら追記していきます。


コメント