Generierung dynamischer QLineEdit-Felder abhängig vom User-Input

Hi liebe Python-Experte Ich möchte in Python ein Programm schreiben, dass beliebige Daten in eine Datenbank platziert. Zuerst fragt es den User nach dem Namen der Datenbank. Wenn die angegebene Datenbank vorhanden ist, dann macht er nicht und bringt die Meldung, dass sie bereits vorhanden ist und neue Daten hineingefüllt werden können. Wenn nicht, wird dann eine neue kreiert. Vorher wird aber gefragt, aus wie vielen Spalten (Elementen ausser ID) bestehen soll. Hierfür wird ein Dialogfenster geöffnet, das durch eine SpinBox die Anzahl der Spalten angegeben werden kann. Im nachfolgenden Link aus meiner Repository habe ich zwei Python-Files abgelegt. https://github.com/mohsen-owzar/dynamic_lineedits Das eine File mit "_orig" im File-Namen habe ich beim Googeln gefunden, dass abhängig von dem eingestellten Wert der SpinBox genauso viele QLineedit-Felder erzeugt, deren Einträge mit "Apply"-Button auf die Konsole ausgegeben oder zu einer anderen Funktion übergeben werden können. Ich wollte in dem anderen File meine Idee umsetzen, dass bei der Auswahl der Anzahl der Spalten der Datenbank in einem Eintrag statt jeweils einem QLineEdit, zwei QLineEdit-Felder oder QComboBoxes ausgegeben werden. Alle meiner Versuche waren vergeblich und konnte nicht die Funktionalität der Original-Version mit meinen Wünschen hinzubekommen. Als erstes soll der Unterschied beim Erscheinen der QLineEdit-Felder erwähnt werden, dass bei der Original-Version die Felder von oben nach unten erzeugt werden, während sie bei meiner Version von unten nach oben erscheinen. Es müsste irgendwie mit dem Befehl "addStetch(2)" auf Zeile 41 zu tun haben. Ausserdem erscheint eine Fehlermeldung bei der Zahl "3" der QSpinBox (die ersten Male für "1" und "2" kommt keine Fehlermeldung), dass das Objekt keine Attribute "widget" besitzt, woraus ich nicht schlau werde. Nachfolgen ist die Fehlermeldung: ======================================================== Original exception was: Traceback (most recent call last): File "C:\Users\m.owzar\Desktop\QDialogs_Stuff\PythonScripts\lineedit_dynamic.py", line 70, in set_item_count self.hbox[ii].itemAt(ii).widget().show() AttributeError: 'NoneType' object has no attribute 'widget' ======================================================== Warum ich zwei QLineEdit-Felder oder QComboBoxes in meiner GUI haben möchte, liegt daran, dass bei der Datenbank-Generierung für jede zu erzeugende Spalte ein Feld für den Header und ein Feld für den Datentyp angegeben werden muss. Und warum ich vielleicht auch QComboBox haben möchte, ist deswegen, dass der User aus verschieden Datentypen einen auszuwählen und nicht einzutippen braucht. Ich wäre sehr dankbar und äussert glücklich, dass ein Python-Expert einen Blick auf mein Problem wirft, und mir sagt, wodurch meine Fehlermeldung entsteht und wie ich dieses Problem beheben kann. Beste Grüsse Mohsen Owzar

