Возвращаемое значение от Кадра wxPython

Кто-то мог показать мне, как я мог возвратить значение от Кадра wxPython? Когда использование нажимает близко, я открываю диалоговое окно сообщения, задавая ему вопрос. Я хотел бы возвратить код возврата этого диалогового окна сообщения к моей функции вызова.

Спасибо

7
задан Mridang Agarwalla 22 May 2010 в 18:27
поделиться

5 ответов

Потому что wxFrame имеет события, которые обрабатываются через приложение. Функциональность MainLoop(), единственный способ получить возвращаемое значение wx. Frame() — это перехват события.

Стандартная практика обработки событий обычно происходит внутри класса, производного от wx. Само окно (например, рама, панель и т.д.). Так как вы хотите код внешний для wx. Кадр для получения информации, которая была собрана при обработке события OnClose(), то лучший способ сделать это — зарегистрировать обработчик событий для вашего фрейма.

Документация для wx. Window::P ushEventHandler, вероятно, лучший ресурс, и даже в wxpython wiki есть отличная статья о том, как это сделать. В статье они регистрируют пользовательский обработчик, который является экземпляром "MouseDownTracker". Вместо создания экземпляра в вызове PushEventHandler, необходимо создать его экземпляр перед вызовом, чтобы можно было сохранить дескриптор производного класса EventHandler. Таким образом, вы можете проверить производные переменные класса EventHandler после уничтожения Frame или даже позволить этому производному классу делать специальные вещи за вас.

Вот адаптация этого кода из вики wx python (по общему признанию, немного запутанная из-за требования обработки результатов пользовательского события с функцией «вызова»)

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()
5
ответ дан 6 December 2019 в 23:01
поделиться

Вы можете получить результат, нажав кнопки OK, CANCEL из метода Dialog ShowModal.
Данное диалоговое окно является экземпляром одного из классов диалогового окна wxPython:

result = dialog.ShowModal()
if result == wx.ID_OK:
    print "OK"
else:
    print "Cancel"
dialog.Destroy()
2
ответ дан 6 December 2019 в 23:01
поделиться

Проверьте этот ответ на comp.lang.python: Linkie

0
ответ дан 6 December 2019 в 23:01
поделиться

Я не думаю, что wxFrame может возвращать значение, поскольку оно не является модальным. Если вам не нужно использовать wxFrame, вам может подойти модальный диалог. Если вам действительно нужен фрейм, я бы подумал об использовании настраиваемого события.

Это будет примерно так: (1) Пользователь нажимает, чтобы закрыть wxFrame (2) Вы переопределяете OnClose (или что-то в этом роде), чтобы открыть диалоговое окно, чтобы задать пользователю вопрос. (3) Создайте и опубликуйте настраиваемое событие. (4) Закройте wxFrame (5) Другой код обрабатывает ваше настраиваемое событие

.
0
ответ дан 6 December 2019 в 23:01
поделиться

Думаю, у меня была такая же проблема, как и у вас. Вместо того, чтобы сделать это всплывающее окно рамкой, я сделал его диалогом. Я создал настраиваемый диалог, унаследовав wx.dialog вместо wx.frame. Затем вы можете использовать код, который Хоакин разместил выше. Вы проверяете возвращаемое значение диалогового окна, чтобы увидеть, что было введено. Это можно сделать, сохранив значение textctrl, когда пользователь нажимает кнопку ОК, в локальной переменной. Тогда, прежде чем он будет уничтожен, вы каким-то образом получите это значение.

Раздел настраиваемых диалогов на этом сайте очень мне помог. http://zetcode.com/wxpython/dialogs/

0
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: