Kurze Frage zwecks Labelerstellung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hallo Zusammen,

ich habe eine kurze Frage zu diesem Programm:

Code: Alles auswählen

from PyQt5 import QtCore, QtGui, QtWidgets
import sys 

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(641, 469)
        self.fr_1 = QtWidgets.QFrame(Dialog)
        self.fr_1.setGeometry(QtCore.QRect(80, 60, 481, 151))
        self.fr_1.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.fr_1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.fr_1.setObjectName("fr_1")
        self.b1_create = QtWidgets.QPushButton(self.fr_1)
        self.b1_create.setGeometry(QtCore.QRect(60, 40, 89, 25))
        self.b1_create.setObjectName("b1_create")
        self.b1_create.setText("create")
        self.b1_create.clicked.connect(self.createLabel)
   #    self.label_2 = QtWidgets.QLabel(self.fr_1)
   #    self.label_2.setGeometry(QtCore.QRect(60, 80, 161, 17))
   #    self.label_2.setObjectName("label_2")
   #    self.label_2.setText("Hoch much textfields?")
    #   self.createLabel()

    def createLabel(self, Dialog):
        self.label_2 = QtWidgets.QLabel(self.fr_1)
        self.label_2.setGeometry(QtCore.QRect(60, 80, 161, 17))
        self.label_2.setObjectName("label_2")
        self.label_2.setText("Hoch much textfields?")
    

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
#   ui.createLabel()
    Dialog.show()
    sys.exit(app.exec_())
Weshalb wird das label_2 in der Funktion "createLabel" nicht erzeugt bzw. angezeigt? Wenn ich diese Funktion über das Objekt ui.createLabel() aufrufe, dann wird alles wunderbar erzeugt. Es klappt auch, wenn ich aus der setupUi() Funktion heraus diese Funktion aufrufe.

Mein Problem, sobald ich allerdings aus der GUI heraus auf den Button "create" klicke, passiert nichts. Was müsste ich ändern, damit das label_2 auch aus der GUI heraus mittels Klick auf den Button erzeugt wird? Kann mir auch jemand sagen, weshalb hier nichts passiert? Ich komme gerade leider nicht darauf :-/

Besten Dank im voraus,
m.g.o.d
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil dein createLabel ein extra Argument entgegen nimmt, das aber von einem click-Signal nicht bereit gestellt wird. Das musst du also irgendwie anders bereitstellen.
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

__deets__ hat geschrieben: Sonntag 26. Juli 2020, 19:18 Weil dein createLabel ein extra Argument entgegen nimmt, das aber von einem click-Signal nicht bereit gestellt wird. Das musst du also irgendwie anders bereitstellen.
Ohne das Dialog Argument ist es leider genau so. Die Funktion ist jedenfalls korrekt verbunden, das habe ich getestet.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Aus der generierten Datei wurde anscheinend der Kommentar entfernt in dem steht das man in dieser Datei nichts ändern soll. Wobei mir auch nicht so ganz klar ist warum hier überhaupt Quelltext generiert wird, wir hatten das doch schon mit `loadUi()`, warum also dieser Rückschritt ins finstere Zeitalter generierten Quelltextes‽

Und Layouts werden auch nichts verwendet.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es hilft nicht, wenn du erzählst was du vermeintlich machst. Zeig den GENAUEN Code, der nicht geht. Wenn das Argument nicht da Problem ist, wo ist der Code ohne, und der dann auch belegt, dass es geht?

Nachtrag: how much fragt im englischen nach der Menge an nicht diskret abzählbaren Dingen. Also zb how much money did you pay? Weil Geld prinzipiell ja unendlich teilbar ist. Wenn man nach einer Anzahl fragt, ist das “many”. How many apples did you buy?
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

