2019年1月2日水曜日

WxPython カーソルキーのイベントに反応しない



問題点

WxPythonにて
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

def OnKeyDown(self, evt):
if evt.KeyCode == wx.WXK_LEFT:

    または
def OnKeyDown(self, evt):
keycode = evt.GetKeyCode()
if keycode == wx.WXK_LEFT:

としてもカーソルキー(矢印キー)のイベントを受け付けませんでした。



対応策

以下のようにPanelを継承するクラスのコンストラクタの引数にstyle=wx.SUNKEN_BORDER
をいれたら、カーソルキーイベントを受け付けるようになりました。
wx.ALIGN_LEFTでもOKでした。他のタイプでもだいじょうぶなのかな?
class GamePanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER)

なんで受け付けるようになったのでしょか
いろいろ検索しても原因がわかりませんでした。



styleの種類

python入門ブログ
https://python-minutes.blogspot.com/2016/04/wxpython_63.html
上サイトによると

また、スタイルを指定することで、文字列の表示位置や枠線の種類を指定することができます。
# 1.左寄せ(デフォルト)
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.ALIGN_LEFT)
# 2.中央寄せ
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.ALIGN_CENTER)
# 3.右寄せ
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.ALIGN_RIGHT)
# 4.枠線を表示
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.SIMPLE_BORDER)
# 5.二重線を表示
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.DOUBLE_BORDER)
# 6.凹んでいるように見える枠線を表示
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.SUNKEN_BORDER)
# 7.盛り上がっているように見える枠線を表示
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.RAISED_BORDER)
# 8.枠線を表示しない(デフォルト)
text1 = wx.StaticText(panel, -1, u'テキストです', style=wx.NO_BORDER)



今までの対応策

以下のサイトを参考にして、タイマーでmetaGetkeyを動作させてキーイベント
をひろっています。
Pythonでキーイベント取得(Windows)
http://shade777.blog54.fc2.com/blog-entry-579.html
LEFT = 0x25
RIGHT = 0x27
DOWN = 0x28
UP   = 0x26

def OnTimer(self, event):
self.metaGetkey()

def getkey(self, key):                 
return(bool(ctypes.windll.user32.GetAsyncKeyState(key)&0x8000))

def metaGetkey(self):                   
keycode = 0
if self.getkey(LEFT):
keycode = wx.WXK_LEFT

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts