1

I am trying to learn how to develop QGIS plugins but I struggle to get going by some simple principles.

As a test I am just trying to connect a function to a button. So when pressed the function run. Where to put the function and connections are not obvious to me.

This example give me an error message TypeError: test_print() takes no arguments (2 given) I cannot see how this give test_print 2 arguments?

def run(self):

    # Run test_print method when pushButton is clicked
    self.dlg.pushButton.clicked.connect(self.test_print)

    # show the dialog
    self.dlg.show()

def test_print():
    print 'It works!'

Does anyone has any general advice how to wire up buttons and functions properly?

EDIT: Working test example

This worked.

def run(self):

        def test_print():
            QMessageBox.about(None,'test','It works!')

        # Run test_print method when pushButton is clicked
        self.dlg.pushButton.clicked.connect(test_print)

Now, how can i run the test_print method if its not inside def run(self)?

Joseph
  • 75,746
  • 7
  • 171
  • 282
geogrow
  • 1,683
  • 2
  • 21
  • 41
  • 2
    About your specific issue: you have to add self as an argument to test_print (i.e. test_print(self)). – ArMoraer Jan 25 '17 at 10:38
  • It did not work. This works however (see initial question). How can I call a function that is not inside the run method? – geogrow Jan 25 '17 at 11:04
  • The method provided by @ArMoraer worked for me. Did you receive any errors in the Python Console when you tried using test_print(self)? – Joseph Jan 25 '17 at 11:09
  • Maybe I am missing something very obvious here but I get this NameError: global name 'test_print' is not defined – geogrow Jan 25 '17 at 11:23
  • Is this your entire plugin? Just one file with a "run" function in it? – Spacedman Jan 25 '17 at 11:26
  • @Spacedman No, I used Plugin builder for the structure. So it contain all the default files it creates. – geogrow Jan 25 '17 at 11:28

1 Answers1

1
  1. Try moving the line:

    self.dlg.pushButton.clicked.connect(self.test_print)
    

    to the initGui(self) function instead of in the run(self) function.


  1. As @ArMoraer mentioned, put your test_print(self) outside the run(self) function.

  1. Here is the part of the Example.py script I used to test it:

    def initGui(self):
        """Create the menu entries and toolbar icons inside the QGIS GUI."""
        icon_path = ':/plugins/Example/icon.png'
        self.add_action(
            icon_path,
            text=self.tr(u'Example'),
            callback=self.run,
            parent=self.iface.mainWindow())
    
        # Run test_print method when pushButton is clicked
        self.dlg.pushButton.clicked.connect(self.test_print)
    
    def run(self):        
        """Run method that performs all the real work"""
        # show the dialog
        self.dlg.show()
        result = self.dlg.exec_()
        if result:
            pass
    
    def test_print(self):
        print 'It works!'
    

You can also take a look at the following post which describes the fundamental parts of a QGIS plugin:

What is the purpose of some functions and files in QGIS Python plugins?

Joseph
  • 75,746
  • 7
  • 171
  • 282
  • 1
    Great now it works! Really appreciate it, a good simple starting point. I created a new plugin from the Plugin builder and both @Joseph and @ArMoraer works. I just found that i had moved self.dlg = TestPluginDialog() from the add_action method to the init (followed an example before) that made it not functioning properly. Thanks for all your help! – geogrow Jan 25 '17 at 12:18
  • @geogrow - Most welcome and nice one! Glad you got it working =) – Joseph Jan 25 '17 at 12:21