はじめに
このシリーズでは、tkinterを使って自分が欲しいと思う機能を全部乗せた
「自分だけのメモ帳」
を作成していきます。
一連の目次については、この記事の一番下に記載しています。
このページでは、
前回メモ帳に追加した「常に最前面に表示する」機能を、キーボードショートカットで設定できるようにします。
前回作成した「常に最前面に表示する」ボタンについて
前回は、ウィンドウ内にボタンを配置してそれを押すことで最前面がon/offする機能を追加しました。
今回は、この機能をボタンではなく、キーボードショートカットで使用できるようにします。
キーボードの入力と関数を紐付ける_tkinterのbindについて
といった操作と、準備したコマンド(関数)をbindで紐付けます。
tkinterのbindで出来ることについては、下記ページの説明がとても分かりやすかったです。
→いつもありがとうございます!
今回作成するキーボードショートカットについて
操作内容 | ショートカット |
---|
ウィンドウを常に最前面表示する | Ctrl + → |
ウィンドウの最前面表示を解除する | Ctrl + ← |
Ctrlと矢印キーを組み合わせて、最前面on/offを操作します。
今回作成したコード
追加した部分_入力と関数をbindする
#################
# キーバインドでショートカット実行できるようにする
## 最前面のon/offを切り替えるショートカット
root.bind_all("<Control-KeyPress-Right>", saizen_on_bind)
root.bind_all("<Control-KeyPress-Left>", saizen_on_bind)
bindでキーボード入力と関数を紐付けました。
bindの紐付け方法については下記ページが分かりやすかったです。
→ありがとうございます!
"<Control-組み合わせる入力>" で Ctrl+入力 というようにショートカット操作が設定できます。
「KeyPress-」でキーボードの入力したときをトリガーにする、
「Right」で右矢印キーですね。
追加した部分_動作を提供する関数
###############################
#### 各種機能を提供する関数 ####
###############################
# キーバインドショートカットから呼び出す
def saizen_on_bind(self):
press_key=self.keysym # print(self) # <KeyPress event state=Control|0x40000 keysym=Right keycode=39 x=415 y=76>
if press_key == "Right":
saizen_on()
elif press_key == "Left":
saizen_off()
bindしたキーボードショートカットから呼び出す関数を追加しました。
saizen_on() と saizen_off() は前回作成した関数です。
bindで呼び出した関数には一個引数が渡されています。
## bind実施時の渡されるイベント内容について Ctrl+← で渡された引数
print(self)
print(type(self))
print(self.keysym)
# →<class 'tkinter.Event'>
# →<KeyPress event state=Control|0x40000 keysym=Left keycode=37 x=478 y=120>
# →Left
これによってどのキーが入力されたのか判定しています。
メモ帳コード全体
# モジュールインポート # Pythonのモジュールとimportとfrom入門 - Qiita https://qiita.com/niwaka_dev/items/6e3d9ff6d797243c77c3
## tkinter モジュールをインポートする 標準ライブラリ
import tkinter
############
# ウィンドウの基本設定
## rootの設定
root = tkinter.Tk()
root.title("Untitled.txt") # タイトルバーに表示される文字列を指定する
x, y=644,188 # 最初のウィンドウサイズを指定する
root.geometry('%dx%d' % (x, y))
## テキスト入力エリア TextArea を作成
TextArea = tkinter.Text(root, font="メイリオ 8",wrap=tkinter.CHAR,undo=True,maxundo=0)
### wrap=tkinter.CHAR 文字単位で折り返す
### undo=True,maxundo=0 undoを有効にして、何回でもundoできる(0以下で無限)
###############
# スクロールバーの設定
## テキストエリアウィジェットに紐付ける形でスクロールバーを作成する
Scroll = tkinter.Scrollbar(TextArea)
## 右側に配置する。テキストエリア内で空きスペースが出来ないように、縦横に拡げて配置する
Scroll.pack(side=tkinter.RIGHT, fill=tkinter.BOTH)
## スクロールバーのドラッグで縦軸方向にスクロールできるようにする
Scroll.config(command=TextArea.yview)
## テキストエリアウィジェットにスクロールバーをセットする
TextArea.config(yscrollcommand=Scroll.set)
###############################
#### 各種機能を提供する関数 ####
###############################
#####################
# 最前面on/off
# 最前面に表示する関数、最前面ボタンも切り替える
def saizen_on():
root.attributes('-topmost',True), # ic(root.attributes('-topmost')) # ic| root.attributes('-topmost'): 1
button_top_on.grid_remove(),
button_top_off.grid()
# 最前面表示を解除する関数、最前面ボタンも切り替える
def saizen_off():
root.attributes('-topmost',False), # ic(root.attributes('-topmost')) # ic| root.attributes('-topmost'): 0
button_top_off.grid_remove(),
button_top_on.grid()
# キーバインドショートカットから呼び出す
def saizen_on_bind(self):
press_key=self.keysym # print(self) # <KeyPress event state=Control|0x40000 keysym=Right keycode=39 x=415 y=76>
if press_key == "Right":
saizen_on()
elif press_key == "Left":
saizen_off()
#####################
# 各ウィジェットの設定
#
# 参考
# PythonのTkinterでGUIアプリを作る - Qiita # https://qiita.com/canard0328/items/5ea096352e160b8ececa
## 最前面on/offボタン
### 最前面表示をoffにする関数を呼ぶボタン
button_top_off = tkinter.Button(root, font="meiryo 4",text = "▲",command=saizen_off)
### 最前面表示をonにする関数を呼ぶボタン
button_top_on = tkinter.Button(root,font="meiryo 4", text = "▽",command=saizen_on)
############
# gridの設定
## 最前面on/offボタン
button_top_off.grid(row=0,column=1,sticky=tkinter.E)
button_top_on.grid(row=0,column=1,sticky=tkinter.E)
## テキスト入力エリア
TextArea.grid(row=1,column=0,columnspan=2,sticky=tkinter.NSEW)
# 作成したウィンドウについて、各行列をどのように伸縮するか
root.rowconfigure(1, weight=1)
root.columnconfigure(0, weight=1)
#################
# キーバインドでショートカット実行できるようにする
## 最前面のon/offを切り替えるショートカット
root.bind_all("<Control-KeyPress-Right>", saizen_on_bind)
root.bind_all("<Control-KeyPress-Left>", saizen_on_bind)
#################
# メインループ
root.mainloop()
おわりに。ショートカット便利!
今回はメモ帳を最前面に表示する機能をショートカットから実行できるようにしました。
ショートカットで操作出来ると、さらにツール感が増して盛り上がってきますね!
今後どこかで「Ctrl+sで保存」も文書にしたいと思っています!
(保存機能がないとメモ帳として実用出来ませんね…!)