PyQt5: Erste Schritte / Einbinden von Forms / Widgets

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

Hallo, folgendes Problem:

ich finde im Web keinen gültigen Code, mit dem sich ein mit dem Qt Designer erstelltes "*.ui"-File direkt in den Python-Code einbinden lässt. (Win 7, Python 3.4, PyQT 5.3.1) So ziemlich alles was ich finde bezieht sich auf PyQt4, und liefert mir dann in der Regel den folgenden Fehler: IndentationError: unexpected indent

Fürs erste mal ein winziger, und sehr geläufiger, Versuchsaufbau:
Ein QT-Widget (widgHalloWelt.ui) mit einem PushButton und einem Label ohne Text. Wenn man den PushButton betätigt, soll im Label "Hallo Welt" erscheinen. Wie müsste der Code aussehen, um dieses Widget einzubinden? Und wie fange ich den Click-Event des Pushbuttons ab, und verwende ihn dazu, die Text-Eigenschaft des Labels zu ändern?

Hilfe wär lieb :)

LG SG ;-)
Me.PEBKAC ^^
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Fehler liegt auf deiner Seite, da ist die Fehlermeldung eigentlich eindeutig. Du hast deinen Code falsch eingerückt.

Es ist übrigens sehr hilfreich, wenn du die komplette Fehlermelung, inklusive Traceback und den betroffenen Code hier zeigst. Deine textuelle Zusammenfassung ist sicher gut gemeint, aber mit Fehler und Code kann man dir besser helfen. Dann muss man nicht raten.
Das Leben ist wie ein Tennisball.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

Hallo EyDu,

also das mit den Einrückungen hat mich schon ein kleines Stück weitergebracht (Bin halt blutiger Python-Anfänger^^) Aber so ganz funktionierts noch nicht:

Code: Alles auswählen

import sys
from PyQt5 import QtGui, uic

class MainWindow(QtGui.formHalloWelt):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi(widgHalloWelt.ui, self)

    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
Und das Traceback:

Traceback (most recent call last):
File "C:/...QtHalloWelt.py", line 4, in <module>
class MainWindow(QtGui.formHalloWelt):
AttributeError: 'module' object has no attribute 'formHalloWelt'

Process finished with exit code 1

Hm, das heisst wohl, dass ich das Argument von "MainWindow" noch nicht so recht verstanden habe. Was muss denn da rein, wenn nicht der Name des Widgets?

LG SG ;-)
Me.PEBKAC ^^
BlackJack

@SG ;-): `MainWindow` hat kein Argument. In die Klammern gehört eine Basisklasse. Und bei Dir steht da `QtGui.formHalloWelt`, also das `QtGui`-Modul aus dem `PyQt5`-Package. Und das hat ganz sicher kein Attribut `formHalloWelt`. Ich vermute mal Dein `MainWindow` soll von `QtGui.QMainWindow` erben.

Und beim `loadUi()`-Aufruf möchtest Du vieleicht einen Dateinamen als Zeichenkette angeben. Denn sonst fliegt Dir dort ein `NameError` um die Ohren weil der Name `widgHalloWelt` nirgends definiert wurde.

Der Rest des Programms ist dann immer noch falsch eingerückt, beziehungsweise fehlt da vielleich eine Funktionsdefinition in der das Hauptprogramm dann steht.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@BlackJack

Ah ok.

Ich dachte, ich müsste in Zeile 4 den Objektnamen angeben, statt dessen muss ich von der Klasse "Widgets" erben. (QMainWindow funktioniert da nicht, weil, wie gesagt, ein Widget) Ich nehme an, es muss richtig dann "QWindow" heißen, jedenfalls liefert das keinen Fehler.

Beim `loadUi()`-Aufruf hatte ich den Text einfach aus einem Thread hier kopiert, aber klar, da müssen Anführungszeichen hin.

Code geändert wie folgt:

Code: Alles auswählen

import sys
from PyQt5 import QtGui, uic

class MainWindow(QtGui.QWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi("widgHalloWelt.ui", self)

app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
Aber es fehlert weiterhin:

Traceback (most recent call last):
File "C:/...QtHalloWelt.py", line 9, in <module>
app = QtGui.QApplication(sys.argv)
AttributeError: 'module' object has no attribute 'QApplication'

Process finished with exit code 1
Me.PEBKAC ^^
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Fehlermeldung sagt eigentlich was los ist. Wirf doch einfach mal die Suchmaschine deiner Wahl mit den Suchbegriffen "PyQt5 QApplication" an, dann findest du deinen Fehler selbst.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

SG ;-) hat geschrieben: Traceback (most recent call last):
File "C:/...QtHalloWelt.py", line 9, in <module>
app = QtGui.QApplication(sys.argv)
AttributeError: 'module' object has no attribute 'QApplication'
QApplication gehört seit Qt5 nicht mehr zu QtGui, sondern ist unter QtWidgets zu finden. Auch gibt es da mittlerweile einen Unterschied zwischen QApplication und QGuiApplication.

http://qt-project.org/doc/qt-5/qguiappl ... ml#details
http://qt-project.org/doc/qt-5/qapplica ... ml#details
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Man wundert sich warum Qt5 so unterschiedlich ist vom Qt4.
Atomkraftwerkaktienbesitzer
BlackJack

@Ene Uran: Ach tut man das? Warum ist Windows so unterschiedlich zu DOS? Warum Windows 8 so unterschiedlich zu Windows 7? Warum Python 3 so unterschiedlich zu Python 2? Warum Qt4 so unterschiedlich zu Qt3? Was soll diese ständige Weiterentwicklung… :roll: Ernsthaft‽
Antworten