I'm guessing that your ColorWidgets are somehow losing info because of loss of references in python but I don't understand how PyGTK handles memory in conjunction with python.

I fiddled with your test program and added a list of ColorWdigets to the StyleBox instance - this seemed to fix things but I don't know exactly why. It's a hack but may be a workaround.

John

Ava Arachne Jarvis wrote:

I'm using python 2.2 and pygtk 1.99.14, gtk 2.2.0 and friends.

I'm running across an odd problem when I use a large number of widgets,
and some of them are ones that inherit from original gtk widgets. When
first created, these objects seem intact; however, the first time a
signal callback is called, the objects' attribute dictionaries are
empty.

I'm attaching a version of the program that I stripped down to about 50
lines. Instruction for running this:

python stripped.py <num of ColorWidgets>


#!/usr/bin/python
import pygtk
pygtk.require('2.0')
import gtk, sys, string

class ColorWidget(gtk.Button):
    def __init__(self, stylebox):
        gtk.Button.__init__(self)
        self.stylebox = stylebox
        self.color = gtk.gdk.color_parse('white')
        self.set_size_request(30, 30)
        self.connect("clicked", self.setColor)

    def setBackground(self, gdkcolor = None):
        if gdkcolor: 
            self.color = gdkcolor
            for state in [gtk.STATE_ACTIVE, gtk.STATE_NORMAL, 
                          gtk.STATE_PRELIGHT, gtk.STATE_SELECTED]: 
                self.modify_bg(state, self.color)

    def setColor(self, w):
        print '__dict__:', self.__dict__
        self.setBackground(self.stylebox.getColor(self.color))

class StyleBox(gtk.Window):
    def __init__(self, numwidgets = 10):
        gtk.Window.__init__(self)
        self.connect("destroy", lambda w: gtk.main_quit())
        self.widgets = []
        self.cdg = gtk.ColorSelectionDialog('Select Color')
        self.notebook = gtk.Notebook()
        self.notebook.set_show_tabs(0)
        self.add(self.notebook)

        for i in range(0, numwidgets): 
            self.createTestPanel()

    def getColor(self, prev_color = None):
        if prev_color: self.cdg.colorsel.set_current_color(prev_color)
        color = None
        if self.cdg.run() == gtk.RESPONSE_OK:
            color = self.cdg.colorsel.get_current_color()
        self.cdg.hide()
        return color
    
    def createTestPanel(self):
        panel = gtk.Frame()
        self.notebook.append_page(panel, gtk.Label('Test'))
        w = ColorWidget(self)
        self.widgets.append(w)
        panel.add(w)

s = StyleBox(string.atoi(sys.argv[1]))
s.show_all()
gtk.main()

Reply via email to