[PyKDE] strange seg fault with SIGNAL('PyObject *')
    Patrick Stinson 
    patrickkidd at gmail.com
       
    Thu Mar 23 03:47:30 GMT 2006
    
    
  
I don't have debuggin symbols installed, but I am consistently getting a seg
fault after calling the python slot connected to SIGNAL('PyObject *') from a
QWidget subclass. I am usually passing a python string with the signal, but
if I pass None instead, it doesn't crash. I have a button group emitting
clicked(QAbstractButton *), which emits this signal.
the connecting code is as follows (sorry for the length), good luck:
import os
from PyQt4.QtCore import QObject, SIGNAL
from PyQt4.QtGui import QPushButton, QApplication, QWidget, QHBoxLayout
from PyQt4.QtGui import QButtonGroup, QPalette, QColor
# ~/.pksampler
PATCH_DIR = os.path.join(os.environ['HOME'], '.pksampler')
LAYERS = ['bass', 'drums', 'lead', 'misc', 'pads']
def find_patches():
    patches = [i for i in os.listdir(PATCH_DIR)
               if os.path.isdir(os.path.join(PATCH_DIR, i))]
    return patches
def extension(fpath):
    """ return the extension of fpath, not including the . """
    return fpath[fpath.rfind('.')+1:]
def can_open(fpath):
    exists = os.access(fpath, os.R_OK)
    supported = extension(fpath) in ('wav', 'aiff')
    return exists and supported
class PatchSelector(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        Layout = QHBoxLayout(self)
        self.group = QButtonGroup(self)
        self.buttons = []
        for index, name in enumerate(find_patches()):
            button = QPushButton(name)
            palette = QPalette(button.palette())
            palette.setColor(QPalette.Button,
                             QColor('grey').dark(150))
            button.setPalette(palette)
            self.group.addButton(button)
            self.group.setId(button, index)
            self.buttons.append(button)
            Layout.addWidget(button)
        QObject.connect(self.group,
                        SIGNAL('buttonClicked(QAbstractButton *)'),
                        self.clicked)
    def clicked(self, button):
        name = str(button.text())
        self.selected = name
        self.emit(SIGNAL('selected(PyObject *)'), name)
        #self.emit(SIGNAL('selected()'))
class Patch:
    name = None
    layers = None
    def __init__(self, name):
        self.name = name
        self.homedir = os.path.join(PATCH_DIR, name)
        self.layers = {}
        for layer in LAYERS:
            self.layers[layer] = []
            lpath = os.path.join(self.homedir, layer)
            if os.path.isdir(lpath):
                self.layers[layer] = []
                for fname in os.listdir(lpath):
                    print 'LPATH',lpath
               # THIS CRASHES IF I ENABLE THESE **************************8
                #    fpath = os.path.join(lpath, fname)
                #    print 'FPATH',fpath
                #    #if can_open(fpath):
                #    #    self.layers[layer].append(fpath)
if __name__ == '__main__':
    import sys
    def selected(name):
        print 'Selected:',name, Patch(name)
    a = QApplication(sys.argv)
    w = PatchSelector()
    QObject.connect(w, SIGNAL('selected(PyObject *)'), selected)
    #QObject.connect(w, SIGNAL('selected()'), selected)
    w.show()
    a.exec_()
--
Patrick Kidd Stinson
http://www.patrickkidd.com/
http://pkaudio.sourceforge.net/
http://pksampler.sourceforge.net/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20060323/0efafdde/attachment.html
    
    
More information about the PyQt
mailing list