Ausserdem erscheint eine Fehlermeldung bei der Zahl "3" der QSpinBox (die ersten Male für "1" und "2" kommt keine Fehlermeldung), dass das Objekt keine Attribute "widget" besitzt, woraus ich nicht schlau werde. Nachfolgen ist die Fehlermeldung: ======================================================== Original exception was: Traceback (most recent call last): File "C:\Users\m.owzar\Desktop\QDialogs_Stuff\PythonScripts\lineedit_dynamic.py",
Hi, ich bin zwar kein Qt Experte, aber diese Zeilen schauen falsch aus: #70 und #73. Einmal das: # Zeile 70 ```self.hbox[ii].itemAt(ii).widget().show()``` # .itemAt(ii) - einmal zeigt "ii" auf "self.hbox" (findet etwas und dann suchst du mit gleichem Wert von "ii" das "itemAt". Zeile 73 hat auch diesen kleinen Fehler. Ich bin mir nur nicht sicher ob du den Befehl wirklich brauchst, vermutlich willst du immer 2 (zwei) Widgets einblenden. Also "linkes" und "rechtes" QLineEdit oder deren übergeordneten Layout-Container. Also, wenn du ".itemAt" brauchst dann eher so mit ".itemAt(0)" und ".itemAt(1)" für jeden "self.hbox[ii]"-Container. LG Jan On 22.02.22 12:43, Mohsen Owzar wrote: line 70, in set_item_count
self.hbox[ii].itemAt(ii).widget().show() AttributeError: 'NoneType' object has no attribute 'widget' ========================================================

Jan schrieb am Dienstag, 22. Februar 2022 um 20:23:10 UTC+1:
Hi,
ich bin zwar kein Qt Experte, aber diese Zeilen schauen falsch aus: #70 und #73.
Einmal das: # Zeile 70 ```self.hbox[ii].itemAt(ii).widget().show()```
# .itemAt(ii) - einmal zeigt "ii" auf "self.hbox" (findet etwas und dann suchst du mit gleichem Wert von "ii" das "itemAt".
Zeile 73 hat auch diesen kleinen Fehler.
Ich bin mir nur nicht sicher ob du den Befehl wirklich brauchst, vermutlich willst du immer 2 (zwei) Widgets einblenden. Also "linkes" und "rechtes" QLineEdit oder deren übergeordneten Layout-Container.
Also, wenn du ".itemAt" brauchst dann eher so mit ".itemAt(0)" und ".itemAt(1)" für jeden "self.hbox[ii]"-Container. ================================================ Hi Jan, Danke für Deine rasche Antwort und, dass Du auch die zwei Zeilen im Visier genommen hast. Ich denke auch, dass es an der Indizierung von hbox[ii] liegt, dass ich vielleicht ein nicht vorhandenes Objekt zeigen oder entfernen möchte. Ich habe versucht in PyCHarm zu debuggen, kam ich aber irgendwie nach einer Weile durcheinander und wusste nicht mehr, auf welches Objekt "ii" zeigt. Ich glaube aber, dass diese zwei Zeilen unbedingt sein müssen, wie aus dem Original-File hervorgeht, das auch in meiner Git-Repository vorhanden ist. Wie ich es verstanden habe, ist die Zeile 70 für den Fall, dass mit der SpinBox die Werte hochgezählt werden. Bei jedem Hochzählen muss das neu entstandene QLineEdit-Feld (oder in meinem Fall zwei Edit-Felder) gezeigt werden, daher "widget().show()". Und die Zeile 73 ist für jedes Herunterzählen, dass das vorhandene zuletzt hinzugefügte QLineEdit-Feld entfernt werden muss, daher "widget().hide()" Ich werde aber weitersuchen und hoffe, dass auch noch jemand anders seinen Senf dazu gibt. Das, was ich auch nicht verstanden habe, ist, warum bei der Originalversion die Felder von oben nach unten generiert werden, während bei mir umgekehrt von unten nach oben erscheinen. Ich werde Deinen Vorschlag mit ".ItemAt(0)" auch ausprobieren. LG Mohsen

Am 22.02.22 um 12:43 schrieb Mohsen Owzar:
File "C:\Users\m.owzar\Desktop\QDialogs_Stuff\PythonScripts\lineedit_dynamic.py", > line 70, in set_item_count self.hbox[ii].itemAt(ii).widget().show() AttributeError: 'NoneType' object has no attribute 'widget' mir sagt, wodurch meine Fehlermeldung entsteht > und wie ich dieses Problem beheben kann.
Diese Meldung besagt mit mit hoher Wahrscheinlichlichkeit das self.hbox[ii].itemAt(ii) keinen Wert zugewiesen bekam. Vor der Zeile ein print(ii) einfügen und dann mit diesem Wert weiter vorne suchen. Das zweite ii in obiger Zeile kommt mir allerdings verdächtig vor. Hermann der bei Fehlersuche des öfteren Ausgaben in Test Dateien ( manchmal in html-Format) verwendet. -- http://www.hermann-riemann.de

