errror QGraphicsView

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

Hi
gerade am verzweifeln. ;-(
diese Zeile
self.graphicsView = PlotWidget(self.centralwidget)
Verursacht bei mir ein error. Allerdings nur wenn ich den code debuge und nicht in run configuration. Weiss jemand warum:
Error report:
TypeError: arguments did not match any overloaded call:
QGraphicsView(parent: QWidget = None): argument 1 has unexpected type 'PySide6.QtWidgets.QWidget'
QGraphicsView(QGraphicsScene, parent: QWidget = None): argument 1 has unexpected type 'PySide6.QtWidgets.QWidget'
python-BaseException
Fatal Python error: Cannot recover from stack overflow.


mein ui_mainwindow.py:

Code: Alles auswählen

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

################################################################################
## Form generated from reading UI file 'mainwindow.ui'
##
## Created by: Qt User Interface Compiler version 6.2.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QMainWindow, QMenuBar, QSizePolicy,
    QStatusBar, QWidget)

from pyqtgraph import PlotWidget

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.graphicsView = PlotWidget(self.centralwidget)
        self.graphicsView.setObjectName(u"graphicsView")
        self.graphicsView.setGeometry(QRect(40, 50, 721, 221))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 800, 22))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)


        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
    # retranslateUi

und mein main.py:

Code: Alles auswählen

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from ui_mainwindow import Ui_MainWindow
import numpy as np
import random


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec())
Benutzeravatar
sparrow
User
Beiträge: 3456
Registriert: Freitag 17. April 2009, 10:28

Die Antwort ist: Höre auf generierten Code zu verwenden und dann auch noch darin herum zu editieren. Die ersten Zeilen mit dem Kommentar hast du gelesen?

Statt generierten Code zu verwenden, benutze die .ui-Datei direkt. Das Stichwort heißt loadui. Wenn ich mich richtig erinnere, ist das bei pyside etwas anders als pyqt, aber es gibt ein externes Modul, was das anpasst.
Benutzeravatar
__blackjack__
User
Beiträge: 10870
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kkornfield: Wie kommt denn die Zeile dort hin? Und auch der Import von `PlotWidget`? Von Hand hast Du das dort hoffentlich nicht rein geschrieben — siehe generierten Kommentar am Anfang der Datei. Wobei man solche Dateien auch nicht generiert, sondern die *.ui-Datei zur Laufzeit lädt.

Ansonstent scheint `pyqtgraph` wie der Name schon sagt für PyQt zu sein, nicht für PySide.

Code: Alles auswählen

Sheep := 0;
WHILE NOT Asleep DO Inc(Sheep);
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

Hi
nein ich habe den Code nicht editiert. ui_mainwindow.py habe ich mit
pyside6-uic mainwindow.ui >>Ui_MainWindow.py
generiert.
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

Hi
und jetzt steige ich den ui file direkt zu verwenden. In der tat kann ich hier debuggen.
Jetzt habe ich das problem: wie plote ich da rein?
window.graphicsView.plot(time, amplitude)
AttributeError: 'PySide6.QtWidgets.QGraphicsView' object has no attribute 'plot'
__deets__
User
Beiträge: 12442
Registriert: Mittwoch 14. Oktober 2015, 14:29

pyqtgraph scheint tatsaechlich beide Qt-Pakete zu unterstuetzen. Was aber ggf. trotzdem irgendwie mit deiner Umgebung kollidiert, und das falsche Qt-Paket anzieht, wenn du debugst. Dazu muesstest du mal in der debug und normalen Umgebung jeweils den genauen Typ von PlotWidget ermitteln.

