Есть несколько способов сделать это, но чтобы сделать наименьшее количество изменений в вашем коде,
Изменить def start(parent):
на
def start(parent, evt):
И изменить button.Bind(wx.EVT_BUTTON, MyDialog.start(self))
на
button.Bind(wx.EVT_BUTTON, lambda evt: MyDialog.start(self, evt))
То есть вторым аргументом в Bind должна быть функция, которая принимает и событие, и вам нужно создать диалоговое окно при нажатии кнопки. lambda
делает эту функцию также принимающей parent и evt (вы также можете использовать functools.partial для версии> 2.5), а затем при нажатии кнопки будет вызываться start
для создания диалога.
Я не совсем уверен, что происходит в вашем коде, но кажется, что вы вызываете start
и создаете диалог при первоначальном вызове Bind, а затем передаете возвращаемое значение из начала, None
связать.
Примечание 1
Более подробно, причина использования лямбды здесь заключается в том, что Bind должен иметь форму, такую как Bind(event, handler)
, где event
- это wx.PyEventBinder, как wx.EVT_BUTTON, а handler
- это функция как foo (evt), где evt - это wx.Event или wx.CommandEvent. (Здесь нет рекурсии, так как вы просто говорите, что делать, когда что-то происходит, но это еще не произошло, поэтому событие не было создано. Когда событие произойдет, оно будет представлено как wx .Event, который будет содержать информацию о событии, например, где была мышь при нажатии и т. Д.)
Примечание 2
В своем ответе я попытался ответить на ваш вопрос с минимальными изменениями, так как думал, что это будет проще всего. Возможно, приведенный ниже код более понятен (и, возможно, обычно проще обрабатывать события внутри виджета, который их создает):
def start2(parent):
inputbox = wx.SingleChoiceDialog(parent,'Choose Fruit', 'Selection Title',
['apple','banana','orange','papaya'])
if inputbox.ShowModal()==wx.ID_OK:
answer = inputbox.GetStringSelection()
inputbox.Destroy()
class TopLevelFrame2(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,"Test",size=(300,200))
panel=wx.Panel(self)
button=wx.Button(panel, label='Show Dialog', pos=(130,20), size=(60,20))
# Bind EVENTS --> HANDLERS.
button.Bind(wx.EVT_BUTTON, self.OnClick)
def OnClick(self, evt):
start2(self)