[PyQt] Trying to learn ...

Algis Kabaila akabaila at pcug.org.au
Wed Aug 3 00:27:55 BST 2011


On Tue, 2 Aug 2011 08:38:21 PM Hans-Peter Jansen wrote:
> Magnus, please keep the conversation on the ML or CC at the very least.
> Others might want to participate.
> 
> My personal preference is to NOT receive personal copies.
> 
> On Tuesday 02 August 2011, 11:20:15 Magnus Wirström wrote:
> > 2011/8/2 Hans-Peter Jansen <hpj at urpla.net>:
> > > On Monday 01 August 2011, 22:20:32 Magnus Wirström wrote:
> > >> Hi
> > >> 
> > >> I am sorry if this have been asked before :)
> > >> 
> > >> I am trying to learn using python and pyqt using ERIC 5.1.2. I
> > >> have a problem with signals and slots. I tried this on 2 different
> > >> computer with different OS and different version of python. My
> > >> problem is this...
> > >> 
> > >> I am creating a "test" project using Eric ... using one of the
> > >> tuturials on Eric's webpage. I create a project and a form, then i
> > >> add a push button. I save the form and i generate the form into
> > >> code using Eric I also generate dialog code and adding a slot for
> > >> my push button. So far i have not written a single line of code.
> > >> In my slot i write a print("Hello"), My only self written code.
> > >> When i run this, i get a window with my button but when i click it
> > >> nothing happens. When have i done wrong? How can i get my button
> > >> to execute the slot?
> > > 
> > > You should get the "Hello" printed in console on start up, don't
> > > you?
> > > 
> > > See below.
> > 
> > It prints nothing in the console when i start up...
> 
> Ah, of course not.
> 
> See below.
> 
> > >> thanks for the help ... sorry if this is a stupid question ;)
> > >> 
> > >> Here is the code:
> > >> 
> > >> 
> > >> # Form implementation generated from reading ui file
> > >> '/home/magnus/eric/test/testui.ui'
> > >> #
> > >> # Created: Mon Aug  1 22:16:17 2011
> > >> #      by: PyQt4 UI code generator 4.8.4
> > >> #
> > >> # WARNING! All changes made in this file will be lost!
> > >> 
> > >> from PyQt4 import QtCore, QtGui
> > >> 
> > >> try:
> > >>     _fromUtf8 = QtCore.QString.fromUtf8
> > >> except AttributeError:
> > >>     _fromUtf8 = lambda s: s
> > >> 
> > >> class Ui_Dialog(object):
> > >>     def setupUi(self, Dialog):
> > >>         Dialog.setObjectName(_fromUtf8("Dialog"))
> > >>         Dialog.resize(400, 300)
> > >>         self.pushButton = QtGui.QPushButton(Dialog)
> > >>         self.pushButton.setGeometry(QtCore.QRect(140, 130, 83,
> > >> 25)) self.pushButton.setObjectName(_fromUtf8("pushButton"))
> > >> 
> > >>         self.retranslateUi(Dialog)
> > >>         QtCore.QMetaObject.connectSlotsByName(Dialog)
> > >> 
> > >>     def retranslateUi(self, Dialog):
> > >>        
> > >> Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog",
> > >> "Dialog", None, QtGui.QApplication.UnicodeUTF8))
> > >> 
> > >> self.pushButton.setText(QtGui.QApplication.translate("Dialog",
> > >> "PushButton", None, QtGui.QApplication.UnicodeUTF8))
> > >> 
> > >> 
> > >> if __name__ == "__main__":
> > >>     import sys
> > >>     app = QtGui.QApplication(sys.argv)
> > >>     Dialog = QtGui.QDialog()
> > >>     ui = Ui_Dialog()
> > >>     ui.setupUi(Dialog)
> > >>     Dialog.show()
> > >>     sys.exit(app.exec_())
> > >> 
> > >> 
> > >> ------------------------------------------------------------------
> > >>
> > >>---
> > >>
> > >> ------------------------------------------------------------------
> > >>
> > >>----
> > >>
> > >> ------------------------------------------------------------------
> > >>
> > >>----
> > >>
> > >> # -*- coding: utf-8 -*-
> > >> 
> > >> """
> > >> Module implementing Dialog.
> > >> """
> > >> 
> > >> from PyQt4.QtCore import *
> > >> from PyQt4.QtGui import QDialog
> > >> 
> > >> from .Ui_testui import Ui_Dialog
> > >> 
> > >> class Dialog(QDialog, Ui_Dialog):
> > >>     """
> > >>     Class documentation goes here.
> > >>     """
> > >>     def __init__(self, parent = None):
> > >>         """
> > >>         Constructor
> > >> 
> > >>         @param parent reference to the parent widget (QWidget)
> > >>         """
> > >>         QDialog.__init__(self, parent)
> > >>         self.setupUi(self)
> > >>         QtCore.QObject.connect(self.pushButton,
> > >> QtCore.SIGNAL(_fromUtf8("clicked()")),
> > >> self.on_pushButton_clicked())
> > 
> > This was an attempt to get it to work. I added this and forgot to
> > remove it. What i understand of the tutorial, the bindings to the
> > slots would be done automatic by this line in  the script above
> > "QtCore.QMetaObject.connectSlotsByName(Dialog)".
> 
> Yes. For that reason, if you try my fixed script, you get the Hello
> twice, once from the manual connection, and one from the automatic
> connection.
> 
> > I think my question
> > is why this is not working.
> 
> Your app is missing a major part: the usual if __name__ is "__main__":
> Check out the ui file. Not only it carries some such, it is also using
> sane import clauses.
> 
> > >                                        
> > >  self.pushButton.clicked.connect(self.on_pushButton_clicked)      
> > >                   ^^ You're calling the signal handler here,
> > > resulting in connecting the signal to None. While at it, use the
> > > "new" style signals/slots:
> > > 
> > >        self.pushButton.clicked.connect(self.on_pushButton_clicked)
> > > 
> > > Looking much nicer, doesn't it?
> > 
> > Yes ... it looks much nicer... I tried to replace my line with yours
> > but still no joy... still the same result... nothing happens. if i
> > press the pushbutton a couple of times i get this message in the
> > console:
> > 
> > QDialog::exec: Recursive call detected
> > 
> > When i start to get it ... it appears on every click.
> 
> This is confusing. You need to run the testui.py script, not the
> Ui_testui.py script for this to work. The latter is just the dialog
> definition (with some independent test code supplied), the former is
> the right place for your code.
> 
> > > ("new, as in "only a couple of years old…")
> > > 
> > > And it should do, what you want, does it?
> > 
> > No ... still no joy :(
> 
> Hth,
> Pete

Hi, Pete!

Looking at testui.py it seems to me that it should/would work without the 
decorator @pyqtSlot().  This suggests two questions:

1. What is the advantage, if any, to use the decorator in this case?

2. Where could one look up the code for this decorator?

Thanks for your forever careful care of "simple" questions - there is nothing 
simple when one does not know how to get it working!  Good work!

OldAl.


More information about the PyQt mailing list