1.はじめに
Pythonでtkinterパッケージを使用して、簡易的なGUIアプリを自作していたのですが、
キーバインドをbindメソッドで行う方法がネット上にあまり確認できなかったので、本記事を投稿しました。
tkinterを使ってGUIアプリを作る際に、「CTRL+s」を押したら名前を付けてファイルとして保存する関数を実行させたり、「CTRL+f」を押したら単語を検索する関数を実行させたりなど、キーと関数を結び付けたいと思った際に、参考にしていただけたら幸いです。
開発環境
・WSL2/Ubuntu環境
・Python: 3.10.12
2.tkinterの紹介
tkinterパッケージはWindowsや macOSなどに対応しているクロスプラットフォームなGUIライブラリです。tkinterはPythonに標準で付いているため、気軽に使用できます。ウィンドウやボタンなどGUIアプリに必要な様々な部品を構築できます。
3.tkinterを使用してキーバインドに対応する方法
動作確認するためのサンプルプログラムとして以下プログラムを作成しました。
import tkinter as tk
from tkinter import filedialog, Text
# Function to save file
def Sample_SaveFunc(event=None):
savefilepath = filedialog.asksaveasfilename(
filetypes=[("Text files", "*.txt")],
)
if savefilepath:
with open(savefilepath, "w") as file:
file.write(text.get(1.0, tk.END))
# configure root
root = tk.Tk()
root.title("bind_sample")
root.geometry("800x600")
# configure text
text = Text(root, wrap="word", undo=True)
text.pack(fill="both", expand=True)
# configure key-bind
root.bind("<Control-s>", Sample_SaveFunc)
root.bind("<Control-S>", Sample_SaveFunc)
# display window
root.mainloop()
プログラムの動作
キーボード操作で「Controlとs」を押すとSample_SaveFunc関数が呼ばれ、Sample_SaveFunc関数では現在text領域に記載されているデータを.txt形式で保存します。
2024/06/29 プログラムに追記
当初プログラムの「# configure key-bind」の項目には以下コードのみを記載していました。
root.bind("<Control-s>", Sample_SaveFunc)
「コメント欄」にて、上記コードのように「Control-s」のみの場合CapsLockが有効の際にショートカットキーが動作しないとのご指摘を頂き、CapsLockが有効の際でもショートカットが動作するように以下コードを追記しております。
root.bind("<Control-S>", Sample_SaveFunc)
bindメソッドの使い方
bindメソッドの使い方ですが、以下のサンプルのようにキーの名前と対応する関数を引数とすることで、該当するキーが叩かれたら、対応する関数が呼ばれます。
import tkinter as tk
root = tk.Tk()
root.bind("<キーの名前>", キーに対応する関数)
補足)「キーの名前」の指定方法
Controlを使う場合
例)キー操作:「Control+s」に反応する場合
"<Control-s>"
キー操作:「Control+f」に反応する場合
"<Control-f>"
Shiftを使う場合
例)キー操作:「Shift+n」に反応する場合
"<Shift-N>"
4.終わりに
本記事ではtkinterを使用してキーバインドに対応する方法について紹介しました。
キーと関数を結び付けたいと思った際に、参考にしていただけたら幸いです。
参考文献
本記事は以下情報を参考にして執筆しました。
・Python 3.12 ドキュメント
・PythonのTkinterを使ってみる