0

免責事項: おそらく私はこれを間違って行ったのですが、wxpython を使用して GUI 開発を開始してから約 24 時間しか経っていません。したがって、一般的なアドバイスをいただければ幸いです。

目標: 簡単なスクリーン セーバーを作成することで、wxpython に慣れようとしています。

問題: マウスの動きとキーボードの動きの両方をバインドしようとしている (ユーザー入力をキャプチャしようとしている) ため、イベント時にアプリを Destroys() します (典型的なスクリーンセーバーの動作)。これまでのところ、マウス イベントはキャプチャされ、適切に破棄されますが、キーボード イベントはそうではありません (思いっきりキーボードを叩いてください!)。他のSOの投稿が推奨しているように、EVT_CHARとCHAR_HOOKを試しました。私は自分のフォーカスがどこにあるかを確認することさえしました-これは私の問題だと思います(行にself.SetFocus()があることに注意してください-これを削除してマウスを動かすと、返された「self.FindFocus( )" マウス移動イベントによってトリガーされたものは None を返します... SetFocus() を使用すると、私のクラスの SpaceFrame が返されます)。

質問: キー ストロークをキャプチャして、keyboardMovement() メソッドをアクティブ化できないのはなぜですか? 興味深いことに、ここの例は、キーボード イベントのダウン/アップに対してうまく機能します。だから私は100%それはユーザーエラーです.

import wx
import random

MAX_INVADERS = 10
INVADERS_COLORS = ["yellow_invader",
                   "green_invader",
                   "blue_invader",
                   "red_invader"]


class SpaceFrame(wx.Frame):
    def __init__(self):
        """
        The generic subclassed Frame/"space" window.  All of the invaders fall
        into this frame.  All animation happens here as the parent window
        as well.
        """
        wx.Frame.__init__(self, None, wx.ID_ANY, "Space Invaders", pos=(0, 0))
        self.SetFocus()
        self.Bind(wx.EVT_MOTION, self.mouseMovement)
        self.Bind(wx.EVT_CHAR_HOOK, self.keyboardMovement)
        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour('black')
        self.SetBackgroundColour('black')
        self.monitorSize = wx.GetDisplaySize()
        for invader in range(0, MAX_INVADERS, 1):
            randX = random.randint(0, self.monitorSize[0])
            self.showInvader(coords=(randX, 0),
                             invader=random.choice(INVADERS_COLORS),
                             scale=(random.randint(2, 10)/100.0))

    def mouseMovement(self, event, *args):
        print self.FindFocus()

    def keyboardMovement(self, event, *args):
        self.Destroy()

    def showInvader(self, coords=(0, 0), invader="green_invader", scale=.05):
        """
        Displays an invader on the screen
        """
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.dropInvader, self.timer)
        self.timer.Start(1000)
        self.invader = wx.Bitmap("{0}.png".format(invader))
        self.invader = wx.ImageFromBitmap(self.invader)
        self.invader = self.invader.Scale((self.invader.GetWidth()*scale),
                                          (self.invader.GetHeight()*scale),
                                          wx.IMAGE_QUALITY_HIGH)
        self.result = wx.BitmapFromImage(self.invader)
        self.control = wx.StaticBitmap(self, -1, self.result)
        self.control.SetPosition(coords)
        self.panel.Show(True)

    def moveInvader(self, coords):
        self.control.SetPosition(coords)

    def dropInvader(self, *args):
        # print "this hit"
        self.control.SetPosition((100, 600))

if __name__ == "__main__":
    application = wx.PySimpleApp()
    window = SpaceFrame()
    window.ShowFullScreen(True, style=wx.FULLSCREEN_ALL)
    application.MainLoop()

これまでに行われた調査: 何かを見逃したのかもしれませんが、ここでは特に目立ったものはありませんでした。

  • Source1 - マウスと Python の例
  • Source2 - SO 同様の問題 (ただし、正確には私の解決策ではありません)
  • ソース 3 - WXpythonフォーラム/メーリング リスト
  • Source4 - WXpython フォーラム/メーリング リスト
4

0 に答える 0