【问题标题】:Returning values from event handler function wxPython从事件处理函数 wxPython 返回值
【发布时间】:2015-08-03 19:13:05
【问题描述】:

所以在普通的 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 但它们并没有真正解决我想在这里做的事情

【问题讨论】:

  • 我问是因为你不能真正调用这些事件处理函数之一,除非你将它们绑定到一个按钮,如果一个程序要调用这个函数,除非它也将其绑定到一个按钮。
  • 你能提供更多的上下文吗?想要这样做的用例是什么?
  • @JHarris 好吧,也许我只是没有正确地给出下面 Dalen 的答案,但重点是能够以变量形式从事件处理程序中获取信息,重点是如果您修改了由事件触发的某些内容(例如按下了切换按钮,并且我将该处理程序中的变量设置为 True)并且我想取回已修改的内容(所以我想知道该变量是否为 True与否)然后在某个其他功能中使用它来休闲(比如更改该按钮的背景颜色)
  • 我知道我上面所说的可以以更好的方式完成(而且一直如此),但我只是用它作为一个简单的例子。

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


【解决方案1】:

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

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

pos = OnClick()

而且,从事件处理程序返回值没有意义。返回值可能仅向调用者指示某些内容。 例如,如果处理程序返回 True,则某些事情正在继续,如果 False,则进程停止。

只有当事件被触发时才会调用处理程序,无论是通过 GUI 输入还是您可以手动发布事件,从而模拟它。

您在答案中写的是从事件处理程序中传递值的方式。就是这样完成的。

没有“从事件处理程序返回值”。

也许,但只是也许,某处存在一个事件驱动系统,将返回值存储到堆栈或某处供您稍后获取。 WX 不这样做。

【讨论】:

    【解决方案2】:

    好的,所以这不是问题的真正答案,因为它不处理返回值,但它完成了几乎相同的事情。

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

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多