2012-05-09 29 views
5

Jestem nowy w Pythonie i WX. Stworzyłem proste okno dialogowe testowe pokazane poniżej, które monituje użytkownika z combobox. Chciałbym uchwycić wartość z combox w moim głównym programie. Jak mogę to nazwać z mojego głównego programu?Python WX - powracające dane użytkownika z wx Dialog

To jak ja purposing to nazwać, który wyświetla okno dialogowe, ale nie w tej chwili nie uchwycić wartość z combobox:

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

Nazwa pliku dialogowe „highlight”. Poniżej znajduje się kod:

#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 

Odpowiedz

9

Istnieje wiele przykładów dialogowych. Oto kilka:

Zasadniczo, wszystko co musisz zrobić, to instancję swoje okno, pokaż je, a następnie zanim go zamknąć, ekstrakt wartość. Typowym sposobem na to jest coś takiego:

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

Aktualizacja: Oto bardziej pełnoprawnym przykład:

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() 
+0

Mike, dziękuję za odpowiedź. Kiedy używam res = myDlg.ShowModal() to nie działa, ale jeśli zmienię go na res <> myDlg.ShowModal(), to działa. Wiesz dlaczego? Dzięki. – user1314011

+0

Powinno działać. Potrzebuję działającego przykładu i traceback, żeby wiedzieć, co się dzieje. –

+0

byłoby dobrze dodać, jaki kod musi znajdować się w niestandardowym oknie dialogowym, jak również w głównej aplikacji. Pytanie OP nie jest objęte przykładowym oknem dialogowym zetcode – Anake

Powiązane problemy