[Paraview] python plugin custom dialog causes paraview to hang

m.c.wilkins at massey.ac.nz m.c.wilkins at massey.ac.nz
Wed Oct 13 17:29:59 EDT 2010


Hi

I posted about this ages ago, and with your help got it working on
linux, but now I am having problems getting it going under Windows.

Let me summarize what I am doing.

I am writing a Python plugin, and I want to popup a custom dialog.
For simple dialogs I have found:

   import PyQt4.QtGui
   l = PyQt4.QtGui.QInputDialog.getText(wid, 'Slice', 'Length')

to work fine.  But I need more complicate dialogs.  Yes I have read

   http://paraview.markmail.org/message/6h767kpak5dcoqwt

(thanks Pat), otherwise surely I would not have made it this far!

My code is below.  It runs fine under paraview linux, and it runs fine
in a nonparaview simple test app under Windows, but when running under
paraview on Windows, it hangs when I push the OK button.

In the URL above, it says one shouldn't use exec_() and I am
(incidentally it works under linux ok).  I tried to use setModal(True)
then show(), but control returns immediately to me, then paraview
hangs anyway.

Also in the URL above, the example works just fine for me, unless I
put a simple 'print "hello"' at the end, then paraview hangs.
Something way beyond my meagre skills is happening here.  Please any
help is much appreciated!


import os,sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import paraview

def callback_wrapper(func):
   v = paraview.vtk.vtkObject()
   def wrap(*args, **kwargs):
      v._args = args
      v._kwargs = kwargs
      v.Modified()
   def callback(o, e): func(*v._args, **v._kwargs)
   v.AddObserver("ModifiedEvent", callback)
   return wrap

class MyDialog(QDialog):

   def __init__(self, *args):
      QDialog.__init__(self, *args)
      self.start = 0

      buttonBox = QDialogButtonBox()
      okButton = buttonBox.addButton(buttonBox.Ok)

      QObject.connect(okButton, SIGNAL("clicked()"), self.accepted)
      layout = QVBoxLayout()
      layout.addWidget(buttonBox)
      self.setLayout(layout)

   @callback_wrapper
   def accepted(self):
      self.start = 1
      self.accept()

#app = QApplication(sys.argv)        

foo = MyDialog()

# this hangs paraview under windows
#foo.setModal(True)
#foo.show()

# this works on linux, but hangs (just prints OK:) under windows if
# user pushes OK
if foo.exec_():
   print "OK:", foo.start
else:
   print "They cancelled", foo.start




Matt Wilkins

