On Jan 3, 8:48 am, Nicola Musatti <[EMAIL PROTECTED]> wrote: > Hallo, > First of all I apologize for the longish example at the bottom, but > the biggest source file is automatically generated and I didn't want > to modify more than strictly necessary. Also, it would be shorter if > XML wasn't so verbose ;-) > > The following is a wxPython/XRC toy program with a form with a button > which, when pressed, causes a simple dialog to be displayed. The > problem lies in the fact that apparently ShowModal() does not return > when either the Yes or the No buttons are pressed. Curiously, if you > change the Yes and No buttons with the OK and Cancel ones that are > currently commented everything works as expected. > > As the sbs_test_xrc.py file below is automatically generated by > wxPython 2.8.6.1's XRCed tool from a XRC file which in turn is > generated by wxFormBuilder (http://wxformbuilder.org/), I really cant > figure out to whom I should report this problem, assuming I'm not > missing some obvious mistake of mine, that is. > > Thanks for your help. > > Cheers, > Nicola Musatti > > # sbs_test.py > import wx > import sbs_test_xrc > > class MainFrame(sbs_test_xrc.xrcMainFrame): > def __init__(self, parent): > sbs_test_xrc.xrcMainFrame.__init__(self, parent) > self.button.Bind(wx.EVT_BUTTON, self.OnButton) > > def OnButton(self, event=None): > d = sbs_test_xrc.xrcDialog(self) > ## if d.ShowModal() == wx.ID_OK: > if d.ShowModal() == wx.ID_YES: > self.Close() > > class Application(wx.App): > def OnInit(self): > self.frame = MainFrame(None) > self.frame.Show() > self.SetTopWindow(self.frame) > return True > > if __name__ == '__main__': > app = Application() > app.MainLoop() > > # sbs_test_xrc.py > # This file was automatically generated by pywxrc, do not edit by > hand. > # -*- coding: UTF-8 -*- > > import wx > import wx.xrc as xrc > > __res = None > > def get_resources(): > """ This function provides access to the XML resources in this > module.""" > global __res > if __res == None: > __init_resources() > return __res > > class xrcDialog(wx.Dialog): > def PreCreate(self, pre): > """ This function is called during the class's initialization. > > Override it for custom setup before the window is created > usually to > set additional window styles using SetWindowStyle() and > SetExtraStyle().""" > pass > > def __init__(self, parent): > # Two stage creation > (seehttp://wiki.wxpython.org/index.cgi/TwoStageCreation) > pre = wx.PreDialog() > self.PreCreate(pre) > get_resources().LoadOnDialog(pre, parent, "Dialog") > self.PostCreate(pre) > > # create attributes for the named items in this container > self.wxID_YES = xrc.XRCCTRL(self, "wxID_YES") > self.wxID_NO = xrc.XRCCTRL(self, "wxID_NO") > > class xrcMainFrame(wx.Frame): > def PreCreate(self, pre): > """ This function is called during the class's initialization. > > Override it for custom setup before the window is created > usually to > set additional window styles using SetWindowStyle() and > SetExtraStyle().""" > pass > > def __init__(self, parent): > # Two stage creation > (seehttp://wiki.wxpython.org/index.cgi/TwoStageCreation) > pre = wx.PreFrame() > self.PreCreate(pre) > get_resources().LoadOnFrame(pre, parent, "MainFrame") > self.PostCreate(pre) > > # create attributes for the named items in this container > self.button = xrc.XRCCTRL(self, "button") > > # ------------------------ Resource data ---------------------- > > def __init_resources(): > global __res > __res = xrc.EmptyXmlResource() > > wx.FileSystem.AddHandler(wx.MemoryFSHandler()) > > sbs_test_xrc = '''\ > <?xml version="1.0" ?><resource version="2.3.0.1" > xmlns="http://www.wxwindows.org/wxxrc"> > <object class="wxDialog" name="Dialog"> > <style>wxDEFAULT_DIALOG_STYLE</style> > <title/> > <object class="wxFlexGridSizer"> > <rows>2</rows> > <cols>2</cols> > <vgap>0</vgap> > <hgap>0</hgap> > <growablecols/> > <growablerows/> > <object class="sizeritem"> > <option>1</option> > <flag>wxEXPAND</flag> > <border>5</border> > <object class="wxStdDialogButtonSizer"> > <object class="button"> > > <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag> > <border>5</border> > <!-- > <object class="wxButton" > name="wxID_OK"> > <label>&OK</label> > </object> > --> > <object class="wxButton" > name="wxID_YES"> > > <label>&Yes</label> > </object> > </object> > <object class="button"> > > <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag> > <border>5</border> > <!-- > <object class="wxButton" > name="wxID_CANCEL"> > > <label>&Cancel</label> > </object> > --> > <object class="wxButton" > name="wxID_NO"> > <label>&No</label> > </object> > </object> > </object> > </object> > </object> > </object> > <object class="wxFrame" name="MainFrame"> > <style>wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL</style> > <size>500,300</size> > <title/> > <object class="wxButton" name="button"> > <label>MyButton</label> > <default>0</default> > </object> > </object> > </resource>''' > > wx.MemoryFSHandler.AddFile('XRC/sbs_test/sbs_test_xrc', > sbs_test_xrc) > __res.Load('memory:XRC/sbs_test/sbs_test_xrc')
Nicola, I've never created a modal dialog like this. Instead, I follow the wxPython in Action book examples (most of the time), which would do a yes/no dialog like this: <code> dlg = wx.MessageDialog(None, 'Some Message', 'A Message Box', wx.YES_NO | wx.QUESTION) retCode = dlg.ShowModal() if retCode == wx.ID_YES: # do something print 'yes' else: # do something else print 'no' dlg.Destroy() </code> And I agree with Rob...there is a wxPython user's group, which is a more appropriate place to post these types of questions. The Python group will help all they can though. Mike -- http://mail.python.org/mailman/listinfo/python-list