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