リンク

2017年6月28日水曜日

wxPythonでホットキーを使う


今回は、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 件のコメント:

コメントを投稿