2011-03-19 35 views
0

我在wxPython中,wx.Frame類和的wx.Dialog(日曆對話)班兩個班之間處理wxPython的事件多類

我的日曆對話是這樣的:

class Calendar(wx.Dialog): 
    def __init__(self, parent, id, title): 
     wx.Dialog.__init__(self, parent, id, title) 

     vbox = wx.BoxSizer(wx.VERTICAL) 

     self.calend = cal.CalendarCtrl(self, -1, 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, -1, 'Ok') 
     cancelBtn = wx.Button(self, -1, '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): 
     date = self.calend.GetDate() 
     print date 
     return date 

而且我所說的日曆對話從我的框架類,像這樣

def calClick1(self, event): 
    calObj = Calendar(None, -1, 'test cal') 
    calObj.ShowModal() 
    #here i want to set the returned date to a wx.TextCtrl 

如何設置一個TextCtrl框的值在我wx.Frame類在日曆對話框類返回的日期?

回答

1

如wxPython的演示證明,當你調用的ShowModal()應該在if語句中使用:

if calObj.ShowModal() == wx.ID_OK: 

現在,如果你是牛逼Ø變化:

def okClicked(self, event): 
    date = self.calend.GetDate() 
    print date 
    return date 

要:

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) 
2

在calClick1使日曆的實例與自我父:wx.Dialog.__init__(...)self.parent = parent

calObj = Calendar(self, -1, 'test cal') 

在Calendar類添加的東西等等。 現在您可以在日曆中訪問框架的屬性。例如:

如果您在Frame類像有:

self.txt = wx.TextCtrl(self, -1, 'sample txt') 

您可以在方法改變它okClicked類日曆:

self.parent.txt.SetValue('some new string value')