Как показано в демонстрационной версии wxPython, при вызове ShowModal () его следует использовать в операторе if:
if calObj.ShowModal() == wx.ID_OK:
Теперь, если вам нужно изменить:
def okClicked(self, event):
date = self.calend.GetDate()
print date
return date
To:
def okClicked(self, event):
self.date = self.calend.GetDate()
print self.date
return self.date
Чем ваша переменная даты будет глобальной для класса, и вы сможете получить к ней доступ через calObj изнутри фрейма, например: calObj.date
чем вы могли бы сделать что-то подобное, что позволит вам вносить изменения в TextCtrl фрейма после закрытия диалога, вместо того, чтобы перезванивать родителю: (не то, чтобы, конечно, с этим что-то не так!;)
Не проверено, но нижеприведенное должно помочь вам:
# Dialog
class Calendar(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title)
self.date = wx.DateTime_Now() #create global variable 'self.date'
vbox = wx.BoxSizer(wx.VERTICAL)
self.calend = cal.CalendarCtrl(self, -1, self.date, #from wx.DateTime_Now()
style = cal.CAL_SHOW_HOLIDAYS|cal.CAL_SEQUENTIAL_MONTH_SELECTION)
vbox.Add(self.calend, 0, wx.EXPAND | wx.ALL, 20)
vbox.Add((-1, 20))
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
btn = wx.Button(self, wx.ID_OK, 'Ok') #changed id to wx.ID_OK
cancelBtn = wx.Button(self, wx.ID_CANCEL, 'Cancel') #id to wx.ID_CANCEL
hbox2.Add(btn, 1)
hbox2.Add(cancelBtn, 1)
vbox.Add(hbox2, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 20)
btn.Bind(wx.EVT_BUTTON, self.okClicked)
cancelBtn.Bind(wx.EVT_BUTTON, self.OnQuit)
self.SetSizerAndFit(vbox)
self.Show(True)
self.Centre()
def okClicked(self, event):
self.date = self.calend.GetDate() #set global value 'date' to selection
print self.date
return self.date
#Frame function
def calClick1(self, event):
calObj = Calendar(None, -1, 'test cal')
#if you clicked ok, continue...
if calObj.ShowModal() == wx.ID_OK:
# Set the TextCtrl by calling the global variable 'calObj.date'
self.MyTextCtrl.SetValue(calObj.date)