__blackjack__ hat geschrieben: Sonntag 26. Juli 2020, 20:24 Aus der generierten Datei wurde anscheinend der Kommentar entfernt in dem steht das man in dieser Datei nichts ändern soll. Wobei mir auch nicht so ganz klar ist warum hier überhaupt Quelltext generiert wird, wir hatten das doch schon mit `loadUi()`, warum also dieser Rückschritt ins finstere Zeitalter generierten Quelltextes‽

Und Layouts werden auch nichts verwendet.
Danke für deine Antwort. Die aus Qt Designer erstellte GUI möchte ich während der Laufzeit des Programms mit neuen Input-Widgets versehen. In einem Frame kann ich bspw. wählen, wieviele Eingabefelder ich benötige (um z.B. eine Datenbank via GUI zu erstellen und eingeben zu können, wieviel Spalten ich anlegen möchte).

Mit dem Sourcecode hier möchte ich also testen, wie ich Widgets über eine extra Funktion (während der Laufzeit) zusätzlich zu denen erstelle, die ich aus dem Qt Designer heraus beim Start des Programms erstelle...
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

__deets__ hat geschrieben: Sonntag 26. Juli 2020, 20:44 Es hilft nicht, wenn du erzählst was du vermeintlich machst. Zeig den GENAUEN Code, der nicht geht. Wenn das Argument nicht da Problem ist, wo ist der Code ohne, und der dann auch belegt, dass es geht?

Der Code, der nicht geht, steht da. Ich rufe eine Funktion createLabel() auf, welche nicht die Labels erstellt bzw. anzeigt, die es soll. An den auskommentierten Zeilen funktioniert der Code, nur eben nicht innerhalb der Funktion...und ich weiss nicht warum.

Nachtrag: how much fragt im englischen nach der Menge an nicht diskret abzählbaren Dingen. Also zb how much money did you pay? Weil Geld prinzipiell ja unendlich teilbar ist. Wenn man nach einer Anzahl fragt, ist das “many”. How many apples did you buy?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Wie __blackjack__ dir bereits in dem anderen Thread erklärt hat:
Benutze Layouts und auf die muss man Widgets adden.

Aber, wie auch schon in dem anderen Thread angemerkt: es ist ausgesprochen ungewöhnlich Widgets zur Laufzeit einzufügen. Dafür gitb es Widgets, die während der Laufzeit dynamisch Daten aufnehmen und darstellen können. In deinem Datenbank-GUI-Fall: Zum Beispiel eine Tabelle.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code den du zeigst geht NICHT wenn man die Zeile ein kommentiert. Denn die übergibt das geforderte Argument nicht.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@m.g.o.d: Dein Klassendesign ist seltsam. Was soll UI_Dialog denn repräsentieren? Die Klasse hat zwei Methoden und beiden muss als Argument etwas identisches übergeben werden.
UI_Dialog sollte einen schönen Namen bekommen und von QDialog abgeleitet sein.
So wie sie jetzt ist, ist deine Klasse keine Klasse sondern eine unvorteilhafte Bündelung von zwei Funktionen, die in keinem Bezug zueinander stehen.

Wenn du schon GUI-Code mit der Hand schreiben willst, dann mach das richtig und orientiere dich nicht an dem, was der Designer erzeugt.
Lies dich in obejektorientierte Programmierung ein und sxhnapp dir etwas, was dir erklärt, wie man GUIs mi Qt baut.
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

sparrow hat geschrieben: Sonntag 26. Juli 2020, 20:59 Wie __blackjack__ dir bereits in dem anderen Thread erklärt hat:
Benutze Layouts und auf die muss man Widgets adden.

Aber, wie auch schon in dem anderen Thread angemerkt: es ist ausgesprochen ungewöhnlich Widgets zur Laufzeit einzufügen. Dafür gitb es Widgets, die während der Laufzeit dynamisch Daten aufnehmen und darstellen können. In deinem Datenbank-GUI-Fall: Zum Beispiel eine Tabelle.
Danke für den Hinweis mit der Tabelle. Das hat mir geholfen.
Antworten