見出し画像

機能追加(1)テーマ切り替え

(Python学習初心者の試行錯誤・備忘録です)
前回

までで、動作は基本的に変えずに、コード内容を整理する「リファクタリング」を試みました。MVCの役割ごとにファイルを分けたら、全体の見通しが良くなった(と思っているところ)。何のための作業かと言うと、その先の「機能拡張」をスムーズに行えるようにするためだろうと自分は思います。ここまではこんなアプリです。

「発声」をクリックすると、指定言語で読み上げる。「連想」をクリックすると、訳語(など、DBに読み込ませた二つ目のテキストデータ)を表示する。

「覚えた」をクリックすると、

その単語は「習熟レベル」を一つ上げる。(レベル0⇒1)
忘れていたらレベル0まで下げる。そして次の単語に行く。
 表示する単語は、対象の中で「習熟レベル」が最も低く、かつその中でも最後に確認した時間(timestamp)が最も古いものが優先で抽出される。
・・というものです。

デザインを派手に?

 上のアプリを試しに知人に使ってもらったところ、まず「地味だね」と言われてしまいました。見た目から入るのか? 肝心なのは「そこじゃない」とは思うのですが、学習者の関心をつなぎとめるためにも、見た目にこだわりましょうか。
 「ダークテーマ」とかいろいろ、切り替えられるようにするには?
 ここまでGUIの表示には、TkEasyGUIをimportして使ってきましたが、画面のデザイン 「テーマ」を切り替えるような機能があるのか不明だったので、PySimpleGUIに変えてみることにしました(但し登録不要のVer4のもの)。mvctest_view.pyで

#import TkEasyGUI as eg
import PySimpleGUI as eg


これだけで画面デザインがかなり変わりますが、ちょっと格好をつけて、ユーザーが自分でデザインを切り替えられるよう、コンボボックスを置いてみます。

mvctest_view.pyを次のように改造

#import TkEasyGUI as eg
import PySimpleGUI as eg

