从wxPython Frame返回值

Mri*_*lla 7 python wxpython

有人能告诉我如何从wxPython框架返回值吗?当用户点击关闭时,我会弹出一个消息对话框,询问他一个问题.我想将此消息对话框的返回码返回给我的调用函数.

谢谢

Dav*_*rom 5

因为wxFrame具有通过app.MainLoop()函数处理的事件,所以获取wx.Frame()的返回值的唯一方法是通过捕获事件.

处理事件的标准做法通常来自于从wx.Window本身派生的类(例如,Frame,Panel等).由于您希望wx.Frame外部的代码接收在处理OnClose()事件时收集的信息,因此最好的方法是为您的帧注册事件处理程序.

wx.Window :: PushEventHandler的文档可能是最好的资源,甚至wxpython wiki也有一篇关于如何执行此操作的精彩文章.在文章中,他们注册了一个自定义处理程序,它是"MouseDownTracker"的一个实例.您不希望在PushEventHandler调用中进行实例化,而是希望在调用之前对其进行实例化,以便您可以保留EventHandler派生类的句柄.这样,您可以在销毁Frame之后检查派生的EventHandler类变量,或者甚至允许派生类为您执行特殊操作.

这是来自wx python wiki的代码的改编(由于需要使用"调用"函数处理自定义事件的结果,因此有点令人费解):

import sys
import wx
import wx.lib.newevent

(MyCustomEvent, EVT_CUSTOM) = wx.lib.newevent.NewEvent()

class CustomEventTracker(wx.EvtHandler):
 def __init__(self, log, processingCodeFunctionHandle):
  wx.EvtHandler.__init__(self)
  self.processingCodeFunctionHandle = processingCodeFunctionHandle
  self.log = log
  EVT_CUSTOM(self, self.MyCustomEventHandler)

 def MyCustomEventHandler(self, evt):
  self.log.write(evt.resultOfDialog + '\n')
  self.processingCodeFunctionHandle(evt.resultOfDialog)
  evt.Skip()

class MyPanel2(wx.Panel):
 def __init__(self, parent, log):
  wx.Panel.__init__(self, parent)
  self.log = log

 def OnResults(self, resultData):
  self.log.write("Result data gathered: %s" % resultData)

class MyFrame(wx.Frame):
 def __init__(self, parent, ID = -1, title = "", pos = wx.DefaultPosition,
     size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE):
  wx.Frame.__init__(self, parent, ID, title, pos, size, style)
  self.panel = panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL
       | wx.CLIP_CHILDREN
       | wx.FULL_REPAINT_ON_RESIZE)
  sizer = wx.BoxSizer(wx.VERTICAL)
  sizer.Add((25, 25))

  row = wx.BoxSizer(wx.HORIZONTAL)
  row.Add((25,1))
  m_close = wx.Button(self.panel, wx.ID_CLOSE, "Close")
  m_close.Bind(wx.EVT_BUTTON, self.OnClose)
  row.Add(m_close, 0, wx.ALL, 10)
  sizer.Add(row)
  self.panel.SetSizer(sizer)

 def OnClose(self, evt):
  dlg = wx.MessageDialog(self, 
   "Do you really want to close this frame?",
   "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
  result = dlg.ShowModal()
  dlg.Destroy()
  if result == wx.ID_CANCEL:
   event = MyCustomEvent(resultOfDialog = "User Clicked CANCEL")
   self.GetEventHandler().ProcessEvent(event)
  else: # result == wx.ID_OK
   event = MyCustomEvent(resultOfDialog = "User Clicked OK")
   self.GetEventHandler().ProcessEvent(event)
   self.Destroy()

app = wx.App(False)
f2 = wx.Frame(None, title="Frame 1 (for feedback)", size=(400, 350))
p2 = MyPanel2(f2, sys.stdout)
f2.Show()
eventTrackerHandle = CustomEventTracker(sys.stdout, p2.OnResults)
f1 = MyFrame(None, title="PushEventHandler Tester (deals with on close event)", size=(400, 350))
f1.PushEventHandler(eventTrackerHandle)
f1.Show()
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)