Python and Glade: window not showing
Dave Angel
davea at ieee.org
Sat May 30 15:02:35 EDT 2009
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)
More information about the Python-list
mailing list