1

When a function is called - a file is tested for existence. This checksum pushes a messageBar() object for both circumstances (True/False), yet the actual bar does not display in MapCanvas until after the subsequent exec_() is called and finished running.

def callUtherPendragonsSon(self):
    holyGrailFile = 'C:\ALongWayFrom\camelot.csv'
    if os.path.exists(holyGrailFile):
        self.iface.messageBar().pushMessage("Notice", "You will need many coconuts...",\
                                            level=QgsMessageBar.INFO, duration=3)
        beginTheJourney = gatherProvisionsAndMen()
        beginTheJourney.exec_()
    else:
        self.iface.messageBar().pushMessage("Warning", "There is no grail :( ",\
                                            level=QgsMessageBar.CRITICAL, duration=3)
        return

Is there a means to assure the message bar is pushed prior to calling the exec_() ?

UPDATE (1):

As it turns out, a command in the external Ui gatherProvisionsAndMen()'s init is causing the trouble. It is a data-thirsty function call, and seems to supersede the messagebar (even though it is executed thereafter). The messageBar itself is intended to preliminarily notify the user of this nested 'lengthy process' - but it seems such a notice needs to take place in another manner...

Perhaps I hold a misunderstanding in the logistics of programming but,

wouldn't the call to push a QgsMessageBar() need to complete before moving forward and executing the external Ui?

13
  • Do you mean you only see the bar after you've closed the dialog? Cannot replicate the issue. Commented Feb 17, 2015 at 18:42
  • The bar is only displayed after the external Ui-dialog has passed the *.show() command. e.g.-both the messageBar and Ui appear simultaneously, rather then (as intended) the former before the later.
    – Katalpa
    Commented Feb 17, 2015 at 18:44
  • Still cannot replicate it. In my test plugin, I added a for loop in between to delay the show() call, however, the message appears immediately after it's called. Commented Feb 17, 2015 at 18:47
  • I cannot seem to find the success you mention. Is it possible that my QgisVer (2.7-Dev) is @ cause?
    – Katalpa
    Commented Feb 17, 2015 at 18:52
  • 1
    That could be the case. Perhaps you could try with a simple version and see if it gets better, i.e., try to isolate the problem. Commented Feb 17, 2015 at 19:05

2 Answers 2

3

To solve this problem, just say to the main window to repaint itself after pushing your message with the repaint function :

 self.iface.messageBar().pushMessage("Please wait...", level=QgsMessageBar.INFO, duration=0)
 self.iface.mainWindow().repaint()
 # Do something that takes time
 time.sleep(5)
 self.iface.messageBar().clearWidgets()
2

Just put dummy print 'xxx' statement immediately after self.iface.messageBar().pushMessage call.

SOLUTION: please use self.iface.mainWindow().statusBar().showMessage() just before self.iface.messageBar().pushMessage() call. And if you need, also self.iface.mainWindow().statusBar().clearMessage()

7
  • I have found that if the Python plugin console is not open during such scripted prints - errors arise. Maybe due to the version I have implemented?
    – Katalpa
    Commented Apr 24, 2015 at 17:19
  • Describe an error message please.
    – Artur Lill
    Commented Apr 25, 2015 at 9:38
  • " File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python/plugins\GraphicGroundwater\loadParticleTracks.py", line 265, in constructShapefile print newPathGroups IOError: [Errno 9] Bad file descriptor"
    – Katalpa
    Commented Apr 25, 2015 at 18:06
  • You are right about Python plugin console: my solution works only if this console is open.
    – Artur Lill
    Commented Apr 27, 2015 at 14:00
  • To debug an error just try to disable/enable installed plugin again... not sure what is the real cause of this error.
    – Artur Lill
    Commented Apr 27, 2015 at 14:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.