Who's to blame?
kyosohma at gmail.com
kyosohma at gmail.com
Thu Jan 3 14:19:18 EST 2008
On Jan 3, 8:48 am, Nicola Musatti <nicola.musa... at gmail.com> 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
More information about the Python-list
mailing list