обработка событий wxpython между несколькими классами - PullRequest
0 голосов
/ 19 марта 2011

У меня есть два класса в wxpython, класс wx.Frame и класс wx.Dialog (календарь)

Мой календарь выглядит так:

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 на возвращаемую дату в классе диалогового окна календаря?

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

В calClick1 создайте экземпляр Calendar с self в качестве родителя:

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

В классе Calendar добавьте что-то вроде: self.parent = parent после wx.Dialog.__init__(...). Теперь вы можете получить доступ к атрибутам кадра в календаре. Пример:

Если в классе Frame есть что-то вроде:

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

Вы можете изменить это в методе okClicked класса Calendar:

self.parent.txt.SetValue('some new string value')
1 голос
/ 30 марта 2011

Как показано в демонстрационной версии 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...