class View_EG:
    def __init__(self,theme='LightGreen') -> None:
        self.makemain(theme)

    def makemain(self, theme):
        #再度呼び出せるようwindowアトリビュートの有無を確認、あったらcloseして再構築
        if hasattr(self,"window"):
            self.window.close()

        self.mytheme = theme
        eg.theme(self.mytheme)
        lfont = ('標楷體', 100) #大きい表示用フォント
        sfont = ('Arial', 50) #小さい表示用フォント
        btfont= ('Arial', 20) #ボタン表示用フォント
        
        #表示サンプル
        myword = '仮置き'; pinyin = 'karioki'
        menu_def = [
            ['ファイル',['読み込み',['CSV::LoadCSV'],  '---', 'Exit']],
        ]
    #表示テーマ
        themelist=['LightGreen','Black', 'BlueMono', 'BluePurple', 'BrightColors', 'BrownBlue',
                    'Dark', 'Dark2', 'DarkAmber', 'DarkBlack', 'DarkBlack1', 'DarkBlue',
                    'DarkBlue1', 'DarkBlue10', 'DarkBlue11', 'DarkBlue12', 'DarkBlue13', 
                    'DarkBlue14', 'DarkBlue15', 'DarkBlue16', 'DarkBlue17', 'DarkBlue2', 
                    'DarkBlue3', 'DarkBlue4', 'DarkBlue5', 'DarkBlue6', 'DarkBlue7', 
                    'DarkBlue8', 'DarkBlue9', 'DarkBrown', 'DarkBrown1', 'DarkBrown2', 
                    'DarkBrown3', 'DarkBrown4', 'DarkBrown5', 'DarkBrown6', 'DarkBrown7', 
                    'DarkGreen', 'DarkGreen1', 'DarkGreen2', 'DarkGreen3', 'DarkGreen4', 
                    'DarkGreen5', 'DarkGreen6', 'DarkGreen7', 'DarkGrey', 'DarkGrey1', 
                    'DarkGrey10', 'DarkGrey11', 'DarkGrey12', 'DarkGrey13', 'DarkGrey14', 
                    'DarkGrey2', 'DarkGrey3', 'DarkGrey4', 'DarkGrey5', 'DarkGrey6', 
                    'DarkGrey7', 'DarkGrey8', 'DarkGrey9', 'DarkPurple', 'DarkPurple1', 
                    'DarkPurple2', 'DarkPurple3', 'DarkPurple4', 'DarkPurple5', 'DarkPurple6', 
                    'DarkPurple7', 'DarkRed', 'DarkRed1', 'DarkRed2', 'DarkTanBlue', 'DarkTeal', 
                    'DarkTeal1', 'DarkTeal10', 'DarkTeal11', 'DarkTeal12', 'DarkTeal2',
                    'DarkTeal3', 'DarkTeal4', 'DarkTeal5', 'DarkTeal6', 'DarkTeal7', 
                    'DarkTeal8', 'DarkTeal9', 'Default', 'Default1', 'DefaultNoMoreNagging',
                    'Green', 'GreenMono', 'GreenTan', 'HotDogStand', 'Kayak', 'LightBlue',
                    'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4', 'LightBlue5',
                    'LightBlue6', 'LightBlue7', 'LightBrown', 'LightBrown1', 'LightBrown10',
                    'LightBrown11', 'LightBrown12', 'LightBrown13', 'LightBrown2', 'LightBrown3',
                    'LightBrown4', 'LightBrown5', 'LightBrown6', 'LightBrown7', 'LightBrown8',
                    'LightBrown9', 'LightGray1', 'LightGreen', 'LightGreen1', 'LightGreen10',
                    'LightGreen2', 'LightGreen3', 'LightGreen4', 'LightGreen5', 'LightGreen6',
                    'LightGreen7', 'LightGreen8', 'LightGreen9', 'LightGrey', 'LightGrey1',
                    'LightGrey2', 'LightGrey3', 'LightGrey4', 'LightGrey5', 'LightGrey6', 
                    'LightPurple', 'LightTeal', 'LightYellow', 'Material1', 'Material2', 
                    'NeutralBlue', 'Purple', 'Python', 'Reddit', 'Reds', 'SandyBeach', 
                    'SystemDefault', 'SystemDefault1', 'SystemDefaultForReal', 
                    'Tan', 'TanBlue', 'TealMono', 'Topanga']   

        layout = [
            [eg.Menu(menu_def)],
            [eg.Combo(values=["zh-TW","ja","en-US"],default_value="zh-TW",key="-LANG-"),
            eg.Text("デザインテーマ"),eg.Combo(values=themelist,default_value=self.mytheme,
                                        key="-THEME-",enable_events=True)],
            
            [eg.Button("発声", font = btfont, key ="-BTN_SPEAK-"),
            eg.Button("連想", font = btfont, key ="-BTN_SHOW_BACK-"),
            eg.Button("覚えた", font = btfont, key ="-BTN_MEMORIZE-"),
            eg.Button("まだ", font = btfont, key ="-BTN_FORGET-")],
            [eg.Text('サマリー仮置き',
            key="-DISP_SUMMARY-",font=('Arial', 15))],
            [eg.Text(myword, font = lfont, key="-DISP_MAIN-")],
            [eg.Text(pinyin, font = sfont, key="-DISP_SUB-")],
        ]
        self.window = eg.Window("単語暗記 for Windows(Python版)", layout=layout, finalize=True)

当初、Viewのクラス(View_EG)のイニシャライザの中に直書きしていた処理を、makemain() と言う関数にして外に出しています。さらにテーマに応じたウインドウを構築するように変更しています。
 メインのイベント処理の中ではにテーマ設定のコンボボックスに変更があったらビューのmakemainを呼び出して、新しいテーマでウインドウを作り直すように記述を加えました。

    elif event == "-THEME-":
        myview.makemain(value["-THEME-"])
        mycontroller.pickupcard(0)
        mycontroller.refresh_view(myview.window)    


綺麗に切り替わってくれます。学習者は、逆に気が散ってしまうかも?

この記事が気に入ったらサポートをしてみませんか?