Dear Dan,
for me this sample program works:
import sys
sys.path.append("/home/guido/pymol1.3/pymol-1.3r2/modules")
from OpenGL.GL import *
from OpenGL.GLU import *
from PyQt4 import QtGui
from PyQt4.QtOpenGL import *
from PyQt4.Qt import Qt
from PyQt4 import QtCore
import pymol2
class PymolQtWidget(QGLWidget):
_buttonMap = {Qt.LeftButton:0,
Qt.MidButton:1,
Qt.RightButton:2}
def __init__(self, parent, enableUi,File=""):
f = QGLFormat()
f.setStencil(True)
f.setRgba(True)
f.setDepth(True)
f.setDoubleBuffer(True)
QGLWidget.__init__(self, f, parent=parent)
self.setMinimumSize(500, 500)
self._enableUi=enableUi
self.pymol = pymol2.PyMOL()# _pymolPool.getInstance()
self.pymol.start()
self.cmd = self.pymol.cmd
# self.toPymolName = self.pymol.toPymolName ### Attribute Error
self._pymolProcess()
if not self._enableUi:
self.pymol.cmd.set("internal_gui",0)
self.pymol.cmd.set("internal_feedback",0)
self.pymol.cmd.button("double_left","None","None")
self.pymol.cmd.button("single_right","None","None")
self.pymol.cmd.load(File)
self.pymol.reshape(self.width(),self.height())
self._timer = QtCore.QTimer()
self._timer.setSingleShot(True)
self._timer.timeout.connect(self._pymolProcess)
self.resizeGL(self.width(),self.height())
#globalSettings.settingsChanged.connect(self._updateGlobalSettings)
self._updateGlobalSettings()
def __del__(self):
pass
def _updateGlobalSettings(self):
#for k,v in globalSettings.settings.iteritems():
# self.pymol.cmd.set(k, v)
#self.update()
return
def redoSizing(self):
self.resizeGL(self.width(), self.height())
def paintGL(self):
glViewport(0,0,self.width(), self.height())
bottom = self.mapToGlobal(QtCore.QPoint(0,self.height())).y()
#self.pymol.cmd.set("_stencil_parity", bottom & 0x1)
self._doIdle()
self.pymol.draw()
def mouseMoveEvent(self, ev):
self.pymol.drag(ev.x(), self.height()-ev.y(),0)
self._pymolProcess()
def mousePressEvent(self, ev):
if not self._enableUi:
self.pymol.cmd.button("double_left","None","None")
self.pymol.cmd.button("single_right","None","None")
self.pymol.button(self._buttonMap[ev.button()], 0, ev.x(),
self.height()-ev.y(),0)
self._pymolProcess()
def mouseReleaseEvent(self, ev):
self.pymol.button(self._buttonMap[ev.button()], 1, ev.x(),
self.height()-ev.y(),0)
self._pymolProcess()
self._timer.start(0)
def resizeGL(self, w, h):
self.pymol.reshape(w,h, True)
self._pymolProcess()
def initializeGL(self):
pass
def _pymolProcess(self):
self._doIdle()
self.update()
def _doIdle(self):
if self.pymol.idle():
self._timer.start(0)
# You don't need anything below this
class PyMolWidgetDemo(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
widget = PymolQtWidget(self,True,"D2.xyz")
self.setCentralWidget(widget)
if __name__ == '__main__':
app = QtGui.QApplication(['PyMol Widget Demo'])
window = PyMolWidgetDemo()
window.show()
app.exec_()
Best regards,
Guido
Zitat von Dan O'Donovan <[email protected]>:
> Dear All,
>
> I read with interest Jason Ferrara's post concerning embedding PyMOL
> in a QT app (back in January
> http://www.mail-archive.com/[email protected]/msg08607.html
> ). I've spent a short time experimenting and have encountered a
> problem or two - I was wondering if any insightful users had any
> pointers for me.
>
> I've built pymol from the SourceForge source (1.4.1) on some Fedora
> linux x86 box. I initially jumped straight into the QT code, but
> experienced a few crashes. Taking things apart further, I've got a
> little script that consistently crashes with a segfault:
>
> import sys
> sys.path.append( os.path.join( os.environ['PYMOL_PATH'], 'modules' ) )
>
> import pymol2
> pymol = pymol2.PyMOL()
>
> print 'pymol initialised'
> pymol.cmd.set("internal_gui",0)
> print 'we never see this'
>
> $ python crash.py
>> pymol initialised
>> Segmentation fault (core dumped)
>
> Should this ever work? The code is a snippet from Jason's approach.
> I appreciate that it doesn't do anything, but should I expect a
> crash? Getting personal with gdb the stack trace comes up with
>
> 0x00007fffed6830e6 in APIEnterBlocked (self=0xd3c148, args=<value
> optimized out>) at layer4/Cmd.c:160
> 160 PRINTFD(G, FB_API)
>
> which seems relatively benign (there is a
> PyThread_get_thread_ident() call there).
>
> Thanks for reading this far,
>
> Dan
>
> Dan O'Donovan
> SBGrid Consortium
> Harvard Medical School
>
---
Dr. Guido Wagner
Institut für Anorganische und Analytische Chemie
der Johann Wolfgang Goethe-Universität Frankfurt
Max-von-Laue-Str. 7, D-60438 Frankfurt/Main, Germany
Tel.: (+49)69-798-29414, Fax: -29417
eMail: [email protected]
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
PyMOL-users mailing list ([email protected])
Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users
Archives: http://www.mail-archive.com/[email protected]