daisukeの技術ブログ

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

TkEasyGUI(Python)で簡単GUI(PySimpleGUI有料化に伴い移行します!)

Pythonで簡単にGUIアプリが作れる環境として、PySimpleGUIがバージョン5から、商用利用の場合は有償となりました

個人が使う場合は、これまで通り、無償で使えるとのことですが、ライブラリを使い分けるのは大変なので、PySimpleGUIのAPIの互換性を持つ「TkEasyGUI」に乗り換えることにします!という記事です。

今回は、TkEasyGUIの紹介と簡単な使い方を紹介しようと思います。

それでは、やっていきます!

はじめに

単純なGUIアプリを作るときに、大変重宝していたPySimpleGUIが有償化されたということで、大変残念なニュースでした。

ですが、PySimpleGUI互換のTkEasyGUIを使ってみると、え?同じやん?というぐらい、(今のところ)使い勝手がほとんど変わらない素晴らしいライブラリです。

PySimpleGUIを使うときは、以下のように、PySimpleGUIをインポートしてから書いていきます。

import PySimpleGUI as sg

今まで書いてたものを、以下に書き直しただけで動きました(笑)

import TkEasyGUI as sg

というわけで、APIレベルで互換性があります!

※2024/4/27追記:TkEasyGUIを使ったGUIアプリを公開しました、良かったら見てください

daisuke20240310.hatenablog.com

TkEasyGUIのインストール

以下は、TkEasyGUIの開発者(日本の方です)の方の記事です。

note.com

この記事に、TkEasyGUI のインストール方法と、簡単な使い方が書かれていますね。書く内容がなくなりました(笑)

一応、インストール方法です。

$ pip install TkEasyGUI

TkEasyGUIの簡単な使い方

次は、簡単な使い方と説明です。

私がいつも使ってるクリップボードを使うアプリを書いてみました。

import TkEasyGUI as eg
import pyperclip

TITLE = "show clip_simple.py"

layout = [ [eg.Text("", key='text')] ]

window = eg.Window( TITLE, layout, size=(250, 40) )

getdata = pyperclip.paste()
getdata_old = ""

# GUI表示実行
while True:
    
    # ウィンドウ表示
    event, values = window.read( timeout=1000 )
    if event != "__TIMEOUT__" and event != "-TIMEOUT-":
        if event == eg.WIN_CLOSED:
            break
    
    getdata = pyperclip.paste()
    
    if getdata == getdata_old:
        continue # 取得したクリップボードのデータが前回と同じなら何もしない
    
    else:
        
        window['text'].update( getdata )
        
        getdata_old = getdata

window.close()

簡単にソースコードを説明します。

  • importの1つ目は、TkEasyGUIです
  • importの2つ目は、クリップボードの内容を取得できるライブラリです
  • TITLEは、ウィンドウのタイトルに表示する文字列です
  • layoutに代入しているところは、リストですが、この形式で、GUIのウィンドウを表現できます(今回は単純なウィンドウなので、テキストオブジェクトだけを配置しています)
  • eg.window()でウィンドウを作成します(sizeでウィンドウのサイズを指定できます)
  • pyperclip.paste()で、現在のクリップボードの内容を取得しています
  • getdata_oldには、1つ前にクリップボードに入れた内容を格納します(初期値は空にしておきます)
  • これ以降は無限ループで、×ボタンが押されるまで、動作し続けます
    • window.read( timeout=1000 )で、ウィンドウを取得します、タイムアウトを1秒に設定しています(タイムアウトを設定しないとイベントが起きるまで待つことになりますが、クリップボードに内容が入ってもイベントは発生しないので、1秒ごとにポーリングしています)
    • また、クリップボードの内容を取得します、1つ前の内容と同じならイベント待ちに戻ります
    • クリップボードに新しい内容が入ったら、ウィンドウに反映します
    • 次のために、getdata_oldに今回のクリップボードの内容を入れておきます
  • ×が押されるとウィンドウをクローズして終了します

では、これを Windows10 の IDLE で実行してみます。

IDLEを起動して、File→New Fileをクリックします。

上のコードを貼り付けます。

IDLEのNew Fileでコードを貼り付けた
IDLEのNew Fileでコードを貼り付けた

では、実行してみます。Run→Run Moduleをクリックします。

ファイルに保存してください、のようなメッセージが出るので、適当なフォルダに保存します。

すると、以下のようなウィンドウが起動して、現在のクリップボードの内容が表示されてると思います。

クリップボードビューアアプリ
クリップボードビューアアプリ

複数行を想定してないので、変な表示になっているかもしれません。

何かの1行だけの文章をコピーしてみてください。

上の画像のようになると思います。

簡単ですが、使い方は以上です。

詳細の使い方は、TkEasyGUIのGitHubのドキュメントを参照するか、PySimpleGUIと互換性が高いので、PySimpleGUIの使い方で検索するとたくさん出てくるので、そちらを参照してもいいと思います。

GitHubは以下です。

github.com

終わりに

今回は、Pythonで、簡単にGUIアプリが作れる PySimpleGUI が商用利用は有償になったので、PySimpleGUI と互換性の高い TkEasyGUI の紹介でした。

次回は、この TkEasyGUI と、Webスクレイピングを組み合わせた GUIアプリを作ってみたいと思います。

今回は以上です!

最後までお読みいただき、ありがとうございました。