Und wenn du das da nicht reingeschrieben hast, woher kommen denn die Importe und die Instanziierung des PlotWidget?
Benutzeravatar
__blackjack__
User
Beiträge: 10870
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kkornfield: Dann macht was immer Du da zum „debuggen“ verwendest, offenbar etwas komisches. Verwende was anderes, oder lass das „debuggen“ auf diese Art und Weise einfach sein. Ich habe in den mittlerweile Jahrzehnten die ich Python verwende nur eine handvoll Situationen gehabt in denen ich tatsächlich einen Debugger eingesetzt habe. Keine davon hatte mit GUIs zu tun, und fast alle mit Algorithmen die von anderen Programmiersprachen portiert waren und die massiv unpythonisch waren, also mit einem Haufen Schleifen mit Indexvariablen/-zugriffen. Also da wo man wirklich Schrittweise durch den Algorithmus gehen muss um Fehler zu finden, und interaktiv ausprobieren, Logging-Ausgaben, und Unit-Tests nicht weitergeholfen haben.

Das einzige was ich speziell für die Fehlersuche manchmal einsetze ist das `icecream`-Modul um leichter Ausgaben zu machen ohne den Code zu stark zu ändern. Quasi als `print()`-Ersatz der das Ausgegebene auch als Wert unverändert zurück gibt, mit ein paar netten automagischen Extras bei der Ausgabe.

Code: Alles auswählen

Sheep := 0;
WHILE NOT Asleep DO Inc(Sheep);
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

>> Und wenn du das da nicht reingeschrieben hast, woher kommen denn die Importe und die Instanziierung des PlotWidget?
das habe ich wieder verifiziert:
pyside6-uic mainwindow.ui >>Ui_MainWindow.py
pyside6-uic generiert die importe und den rest, ich habe es nicht verändert.
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

Und sieht jemand warum das nicht geht?

>>window.graphicsView.plot(time, amplitude)
>>AttributeError: 'PySide6.QtWidgets.QGraphicsView' object has no attribute 'plot'
__deets__
User
Beiträge: 12442
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das muesste ja auch ein PlotWidget sein. Daher kam ja auch die Frage, wie das da reingekommen ist. Weil magisch geht's nicht. Man kann im Designer bestimmte Dinge mit Custom Widgets machen, darum habe ich gefragt, wie du das PlotWidget darein bekommen hast. Darauf gab's noch keine richtige Antwort.
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

ich bin ein QT Einsteiger: beantwortet das deine Frage:
ich habe in Qt Creator ein display widgets-> graphic view pre drag and drop in mein Form rein getan. Dann habe ich per rechts click es promototed zu PlotWidget und pyqtgraph.h als header file.
Stellt das ein Problem dar?
__deets__
User
Beiträge: 12442
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na ob das ein Problem darstellt versuchen wir ja gerade rauszufinden. Und das er die Klasse QGraphicsView erwaehnt, die nunmal wirklich kein plot kennt, spricht erstmal nicht dafuer, dass es geklappt hat mit dem PlotWidget. Steht das also immer noch in dem generierten Code?
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

Ja, das steht immer noch im generierten code.
Benutzeravatar
__blackjack__
User
Beiträge: 10870
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: `PlotWidget` ist aber letztlich von QGraphicsView abgeleitet, das vorgehen müsste also an sich schon so stimmen.

@kkornfield: Funktioniert das Programm denn wenn man es normal laufen lässt? Ansonsten scheint das wirklich ein Problem von Deinem „debugging“ zu sein, wo Du glaube ich noch nicht verraten hast was das genau bedeutet.

Code: Alles auswählen

Sheep := 0;
WHILE NOT Asleep DO Inc(Sheep);
__deets__
User
Beiträge: 12442
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__: ich wuerde da aber trotzdem erwarten, dass er auch "PlotWidget" in der Fehlermeldung sagt. Und nicht QGraphicsView. Das plot ist doch Teil der abgeleiteten Klasse, und wenn der Designer nur ein QGraphicsView instantiiert, fehlt eben genau das. Warum auch immer das im "debug" anders ist - da hast du natuerlich sehr recht, was da passiert, muss erstmal klar werden.
kkornfield
User
Beiträge: 10
Registriert: Mittwoch 29. Dezember 2021, 08:38

Hi
Gelöst: es war wohl ein dependency issue. Ich habe diesmal alle mein Module unter Python3.7 und PIP installiert und nicht mit Python 3.8 und conda install.
Antworten