从事件处理函数wxPython返回值

时间:2015-08-03 19:13:05

标签: python event-handling wxpython return-value keyboard-events

所以在普通的python脚本中你可以这样做:

def func():
    i = 1
    return i
i = func()

一般来说,另一个python程序可以导入包含它的文件,只需在程序中说i = func(),它们就会得到i的值。

现在我想做类似的事情,但我需要在用户按下按钮或从GUI激活事件处理程序时执行此操作。类似的东西:

import wx

class MyForm(wx.Frame):

    def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY, "Pressing dem keyz")

            # Add a panel so it looks the correct on all platforms
            panel = wx.Panel(self, wx.ID_ANY)
            self.btn = wx.ToggleButton(panel, label="TOGGLE")
            self.btn2 = wx.ToggleButton(panel, label="TOGGLE 2", pos = (85,0))

            self.btn.Bind(wx.EVT_CHAR_HOOK, self.onKeyPress)
            self.btn2.Bind(wx.EVT_CHAR_HOOK, self.onKeyPress)

    def onKeyPress(self, event):
            space = False
            keycode = event.GetKeyCode()
            print keycode
            if keycode == ord(' '): 
                    print "SPACEBAR!"
                    space = True
            self.btn.SetValue(space)

            if space == True:
                    print "Lemme return i please"
                    i = 1
                    print i
                    return i #ALSO PART OF WHAT I WANT TO DO
            elif keycode == wx.WXK_RETURN:
                    self.btn
            elif keycode == wx.WXK_LEFT:
                    self.btn2
                    print 'YOU MOVED LEFT'
            elif keycode == wx.WXK_RIGHT:
                    self.btn
                    print 'YOU MOVED RIGHT'
            elif keycode == wx.WXK_UP:
                    print 'YOU MOVED UP'
            elif keycode == wx.WXK_DOWN:
                    print 'YOU MOVED DOWN'
            elif keycode == wx.WXK_ESCAPE:
                  self.Destroy()
    #NOW HERE'S THE PART THAT I WANT TO IMPLEMENT
    return keycode 
    #I do not need the keycode necessarily but I want to do something similar to this along with the |return i| above

# Run the program
if __name__ == "__main__":
        app = wx.App(False)
        frame = MyForm()
        frame.Show()
        app.MainLoop()

我查看了这些Call functions from within a wxPython event handlerReturn value from wxpython main frame,但它们并没有真正解决我想要做的事情

2 个答案:

答案 0 :(得分:1)

是的,你可以独立调用事件处理程序,为什么不呢?

def OnClick (self, event=None):
    if event==None: return self.LastMousePosition
    self.LastMousePosition = event.GetMousePosition()

pos = OnClick()

并且,从事件处理程序返回值没有意义。返回值可能仅向呼叫者指示某些内容。 例如,如果handler返回True,则某些内容继续,如果为False,则进程停止。

只有在通过GUI输入触发事件时才会调用处理程序,或者您可以手动发布事件,从而模拟它。

您在答案中所写的内容是将值传递出事件处理程序的方式。这就是它的完成方式。

事件处理程序没有"返回值"。

也许,但只是可能,某个地方存在一个事件驱动系统,它将返回值存储到堆栈或某个地方,以便您以后再将其选中。 WX没有这样做。

答案 1 :(得分:0)

好的,所以这不是问题的答案,因为它没有解决返回值,但它完成了同样的事情。

因此,您想要返回的值可以使用self(例如self.i)设置为类范围的功能,并且为了访问它,您可以在创建MyForm对象后说出frame.i如果名称 =='主要'阻止并将其分配给外部变量(即i = frame.i)。