On Thu, Jun 17, 2010 at 10:33:08AM +1200, m.c.wilkins at massey.ac.nz wrote:
> 
> Hi,
> 
> I hang my head in shame, I really should have thrown my code into a
> nonparaview test app.  I will do that in future.
> 
> Pat you simply are the best!  Thank you so much.
> 
> The business about self.acceptfoo vs self, acceptfoo arises from my
> lack of understanding about the slots/signals in Qt.  I've seen stuff
> like:
> 
>    QObject.connect(a, SIGNAL("clicked()"), a, SLOT("quit()"))
> 
> which indicate you put target object, then the slot, but also stuff
> like:
> 
>    QObject.connect(a, SIGNAL("clicked()"), self.rejectfoo)
> 
> which I guess you use when the target of the signal is not a Qt SLOT
> as such.
> 
> Anyway, I am very thankful to you Pat, and this list in general.
> 
> Matt
> 
> On Wed, Jun 16, 2010 at 06:11:01PM -0400, pat marion wrote:
> > Hi,
> > 
> > So at the very end of that email that you linked, I mentioned the problem that
> > paraview hangs when it encounters a runtime error, instead of reporting the
> > error.  I haven't had the chance to investigate the problem, but it's really
> > annoying!
> > 
> > Anyway, I think your problem is just a few typos... try adding:
> > 
> > 
> > from PyQt4.QtCore import *
> > 
> > 
> > at the top.  Also, you had commas instead of periods in two places:
> > 
> > foo,input1  --> foo.input1
> > self, acceptfoo  --> self.acceptfoo
> > 
> > 
> > I debugged the problems by running your script in regular python.  I commented
> > out the callback_wrapper and then just added:
> > 
> > import sys
> > app = QApplication(sys.argv)
> > 
> > before the main script begins.  Doing it this way made it easy to spot the
> > typos.
> > 
> > 
> > Pat
> > 
> > 
> > On Wed, Jun 16, 2010 at 5:14 PM, <m.c.wilkins at massey.ac.nz> wrote:
> > 
> > 
> >     Hi,
> > 
> >     I am writing a Python plugin, and I want to popup a custom dialog.
> >     For simple dialogs I have found:
> > 
> >       import PyQt4.QtGui
> >       l = PyQt4.QtGui.QInputDialog.getText(wid, 'Slice', 'Length')
> > 
> >     to work fine.  But I need more complicate dialogs.  I just can't get
> >     the signals/slots to work.  Yes I have read
> > 
> >       http://paraview.markmail.org/message/6h767kpak5dcoqwt
> > 
> >     (thanks Pat), otherwise surely I would not have made it this far!
> > 
> >     Here is my plugin, and any time I uncomment either of the connect
> >     lines, paraview (built from git about a week ago) just hangs.  Without
> >     those lines, the dialog doesn't work of course; I can cancel it with
> >     the window decorator, but that is it.
> > 
> >     Thank you for any help, this is beyond me, just reading the definition
> >     of callback_wrapper makes my head hurt, I hope it doesn't hurt yours
> >     ;-)
> > 
> >     Matt
> > 
> > 
> >     from PyQt4.QtGui import *
> > 
> >     def callback_wrapper(func):
> >       v = paraview.vtk.vtkObject()
> >       def wrap(*args, **kwargs):
> >          v._args = args
> >          v._kwargs = kwargs
> >          v.Modified()
> >       def callback(o, e): func(*v._args, **v._kwargs)
> >       v.AddObserver("ModifiedEvent", callback)
> >       return wrap
> > 
> >     class MyDialog(QDialog):
> > 
> >       def __init__(self, *args):
> >          QDialog.__init__(self, *args)
> > 
> >          buttonBox = QDialogButtonBox()
> >          okButton = buttonBox.addButton(buttonBox.Ok)
> >          cancelButton = buttonBox.addButton(buttonBox.Cancel)
> > 
> >          label0 = QLabel("Foo", self)
> >          self.le0 = le0 = QLineEdit(self)
> > 
> >          label1 = QLabel("Bar", self)
> >          self.le1 = le1 = QLineEdit(self)
> > 
> >          # either of these lines cause paraview to lock up
> >          #QObject.connect(okButton, SIGNAL("clicked()"), self, acceptfoo)
> >          #QObject.connect(cancelButton, SIGNAL("clicked()"), self.rejectfoo)
> > 
> >          layout = QGridLayout()
> >          layout.addWidget(label0, 0, 0)
> >          layout.addWidget(le0, 0, 1)
> >          layout.addWidget(label1, 1, 0)
> >          layout.addWidget(le1, 1, 1)
> >          layout.addWidget(buttonBox, 2, 0, 1, 2)
> >          self.setLayout(layout)
> > 
> >       @callback_wrapper
> >       def acceptfoo(self):
> >          self.input0 = self.le0.text()
> >          self.input1 = self.le1.text()
> >          self.accept()
> > 
> >       @callback_wrapper
> >       def rejectfoo(self):
> >          print "Doing reject"
> >          self.reject()
> > 
> > 
> >     foo = MyDialog()
> >     if foo.exec_():
> >       print "OK:", foo.input0, foo,input1
> >     else:
> >       print "They cancelled"
> > 
> > 
> > 
> >     _______________________________________________
> >     Powered by www.kitware.com
> > 
> >     Visit other Kitware open-source projects at http://www.kitware.com/
> >     opensource/opensource.html
> > 
> >     Please keep messages on-topic and check the ParaView Wiki at: http://
> >     paraview.org/Wiki/ParaView
> > 
> >     Follow this link to subscribe/unsubscribe:
> >     http://www.paraview.org/mailman/listinfo/paraview
> > 
> > 
> _______________________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
> 
> Please keep messages on-topic and check the ParaView Wiki at: http://paraview.org/Wiki/ParaView
> 
> Follow this link to subscribe/unsubscribe:
> http://www.paraview.org/mailman/listinfo/paraview


More information about the ParaView mailing list