フォントとテーマを変えられるデジタル時計をPythonで作ってみた。

# フォントとテーマを変えられるデジタル時計
## 初投稿注意
## 作るきっかけ
インターネット上にはPythonを使ってプログラムを作る記事がたくさんある。<br>
その中でも、私は手軽におしゃれなGUIを使ったプログラムを作りたかったためPySimpleGUIを使ったものを探していた。
そして出会ったのが「デジタル時計」である。
<br>
最初はサイトの手本どうりにプログラムを作っていったが、だんだんそれだけではつまらないと感じるようになり、考えたのがタイトルにある「フォントとテーマを変えられるデジタル時計」を作ることであった。
## プログラムの中身
```
import PySimpleGUI as sg
from datetime import datetime
import tkinter.font

#時間を取得して返り値を返す
def now():
    ntime=datetime.now()
    nt=ntime.strftime('%H:%M:%S')
    return nt

#通常画面を作成する
def make_window(theme,cfont):
    if theme:
        sg.theme(theme)
　　#通常画面のレイアウト
　　#現在時刻、テーマチェンジボタン、フォントチェンジボタン、終了ボタン
    layout=[[sg.Text('',key='-time-',font=(cfont,40),justification='center')],
        [sg.Button('change theme',key='-theme-',size=(10,3))],
        [sg.Button('change clock font',key='-font-',size=(10,3))],
        [sg.Button('close',key='-close-',size=(10,3))]]

    return sg.Window('digital clock',layout,size=(300,250))    
    

def main():
    #フォントとテーマを初期設定しておく
    cfont='Times New Roman'
    theme='Black'
    wnd=make_window(theme,cfont)

    while True:
　　　　#timeoutを設定すると時間経過でGUIを動作させることが可能になる
        event,values=wnd.read(timeout=10,timeout_key='-timeout-')
        #１０ミリ秒ごとに時間取得を行う
        if event == '-timeout-':
            wnd['-time-'].update(now())
　　　　
        if event in (sg.WIN_CLOSED,'-close-'):
            break

        #テーマチェンジボタンを押したらプルダウンメニュー付きのウィンドウを開く
        if event == '-theme-':
            #layout and window create
            event,values = sg.Window('Theme Browser',
            [[sg.Text('theme browsing')],
            [sg.Text('click theme color')],
            [sg.Combo(values=sg.theme_list(),size=(20,12),key='-LIST-',readonly=True)],
            [sg.OK(),sg.Cancel()]]).read(close=True)

            #選択してOKを押したらテーマの値を変更してmake_window関数に渡す
            if event == 'OK':
                theme=values['-LIST-']
                wnd.close()
                wnd= make_window(theme,cfont) 
        #フォントチェンジボタンが押されたらこちらも同様のウィンドウを開く
        if event == '-font-':
            #layout and window create
            event,values = sg.Window('Font Browser',
            [[sg.Text('Font browsing')],
            [sg.Text('click font')],
            [sg.Combo(values=tkinter.font.families(),size=(20,12),key='-FONT-',readonly=True)],
            # or
            [sg.Combo(values=sg.Text.fonts_installed_list(),size=(20,12),key='-FONT-',readonly=True)],
            [sg.OK(),sg.Cancel()]]).read(close=True)

            #フォントの値を変えて渡す
            if event == 'OK':
                cfont=values['-FONT-']
                wnd.close()
                wnd= make_window(theme,cfont)
                
            
    wnd.close()

if __name__ == '__main__':
    main()
```
## 補足
~~フォントの表示にはPySimpleGUIだけでは対応できないため、tkinter.font.families()をプルダウンメニューの値に入れている。~~
PySimpleGUI公式さんがTwitter上でsg.Text.fonts_installed_list()の存在を教えてくれました。


## 参考サイト↓
デジタル時計の作り方で参考にした。

https://qiita.com/Gyutan/items/2c61159a19073b19012b

フォント一覧の取得方法

https://www.school.ctc-g.co.jp/columns/hishinuma/hishinuma21.html

テーマを変えるための方法例が載っていてプログラム作成の際にかなり参考になった。
(注意:英語のサイト)

https://stackoverflow.com/questions/66171339/is-there-a-way-to-update-every-window-when-a-new-theme-has-been-selected-in-pysi