免责声明: 也许我做错了,但我只用 wxpython 进行 GUI 开发大约 24 小时。所以一般的建议是值得赞赏的。
目标: 我正在尝试通过制作一个简单的屏幕保护程序来熟悉 wxpython。
问题: 我试图绑定鼠标移动和键盘移动(也就是试图捕获任何用户输入),因此它会在事件发生时销毁()应用程序(典型的屏幕保护程序行为)。到目前为止,我的鼠标事件被捕获并正确销毁,但我的键盘事件没有(我可能会在我的键盘上敲击!)。正如其他 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()
到目前为止所做的研究: 也许我错过了一些东西,但这里没有什么对我来说很突出。