Закрытие wx.Dialog из обработчика событий на панели, нажав кнопку в другом классе - PullRequest
0 голосов
/ 28 апреля 2018

Я не могу получить события кнопок (Save, Close) в следующем классе ButtonsPanel для запуска их обработчиков событий в классе AddModFormContractors.

Следующая команда:

pnlButtons = ButtonsPanel(parent=self.frm_pnl)

передает PANEL в качестве родителя для ButtonsPanel, и это приводит к сбою привязки во время выполнения, если я связываюсь с "parent.onClose". Попытка передать только «себя» вообще ничего не делает на кадре. Запуск его, как показано в коде ниже, вызывает исключение, что в onClose отсутствует второй аргумент (событие).

Как мне заставить это работать, пожалуйста?

class ButtonsPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        btnSizer = wx.BoxSizer(wx.HORIZONTAL)

        okBtn = wx.Button(self, label="Save")
        okBtn.Bind(wx.EVT_BUTTON, AddModFormContractors.onSaveRecord)
        btnSizer.Add(okBtn, 0, wx.ALL, 5)
        cancelBtn = wx.Button(self, label="Close")
        cancelBtn.Bind(wx.EVT_BUTTON, AddModFormContractors.onClose)
        btnSizer.Add(cancelBtn, 0, wx.ALL, 5)

        self.SetSizer(btnSizer)
        self.Layout()



class AddModFormContractors(wx.Dialog):

    def __init__(self, targetObject, row=None, titlePrefix="Add", titleLabel="Record", addRecord=True):

        wx.Dialog.__init__(self, None, title="{} {}".format(titlePrefix, titleLabel), size=(730, -1))

        self.targetObject = targetObject
        self.addRecord = addRecord
        self.selectedRow = row

        ... DOING RECORD STUFF HERE ...

        #Construct the form
        self.frm_pnl = wx.Panel(self)
        self.frm_pnl.BackgroundColour = (235, 230, 220)  # BEIGE

        font = wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD)
        lbl = wx.StaticText(self.frm_pnl, label="{} {}".format(titlePrefix, titleLabel))
        lbl.SetFont(font)

        pnlCompany = CompanyPanel(parent=self.frm_pnl, record=recordToUpdate)
        pnlRecord = RecordPanel(parent=self.frm_pnl, record=recordToUpdate)
        pnlButtons = ButtonsPanel(parent=self.frm_pnl)

        self.frmPnl_vertSizer = wx.BoxSizer(wx.VERTICAL)

        ... BUILDING THE SIZER HERE ...

        self.frmPnl_vertSizer.Layout()
        self.frm_pnl.SetSizer(self.frmPnl_vertSizer)


        wx.CallAfter(self.SetFrameSize)

    def onClose(self, event):

        print("Closing")
        self.Destroy()


    def onSaveRecord(self, event=None):
        if self.Validate():
            if self.addRecord:
                dictRecordValues = getValuesFromForm(self, self.olv_dict)
                forms_controller.insertRecord(self.targetObject, dictRecordValues)
            else:
                dictRecordValues = getValuesFromForm(self, self.olv_dict, False)
                forms_controller.updateRecordById(self.targetObject, self.recordId, dictRecordValues)
            # self.titleTxt.SetFocus()

            self.Destroy()

1 Ответ

0 голосов
/ 29 апреля 2018

В итоге я передал объект класса обработчика событий в качестве аргумента контейнеру, содержащему кнопки (buttonsPanel), и там я мог ссылаться на обработчик событий в родительском фрейме. Имя аргумента, переданное здесь, является dialogFrame:

class ButtonsPanel(wx.Panel):
    """ Just a button panel """

    def __init__(self, parent, dialogFrame):
        wx.Panel.__init__(self, parent)
        self.parent = parent
        self.dialogFrame = dialogFrame

        """
        Since the events affect another class frame(dialog), we pass the dialogFrame to this function.
        We demonstrate two binding/invokation ways here:
        okBtn - biding to the handler in dialogFrame class.
        cancelBtn - binding to this class handler, closing the frame by referencing frameDialog
        """

        btnSizer = wx.BoxSizer(wx.HORIZONTAL)

        okBtn = wx.Button(self, label="Save")
        okBtn.Bind(wx.EVT_BUTTON, self.dialogFrame.onSaveRecord)
        btnSizer.Add(okBtn, 0, wx.ALL, 5)
        self.cancelBtn = wx.Button(self, label="Close")
        self.Bind(wx.EVT_BUTTON, self.onClose)
        btnSizer.Add(self.cancelBtn, 0, wx.ALL, 5)

        self.SetSizer(btnSizer)
        self.Layout()

    def onClose(self, event):
        """
        Cancel the dialog
        """
        print("Closing")
        self.dialogFrame.Destroy()
...