Startprobleme mit Qt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Hi,
Ich habe mit Qt angefangen und verstehe nicht ganz wie es arbeitet. Mein Code ist sehr einfach:

Code: Alles auswählen

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *

def on_click():
    label.setText("hello")

app=QApplication(sys.argv)
w=loadUi("inter.ui")
button=w.findChild(QPushButton, 'pushButton')
label = w.findChild(QLabel, 'label')

button.clicked.connect(on_click)

w.show()

app.exec_()
Wenn ich das Skript ausführe, wird die GUI aufgebaut (super). Wenn ich das Skript ein 2. Mal ausführe kommt die Fehlermeldung:
QWidget: Must construct a QApplication before a QPaintDevice
und die Shell stürzt ab. Beim Öffnen einer neuen Shell fängt das ganze wieder von vorne an. Kann mir jemand erklären, was da los ist? Wie ist die Meldung zu verstehen? Wie kann ich das Problem beheben, ohne, dass ich jedes Mal eine neue Shell öffnen muss?
BlackJack

@möppi: Was für eine Shell? Irgenwas in einer IDE? Vielleicht sogar IDLE? Vergiss das am besten komplett und starte das Programm ausserhalb der IDE in einem Terminal deines Betriebssystems.

Das `findChild()` ist merkwürdig weil man auf die Elemente eigentlich per Attributzugriff zugreifen kann und dann auch den Widget-Typen nicht angeben muss.

Auf Modulebene sollte das auch alles nicht stehen, das gehört in eine Klasse.
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

BlackJack hat geschrieben:@möppi: Was für eine Shell? Irgenwas in einer IDE? Vielleicht sogar IDLE? Vergiss das am besten komplett und starte das Programm ausserhalb der IDE in einem Terminal deines Betriebssystems.

Das `findChild()` ist merkwürdig weil man auf die Elemente eigentlich per Attributzugriff zugreifen kann und dann auch den Widget-Typen nicht angeben muss.

Auf Modulebene sollte das auch alles nicht stehen, das gehört in eine Klasse.
Die Console von Spyder. Als IDE benutze ich Python xy (Sorry ich hätte mich ein wenig genauer ausdrücken sollen). Ich hatte eigentlich schon vor mit der IDE zu arbeiten, weil diese auch den Qt Designer enthält. Außerdem bin ich nicht so der Freund von Terminals.

Was genau hast du für Einwände gegen findChild? Wie würdest du das machen? Ich hatte vor den Designer nur für die graphische Arbeit zu verwenden. Die Verknüpfungen der widgets möchte ich "von Hand" programmieren, anstatt den Signals and Slots Editor zu verwenden.
BlackJack

@möppi: Beim Entwickeln musst Du dann halt ein Freund von Terminals werden denn im Zweifelsfall wirst Du nur *dort* Ausnahmen oder Fehlermeldungen zu sehen bekommen. Und innerhalb von IDEs läuft so etwas so gut wie immer in einer Umgebung die sich von der tatsächlichen Laufzeitumgebung unterscheidet.

Gegen `findChild()` spricht dass das unnötig kompliziert ist. Die benannten Widgets die man damit finden kann gibt es bereits als Attribute auf dem Objekt das von `loadUi()` zurückgegeben wird. Da kommt man also einfacher und vor allem auch ohne den Typ angeben zu müssen heran. Und man muss dann auch nicht den Namen doppelt angeben wenn man immer über dieses Objekt geht, oder aber bei `loadUi()` ein Objekt angibt, in dessen Kontext die Initialisierung stattfinden soll und auf dem dann diese Attribute gesetzt werden.

Edit:

Code: Alles auswählen

#!/usr/bin/env python
import sys
from functools import partial

from PyQt4.QtGui import QApplication
from PyQt4.uic import loadUi


def main():
    application = QApplication(sys.argv)
    frame = loadUi('inter.ui')
    frame.pushButton.clicked.connect(partial(frame.label.setText, 'hello'))
    frame.show()
    sys.exit(application.exec_())


if __name__ == '__main__':
    main()
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Danke für deine Hilfe
Antworten