今回は、wxPythonでホットキーを使う方法をご紹介します。
ホットキーはショートカットキーとも呼ばれるもので、特定のキー入力に指定の処理などを関連づけるものです。
Windowsで言えば、[Ctrl] + [c]のコピー、 [Ctrl] + [v]の貼り付けが有名ですね。
wxPythonでは、以前ご紹介したwx.Menubarにショートカットキーを設定する方法はよく紹介されていますが、今回の記事はそれとは違い、メニューバーは関係なく、アプリケーションにホットキーを設定します。
例えば、「アプリケーションを起動中に[Ctrl] + [z]を入力すると、メッセージボックスが表示される」というような動作を実現します。
環境
- macOS Sierra 10.12.5
- python 3.4
- wxPython 4.0.0a3
スクリプト
# -*- coding: UTF-8 -*-
import wx
class App(wx.Frame):
""" GUI """
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(300, 300))
# キーの設定
self.RegisterHotKey(1234, wx.MOD_ALT, ord('z')) # Windows向け
#self.RegisterHotKey(1234, wx.MOD_CMD, ord('z')) # macOS X向け
# ホットキーイベントハンドラ
self.Bind(wx.EVT_HOTKEY, self.callhotkey)
p = wx.Panel(self, wx.ID_ANY)
l = wx.StaticText(p, wx.ID_ANY, 'ホットキーのテスト')
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(l, flag=wx.ALL, border=10)
p.SetSizer(layout)
self.Show()
def callhotkey(self, event):
""" ホットキーイベント """
dialog = wx.MessageDialog(self,'ホットキーを検知しました', '検知')
dialog.ShowModal()
dialog.Destroy()
if __name__ == "__main__":
app = wx.App()
App(None, wx.ID_ANY, 'ホットキー')
app.MainLoop()
実行結果
設定したホットキーを入力するとメッセージボックスが表示されます。
解説
ホットキーを設定するには、Frameに対してRegisterHotKeyメソッドを指定します。
さらに、ホットキーが入力された時のイベントハンドラを指定しておきます。
# キーの設定
self.RegisterHotKey(1234, wx.MOD_ALT, ord('z')) # Windows向け
# ホットキーイベントハンドラ
self.Bind(wx.EVT_HOTKEY, self.callhotkey)
引数は(ホットキーID、修飾キー、仮想キー)です。ホットキーIDは任意の数値でOKです。
修飾キーは必須で、次の中から指定します。
- wx.MOD_ALT : Altキー (Windowsのみ対応)
- wx.MOD_CONTROL : Ctrlキー (Windowsのみ対応)
- wx.MOD_SHIFT : Shiftキー (両対応)
- wx.MOD_WIN : Windowsキー (Windowsのみ対応)
- wx.MOD_CMD : commandキー (macOSのみ対応)
仮装キーはキーコード(数値)で指定する、wx.KeyCodeで指定する、ordで指定する、などの方法があります。
1.キーコード(数値)で指定する方法
それぞれのキーにはキーコードが設定されています。
(Windowsの)Enterキーは13、スペースキーは32といった具合です。
参考:Windows→キーコード一覧
参考:macOS →キーコード一覧
<例>
# Altキー + zキー
self.RegisterHotKey(1234, wx.MOD_ALT, 90) # Windows向け
2.wx.KeyCodeで指定する
wxPythonであらかじめ定義してある定数名で指定する方法です。
ただし、通常キー(Aキーや数字キー)は未定義のようです。
詳細はwx.KeyCodeをご覧ください。
<例>
# Altキー + ↑キー
self.RegisterHotKey(1234, wx.MOD_ALT, wx.WXK_UP) # Windows向け
3.ordで指定する
ord関数は指定した文字列のASCIIコードを返します。
アルファベットと数値は、キーコードとASCIIコードが大体同じ(例外もある)なので、わざわざキーコードを調べなくてもホットキーを設定することができます。
<例>
# Altキー + zキー
self.RegisterHotKey(1234, wx.MOD_ALT, ord('z')) # Windows向け
おまけ
設定しているホットキーを解除するには次のように記述します。
# ホットキー解除
self.UnregisterHotKey(1234)
引数は(ホットキーID)です。まとめ
メニューバーで使用されるショートカットキーはアプリケーションがアクティブ状態でないと動作しませんが、今回ご紹介したホットキーは、非アクティブであっても動作します。
例えば「アプリケーション実行時はFrameをShow()せず、ホットキーが入力された時にShow()する」というような使い方も可能です。
タスクトレイ常駐型のアプリケーションなんかと相性が良さそうですね。
0 件のコメント:
コメントを投稿