PyQt4, wyjątek "maximum recursion" w obsłudze pushButton

0

Hej,

Oto mój kod:

import sys
from PyQt4 import QtCore, QtGui

# import klasy
from Okienko import Ui_Form

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        # nazwa klasy
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        # tu dajemy własne połączenia slotow
        QtCore.QObject.connect(self.ui.pushButton,  QtCore.SIGNAL("clicked()"), self.file_dialog )
    def file_dialog(self):
        self.ui.lineEdit_5.setText('sasa');


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

Gdy klikam w przycisk to działa poprawnie ale wyrzuca mi dodatkowo wyjątek tj.
user image

Okienko utworzyłem w qtdesignerze i dałem przycisk z sygnałem clicked() / click.
Dlaczego wyrzuca mi wyjątek ?

Dodam, że ten sam wyjątek wyrzuca, gdy z powyższego kodu wyrzucę następujące linijki:

        QtCore.QObject.connect(self.ui.pushButton,  QtCore.SIGNAL("clicked()"), self.file_dialog )
    def file_dialog(self):
        self.ui.lineEdit_5.setText('sasa');
0
import sys
sys.setrecursionlimit(100000)

To zapewne nie rozwiązanie problemu, ale warto wiedzieć na zaś :D

A co do problemu, to kod wygląda ok... screen Ci tylko nie wyszedł. Wrzuć najlepiej paczkę zip z całym testem, to sprawdzę, czy u mnie dobrze działa.

0
Spine napisał(a):
import sys
sys.setrecursionlimit(100000)

To zapewne nie rozwiązanie problemu, ale warto wiedzieć na zaś :D

A co do problemu, to kod wygląda ok... screen Ci tylko nie wyszedł. Wrzuć najlepiej paczkę zip z całym testem, to sprawdzę, czy u mnie dobrze działa.

Oto paczka z kodem: http://www.sendspace.pl/file/408a9c7c0ca78732bf6209e

Kod jest skopiowany z kursu http://www.python.rk.edu.pl/w/p/prosty-edytor-tekstowy-w-pyqt4/ a więc nie mam pojęcia co jest nie tak...

0

Tak jak sądziłem... Wywołuje się jakimś cudem rekursja związana z dwukrotnym podłączeniem jednego sygnału.

W pliku Okienko.py wywal linijkę 68:

QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.pushButton.click)

Najlepiej nie podłączaj sygnałów w Qt Designer, skoro robisz to sobie ręcznie w (takiej troszkę nieudolnej) podklasie ;) Ja bym zrobił klasę dziedziczącą po Okienko.Ui_Form i tam bym wszystko obsłużył (zamiast self.ui.pushButton byś pisał po ludzku self.pushButton itp.), a inna klasa by służyła do samego wystartowania okienka aplikacji. Wystarczyłoby we wspomnianej podklasie nadpisać metodę setupUi i dopisać kilka swoich podłączeń sygnałów.

Jeszcze w App.py dopisz na samej górze linijkę:

# -*- coding: utf-8 -*-

Tak dla zachowania kompatybilności z Python'em starszym niż 3 :)

0
Spine napisał(a):

Tak jak sądziłem... Wywołuje się jakimś cudem rekursja związana z dwukrotnym podłączeniem jednego sygnału.

W pliku Okienko.py wywal linijkę 68:

QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.pushButton.click)

Najlepiej nie podłączaj sygnałów w Qt Designer, skoro robisz to sobie ręcznie w (takiej troszkę nieudolnej) podklasie ;) Ja bym zrobił klasę dziedziczącą po Okienko.Ui_Form i tam bym wszystko obsłużył (zamiast self.ui.pushButton byś pisał po ludzku self.pushButton itp.), a inna klasa by służyła do samego wystartowania okienka aplikacji. Wystarczyłoby we wspomnianej podklasie nadpisać metodę setupUi i dopisać kilka swoich podłączeń sygnałów.

Jeszcze w App.py dopisz na samej górze linijkę:

# -*- coding: utf-8 -*-

Tak dla zachowania kompatybilności z Python'em starszym niż 3 :)

Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1