Python WX — возврат пользовательского ввода из диалогового окна wx

Я новичок в Python и WX. Я создал простой тестовый диалог, показанный ниже, который предлагает пользователю поле со списком. Я хотел бы получить значение из поля со списком в моей основной программе. Как мне вызвать его из моей основной программы?

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

    import highlight
    highlight.create(self).Show(True)
    a = highlight.OnComboBox1Combobox(self)
    print a

Имя файла диалога — «highlight». Ниже приведен код:

#Boa:Dialog:Dialog2

import wx

def create(parent):
    return Dialog2(parent)

[wxID_DIALOG2, wxID_DIALOG2COMBOBOX1, wxID_DIALOG2STATICTEXT1, 
] = [wx.NewId() for _init_ctrls in range(3)]

class Dialog2(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_DIALOG2, name='', parent=prnt,
              pos=wx.Point(264, 140), size=wx.Size(400, 485),
              style=wx.DEFAULT_DIALOG_STYLE, title='Dialog2')
        self.SetClientSize(wx.Size(384, 447))

        self.comboBox1 = wx.ComboBox(choices=['test1', 'test2'],
              id=wxID_DIALOG2COMBOBOX1, name='comboBox1', parent=self,
              pos=wx.Point(120, 16), size=wx.Size(130, 21), style=0,
              value=u'wining\n')
        self.comboBox1.SetToolTipString(u'comboBox1')
        self.comboBox1.SetLabel(u'wining\n')
        self.comboBox1.Bind(wx.EVT_COMBOBOX, self.OnComboBox1Combobox,
              id=wxID_DIALOG2COMBOBOX1)

        self.staticText1 = wx.StaticText(id=wxID_DIALOG2STATICTEXT1,
              label=u'test', name='staticText1', parent=self, pos=wx.Point(88,
              16), size=wx.Size(19, 13), style=0)

    def __init__(self, parent):
        self._init_ctrls(parent)


        ##print get_selection
        ##print get_selection1

    def OnComboBox1Combobox(self, event):
        get_selection = self.comboBox1.GetValue()
        return get_selection

person user1314011    schedule 09.05.2012    source источник


Ответы (1)


Примеров диалогов очень много. Вот пара:

По сути, все, что вам нужно сделать, это создать экземпляр вашего диалога, показать его, а затем, прежде чем закрыть его, извлечь значение. Типичный способ сделать это примерно так:

myDlg = MyDialog()
res = myDlg.ShowModal()
if res == wx.ID_OK:
    value = myDlg.myCombobox.GetValue()
myDlg.Destroy()

Обновление: вот более полный пример:

import wx

########################################################################
class MyDialog(wx.Dialog):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Dialog.__init__(self, None, title="Dialog")

        self.comboBox1 = wx.ComboBox(self, 
                                     choices=['test1', 'test2'],
                                     value="")
        okBtn = wx.Button(self, wx.ID_OK)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.comboBox1, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(okBtn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

########################################################################
class MainProgram(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Main Program")
        panel = wx.Panel(self)

        btn = wx.Button(panel, label="Open dialog")
        btn.Bind(wx.EVT_BUTTON, self.onDialog)

        self.Show()

    #----------------------------------------------------------------------
    def onDialog(self, event):
        """"""
        dlg = MyDialog()
        res = dlg.ShowModal()
        if res == wx.ID_OK:
            print dlg.comboBox1.GetValue()
        dlg.Destroy()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainProgram()
    app.MainLoop()
person Mike Driscoll    schedule 09.05.2012
comment
Майк, Спасибо за ответ. Когда я использую res = myDlg.ShowModal(), он не работает, но если я изменяю его на res ‹› myDlg.ShowModal(), он работает. Ты знаешь почему? Спасибо. - person user1314011; 09.05.2012
comment
Он должен работать. Мне нужен работающий пример и трассировка, чтобы знать, что происходит. - person Mike Driscoll; 10.05.2012
comment
было бы хорошо добавить, какой код должен быть в пользовательском диалоговом окне, а также в основном приложении. Вопрос ОП не рассматривается в примере пользовательского диалога zetcode. - person Anake; 07.08.2014