Python and Glade: window not showing

Sven Arduwie sven.arduwie at gmail.com
Sat May 30 15:16:47 EDT 2009


On 30 mei, 21:02, Dave Angel <da... at ieee.org> wrote:
> Sven Arduwie wrote:
> > On 30 mei, 17:02, Sven Arduwie <sven.ardu... at gmail.com> wrote:
>
> >> Can anyone help a python newbie and tell me why the simple window I
> >> created in Glade is not showing?
>
> >> This is the XML generated by Glade 3:
> >> <?xml version=.0"?>
> >> <interface>
> >>   <requires lib=tk+" version="2.16"/>
> >>   <!-- interface-naming-policy project-wide -->
> >>   <object class=tkWindow" id="helloWorld">
> >>     <property name=isible">True</property>
> >>     <signal name=estroy" handler="on_helloWorld_destroy"/>
> >>     <child>
> >>       <placeholder/>
> >>     </child>
> >>   </object>
> >> </interface>
>
> >> And this is the Python code:
> >> #!/usr/bin/env python
>
> >> import pygtk
> >> pygtk.require("2.0")
> >> import gtk
>
> >> class HelloWorld(object):
> >>         def getWindow(self):
> >>                 return self.window
>
> >>         def setWindow(self, window):
> >>                 self.window =indow
>
> >>         window =roperty(getWindow, setWindow)
>
> >>         def __init__(self):
> >>                 builder =tk.Builder()
> >>                 builder.add_from_file("helloWorld.glade")
> >>                 builder.connect_signals({"on_helloWorld_destroy" :
> >> self.onHelloWorldDestroy})
> >>                 self.window =uilder.get_object("helloWorld")
> >>                 self.window.show()
>
> >>         def onHelloWorldDestroy(self):
> >>                 pass
>
> >> I ran this in a terminal on Ubuntu 9.04 like this:
> >> sven at Dell:~$ cd ./gvfs/python\ on\ sven/
> >> sven at Dell:~/gvfs/python on sven$ python ./helloWorld.py
> >> sven at Dell:~/gvfs/python on sven$
>
> > Okay I'm mad at myself for forgetting this:
>
> > if __name__ ="__main__":
> >    helloWorld =elloWorld()
> >    gtk.main()
>
> > When I add that, a new problem arises: the terminal floods with:
> >   File "./helloWorld.py", line 12, in setWindow
> >     self.window =indow
> >   File "./helloWorld.py", line 12, in setWindow
> >     self.window =indow
> >   File "./helloWorld.py", line 12, in setWindow
> >     self.window =indow
> > ad infinitum
>
> You have infinite recursion because setWindow is defined indirectly in
> terms of itself.  It uses the property 'window', which is defined to use
> setWindow.
>
> The cure for it is simple.  If you want to have a private data
> attribute, use a leading underscore.  Don't call it the same thing that
> the public is going to use.
>
> class HelloWorld(object):
>          def getWindow(self):
>                  return self._window
>
>          def setWindow(self, window):
>                  self._window = window
>
>          window = property(getWindow, setWindow)
>
>          def __init__(self):
>                  builder = gtk.Builder()
>                  builder.add_from_file("helloWorld.glade")
>                  builder.connect_signals({"on_helloWorld_destroy" :
>  self.onHelloWorldDestroy})
>                  self._window = builder.get_object("helloWorld")
>                  self._window.show()
>
>          def onHelloWorldDestroy(self):
>                  pass
>
> (untested)

That solved the problem, thanks!

I assume that the getWindow and setWindow can be bypassed by using the
_window property directly and that Python has no visibility keywords
like private or protected. Sort of like PHP 4. (Not that I want to
compare Python to anything like that mess, lol ;))



More information about the Python-list mailing list