Hermann Riemann schrieb am Mittwoch, 23. Februar 2022 um 16:43:08 UTC+1:
mir sagt, wodurch meine Fehlermeldung entsteht > und wie ich dieses Problem beheben kann. Diese Meldung besagt mit mit hoher Wahrscheinlichlichkeit das self.hbox[ii].itemAt(ii) keinen Wert zugewiesen bekam. Vor der Zeile ein print(ii) einfügen und dann mit diesem Wert weiter vorne suchen.
Danke Hermann, Ich habe Deinen Vorschlag befolgt und sogar für jede Variable eine Print-Anweisung am Anfang jeder FOR-Loop geschrieben. Bei der ersten und der zweiten Erhöhung des SpinBox-Wertes kommen die Print-Anweisungen ohne Fehlermeldung heruas. Sobald zum dritten Mal der Wert der SpinBox erhöht wird, erscheinzt die Fehlermeldung. Es sieht aber alles gut aus. Warum er abstürzt, ist unklar. Ich habe in meiner Git-Repository das File mit den Print-Anweisungen hinzugefügt. Du kannst es laufen lassen und sehen, dass nichts Ungewöhnliches ausgegeben wird.
Das zweite ii in obiger Zeile kommt mir allerdings verdächtig vor. Was meinst Du mit dem zweiten "ii in obiger Zeile"? Du meinst das "ii" in den Klammern von "itemAt(ii)?
LG Mohsen

On 23.02.22 19:34, Mohsen Owzar wrote:
Hermann Riemann schrieb am Mittwoch, 23. Februar 2022 um 16:43:08 UTC+1:
mir sagt, wodurch meine Fehlermeldung entsteht > und wie ich dieses Problem beheben kann. Diese Meldung besagt mit mit hoher Wahrscheinlichlichkeit das self.hbox[ii].itemAt(ii) keinen Wert zugewiesen bekam. Vor der Zeile ein print(ii) einfügen und dann mit diesem Wert weiter vorne suchen.
Bei der ersten und der zweiten Erhöhung des SpinBox-Wertes kommen die Print-Anweisungen ohne Fehlermeldung heruas. Sobald zum dritten Mal der Wert der SpinBox erhöht wird, erscheinzt die Fehlermeldung. Es sieht aber alles gut aus. Warum er abstürzt, ist unklar.
Es ist eigentlich "ganz einfach". Im ersten und zweiten durchlauf hat das "ii" den Wert 0 und 1, dann 2, beim nächsten Schleifendurchlauf "3" - das "item.at(2)" (2 == ii) wirft aber einen Fehler, weil nur 2 (zwei!) Elemente in der "self.hbox[ii]" drin sind die aktuell gewählt ist - auf Schleifenindex 0 und 1.
Das zweite ii in obiger Zeile kommt mir allerdings verdächtig vor. Was meinst Du mit dem zweiten "ii in obiger Zeile"? Du meinst das "ii" in den Klammern von "itemAt(ii)?
Genau das, das ItemAt hat den Wert 3 oder höher und du versuchsts auf etwas zuzugreifen was nicht da ist. Daher wäre es korrekt so - hier im Beispiel mit 3. "self.hbox[3].itemAt(0).widget..." Und so weiter. Das "self.hbox" ist korrekt und wird auch gefunden. Das "itemAt(ii)" ist falsch. Teste das mal mit "itemAt(0)" und oder "itemAt(1)" in der gleichen Schleife. Und nicht mit "ii", das "ii" gilt nur für die "self.hbox". LG Jan

Jan schrieb am Mittwoch, 23. Februar 2022 um 19:55:01 UTC+1:
Genau das, das ItemAt hat den Wert 3 oder höher und du versuchsts auf etwas zuzugreifen was nicht da ist.
Daher wäre es korrekt so - hier im Beispiel mit 3. "self.hbox[3].itemAt(0).widget..."
Und so weiter. Das "self.hbox" ist korrekt und wird auch gefunden. Das "itemAt(ii)" ist falsch. Teste das mal mit "itemAt(0)" und oder "itemAt(1)" in der gleichen Schleife. Und nicht mit "ii", das "ii" gilt nur für die "self.hbox".
Hi Jan, Danke für Deine Eklärung, dass Du Licht ins Dunkeln brachtest. Ich habe an der Stelle von dem zweiten "ii" eine "0" eingesetzt und es hat funktioniert. Das, was ich immer nocht verstehe, wurum die Orignalversion mit dem zweiten "ii"funktioniert hat. Ausserdem, warum erdcheinen bei mir die Edit-felder von unten und in der Originalversion von oben? LG Mohsen

On 25.02.22 07:04, Mohsen Owzar wrote:
Danke für Deine Eklärung, dass Du Licht ins Dunkeln brachtest. Ich habe an der Stelle von dem zweiten "ii" eine "0" eingesetzt und es hat funktioniert.
Gern geschehen. Schön das es jetzt funktioniert.
Das, was ich immer nocht verstehe, wurum die Orignalversion mit dem zweiten "ii"funktioniert hat.
Schau mal hier: # Zeile 50: https://github.com/mohsen-owzar/dynamic_lineedits/blob/29e268f9b6c4f9539f6bc... # Zeile 50 self.item_layout.itemAt(ii).widget().show() ---- Im Item Layout wird das "ii" nur benutzt, um das Element "ii" über "itemAt(ii)" anzusprechen. Bei dir hast du für jedes der zwei (2) Inputs einen (1) Container "self.hbox" auf die du mit dem Counter "ii" zugreifst. Daher funktioniert das auch im Original und bei dir so nicht.
Ausserdem, warum erdcheinen bei mir die Edit-felder von unten und in der Originalversion von oben?
# Zeile 79 https://github.com/mohsen-owzar/dynamic_lineedits/blob/29e268f9b6c4f9539f6bc... #Zeile 79 """ for ii in range(self.item_count, new_count): """ ---- Ich schätze es liegt daran, dass du den Zähler mit "self.item_count" startest und nicht bei Null (0), 0 = "von vorne/oben" - so deute ich zumnindest den Code. LG Jan

Jan schrieb am Freitag, 25. Februar 2022 um 17:53:40 UTC+1:
Schau mal hier: # Zeile 50: https://github.com/mohsen-owzar/dynamic_lineedits/blob/29e268f9b6c4f9539f6bc...
# Zeile 50 self.item_layout.itemAt(ii).widget().show()
Im Item Layout wird das "ii" nur benutzt, um das Element "ii" über "itemAt(ii)" anzusprechen. Bei dir hast du für jedes der zwei (2) Inputs einen (1) Container "self.hbox" auf die du mit dem Counter "ii" zugreifst. Daher funktioniert das auch im Original und bei dir so nicht.
Ausserdem, warum erdcheinen bei mir die Edit-felder von unten und in der Originalversion von oben?
# Zeile 79 https://github.com/mohsen-owzar/dynamic_lineedits/blob/29e268f9b6c4f9539f6bc...
#Zeile 79 """ for ii in range(self.item_count, new_count): """
Wow, jetzt sind die Groschen gefallen.
Ich schätze es liegt daran, dass du den Zähler mit "self.item_count" startest und nicht bei Null (0), 0 = "von vorne/oben" - so deute ich zumnindest den Code.
OK, ich muss mich noch einmal damit beschäftigen, ob es wirklich so ist. Ich bedanke mich noch einmal bei Dir für Deine Geduld. LG Mohsen
participants (3)
-
Hermann Riemann
-
Jan
-
Mohsen Owzar