QLineEdit createn und wieder deleten, generische Programm..?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Hallo,

ich wollte QLineEdit generieren lassen. Ich habe zwei Funktionen programmiert, dass dies erledigen sollen. Das erstellen von neuen QLineEdits klappt sehr gut, aber das Löschen bereitet mir ein wenig Kopfschmerzen. Bekomme als Meldung:

Code: Alles auswählen

  def createNewTextEditApiKey(self):
        if self.lineEdit_combobox_api.currentText() == 'New Data':
            self.newLineLabel = QLabel('API-KEY')
            self.newLineEdit = QLineEdit()
            self.line_edit_layout_datasource.addWidget(self.newLineLabel)
            self.line_edit_layout_datasource.addWidget(self.newLineEdit)
            text_new_data_created = "New data created"
            self.text_edit.append(text_new_data_created)
        if self.lineEdit_combobox_api.currentText() == 'Delete Data':
            self.deleteData()
   
    def deleteData(self):
            self.newLineEdit.deleteLater()
            self.newLineLabel.deleteLater()
            text_new_data_deleted= "Data deleted"
            self.text_edit.append(text_new_data_deleted)


self.newLineEdit.deleteLater()
RuntimeError: Internal C++ object (PySide.QtGui.QLineEdit) already deleted.
Den letzten Eintrag löscht er logischerweise.

Mit folgender Codezeile übergebe ich die Methode als Event, dass dann ausgeführt werden soll.

Code: Alles auswählen

  self.lineEdit_combobox_api.activated[str].connect(self.createNewTextEditApiKey)
Hatte überlegt an der Stelle "newLineLabel" und "newLineEdit" automatisch zu nummerieren. Da ist mir die generische Programmierung in den Kopf gekommen. Wie kann ich das Problem mit Python lösen? Kann mir da jemand helfen?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Was du da versuchst, ist sehr "gefährlich".

Du instantiierst newLineLabel und newLineEdit jedes Mal neu aber fügst sie dem Layout immer wieder hinzu. Das erzeugt gnadenlos Phantome, was dir die Fehlermeldung verdeutlichen sollte. Wie du siehst, kannst du ohne Probleme Widgets im Layout haben, deren zugrunde liegendes Objekt aber bereits terminiert wurde und somit bei erneuten Zugriffen oder dem Versuch, sie explizit zu entfernen, Fehler entstehen. Da rebelliert doch das Programmierer-Hirn, oder nicht?

Überschreibe die beiden Objekte nicht, sondern erzeuge neue. Beispielsweise in einer Liste. Wenn du dann bestimmte Objekte aus der GUI entfernen willst, setzt du ihren Parent auf None und löschst den Listeneintrag.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Ja, dass Hirn hat sich eingeschaltet und habe es ja hier gepostet :-)
Mein Hirn kann das Problem noch nicht bewältigen. Brauche da ein paar mehr Inputs!

Habe es jetzt folgendermaßen ausprobiert:

Zwei Listen erzeugt und die erzeugten Instanzen in die Liste ge-pusht.
Leider habe ich das selbe problem mit dem löschen wieder. Hatte es auch mal mit einer while schleife versucht, aber da schießt mir alles um die ohren.
@Matmartigan was meinst Du?

Code: Alles auswählen

    
    def createNewTextEditApiKey(self):
        if self.lineEdit_combobox_api.currentText() == 'New Data':
            text, _ = QInputDialog.getText(self, 'Input Dialog', 
            'Enter data name:')
            self.create_list_collection_newlineEdit = []
            self.create_list_collection_newlineLabel = []
            self.newLineEdit = QLabel(text)
            self.newLineLabel = QLineEdit()
            self.create_list_collection_newlineEdit.append(self.newLineEdit)
            self.create_list_collection_newlineLabel.append(self.newLineLabel)
            for i in self.create_list_collection_newlineEdit:
                self.line_edit_layout_datasource.addWidget(i)
            for j in self.create_list_collection_newlineLabel:
                self.line_edit_layout_datasource.addWidget(j)
            text_new_data_created = "New data created"
            self.text_edit.append(text_new_data_created)
    
    def deleteData(self):
        if self.lineEdit_combobox_api.currentText() == 'Delete Data':
                self.newLineEdit.close()
                self.newLineLabel.close()
            text_new_data_deleted= "Data deleted"
            self.text_edit.append(text_new_data_deleted)
        

Weiß nicht, ob es da jetzt Sinn macht in der Funktion "deleteData" direkt auf die Liste zuzugreifen und zu die Daten zu löschen?
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Niemand zu hause?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Wundert es dich wirklich, dass das Problem immer noch besteht? :K

Schau dir doch bitte mal genau an, was du da zusammen geschrieben hast. Ich habe das Gefühl, du wirfst wahllos Zeug zusammen bis es entweder zufällig funktioniert oder bis der Punkt erreicht ist, an dem du den Code dann hier postest.
Wenn du dich der Logik bedienst und dir mal Zeit nimmst, deinen eigenen Code zeilenweise durchzugehen, dann fällt dir sicher auf, dass zwischen deinen beiden letzten Posts keinerlei Unterschied besteht ... oder doch, der Code ist noch schlimmer.

Du erzeugst newLineEdit und newLineLabel als Klasseninstanzvariablen, schiebst die Objekte in eine Liste und beim nächsten Aufruf werden die Variablen erneut erzeugt. Damit sind die Objekte der Liste nicht länger newLineEdit und newLineLabel vom vorherigen Durchlauf. GUI-Programmierung ist nicht zwingend geeignet, um das Konzept OOP zu verstehen bzw. korrekt anzuwenden. Eventuell bietet es sich hier an, dass du erst einmal ohne GUI arbeitest und dich nur ums Data-Handling kümmerst. Ein UserInterface kann man immer auch hinterher an die Funktionalität binden, natürlich vorausgesetzt, die Logik ist sauber. Dadurch verhindert man zudem, dass Logik und Funktionalität mit dem GUI verwoben sind.
Zuletzt geändert von Madmartigan am Dienstag 22. April 2014, 07:35, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würde gerne mehr über den Kontext erfahren! Evtl. handelt es sich um ein XY-Problem... Nur aus dem Kontext können wir ableiten, ob das Erzeugen von GUI-Objekten wirklich notwendig ist. Oftmals reicht es bei dynamischen GUIs aus, ein Element lediglich auszublenden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hyperion hat geschrieben:Ich würde gerne mehr über den Kontext erfahren! Evtl. handelt es sich um ein XY-Problem... Nur aus dem Kontext können wir ableiten, ob das Erzeugen von GUI-Objekten wirklich notwendig ist. Oftmals reicht es bei dynamischen GUIs aus, ein Element lediglich auszublenden.
Mir scheint, das Problem ist hier elementarer. GUI-Programmierung ist nicht wirklich für Einsteiger geeignet, dynamische GUIs sind de facto Königsklasse. Wenn das Management von Objekten bereits Probleme bereitet, sollte man damit anfangen. Es kann sicher nicht schaden, mal einige Zeit nur über die Konsole zu kommunizieren.

Für meinen Geschmack wirft man sich heutzutage zu schnell auf irgendein Framework und überspringt dabei essentielle Etappen.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Ich denke ich habe mein Problem klar und deutlich definiert. Ich möchte dynamisch QLineEdit erzeugen und diese wieder löschen, thats it. Ein Beispiel wäre mir hilfreicher.
BlackJack

@machupicchu: Du hast damit definiert was Du denkst was die Lösung für Dein eigentliches Problem ist. Das ist vielleicht nicht die beste Lösung, denn Leute mit Erfahrung in der GUI-Programmierer finden das Problem das Du definiert hast, ungewöhnlich. Also gibt es vielleicht eine bessere Lösung, das kann man aber nur wissen, wenn man das *eigentliche* Problem kennt.

Und was das Beispiel angeht: Da habe wohl nicht nur ich das Gefühl, dass es Dir nicht wirklich beim Verstehen helfen wird, sondern Dir nur einen Baustein an die Hand gibt, mit dem Du ohne ihn zu verstehen, herumexperimentieren wirst bis es klappt, oder bis Du wieder ankommst und nach einem weiteren „Beispiel” fragst. So lief das ja zumindest bei der Sache mit der Verwaltung von den Objektbäumen bei Qt, was zur Speicherverwaltung wichtig ist.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Sagt doch einfach, dass Ihr mir nicht helfen wollt. Wozu die ganze Moralpredig?
Die Zeit hätte man doch eher sinnvoll für einen Beispiel nutzen können und das Problem wäre aus der Welt geschafft. Wofür und wie ich es verwende oder wie ich es begreife kann Euch doch wurscht sein. :K

Ich habe das mit der Liste gemacht, weil mir das hier empfohlen worden ist. Ich kann auch verschiedene Instanzen über meinen Inputtext erzeugen und diese dann in meinen Layer hinzufügen.

Code: Alles auswählen

def createNewTextEditApiKey(self):
        if self.lineEdit_combobox_api.currentText() == 'New Data':
            text, _ = QInputDialog.getText(self, 'Input Dialog',
            'Enter data name:')
            self.create_list_collection_newlineEdit = []           <---------------------Erzeuge zwei Listen
            self.create_list_collection_newlineLabel = []                          
            textLabel = text + 'Label'
            self.create_list_collection_newlineEdit.append(text)    <--------------------Füge die Objekte in meine liste 
            self.create_list_collection_newlineLabel.append(textLabel)
            for i in self.create_list_collection_newlineEdit:     <--------------------Traversiere meine liste und adde objekte in meinem layout
                self.line_edit_layout_datasource.addWidget(i)
                self.line_edit_layout_datasource.addWidget(j)
            text_new_data_created = "New data created"
            self.text_edit.append(text_new_data_created)
   


    def deleteData(self):
        if self.lineEdit_combobox_api.currentText() == 'Delete Data':
            for j in self.create_list_collection_newlineEdit:  <-------Traversiere meine zuvor erzeugte liste und lösche objekt aus der liste
                  del j
            for k in self.create_list_collection_newlineLabel:
                  del k
            text_new_data_deleted= "Data deleted"
            self.text_edit.append(text_new_data_deleted)

EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

machupicchu hat geschrieben:Sagt doch einfach, dass Ihr mir nicht helfen wollt. Wozu die ganze Moralpredig?
Gerade um dir zu helfen! Und die Antworten waren alle mMn noch sehr nett formuliert, da habe ich zum Teil schon andere Rückmeldungen in Erinnerung. Wenn dir keiner helfen wollte, würde auch keiner antworten. Deswegen habe ich mich nämlich bisher mit Antworten zurückgehalten, weil ich nicht das Gefühl habe, dass du konstruktive Kritik annimst. Und deine letzten Threads zeigen mir, dass du viel durch try-and-error versuchst, ohne die grundlegenden Konzepte verstanden zu haben. Dir dann einen fertigen Quelltext zu geben, mit dem du dann irgendwann wieder an eine Grenze stößt ist keine wirkliche Hilfe.

Und dein Problem ist mir immer noch nicht klar, was soll dein Programm denn machen? Wozu brauchst du die dynamisch erzeugten LineEdits genau? Wenn du das mal ausführlicher erklären könntest, würdest du mit Sicherheit mehr Hilfe bekommen, wie man das Problem ggf. einfacher lösen könnte.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

machupicchu hat geschrieben:Sagt doch einfach, dass Ihr mir nicht helfen wollt. Wozu die ganze Moralpredig?
Die Zeit hätte man doch eher sinnvoll für einen Beispiel nutzen können und das Problem wäre aus der Welt geschafft.
Da verlassen wir nun aber den Bereich der Sachlichkeit. Wohl niemand hier im Forum verweigert seine Unterstützung, wenn andere darum bitten. Gegenteiliges wäre mir neu. Was du als Moralpredigt empfindest, war lediglich der wiederholte Hinweis, dass dich dieser Weg nicht ans Ziel führt und du dich mehr damit auseinander setzen musst. Und da haben wir, Hand aufs Herz, bereits viel Zeit in die Beantwortung deiner ganzen Fragen investiert.

Ein Beispiel kann helfen, wenn die Grundprinzipien funktionieren und man nur den gedanklichen Knoten im Hirn lösen muss. Bei deinen Fragen ist ein Beispiel aber überfordert, weil es dir eventuell eine kurzfristige Lösung anbietet, dich aber langfristig gesehen nicht weiterbringt. Oder willst du bei jeder neuen Änderung in deinem GUI einen Post im Forum absetzen? Das macht doch keinen Sinn, das wirst du zugeben.

Wir haben versucht, dir zu erklären, was du vermeiden solltest, was du ändern kannst, und vor allem worüber du dich besser informieren kannst/solltest. Wenn das keine Hilfe ist, dann weiß ich auch nicht.
machupicchu hat geschrieben:Wofür und wie ich es verwende oder wie ich es begreife kann Euch doch wurscht sein. :K
Wenn das der Fall wäre, müsste man jedem Forum den Sinn absprechen.
BlackJack

@machupicchu: Es macht keinen Sinn Beispiele zu schreiben die Du dann nicht verstehst. Alleine der vorhandene Quelltext ist Unsinnig und zeigt das Du nicht wirklich weisst was Du da tust. Dir fehlen, wie Madmartigan auch schon bemerkt hat, wichtige Grundlagen, die erst einmal noch gar nichts mit GUI zu tun haben, die man aber drauf haben sollte, bevor man sich mit GUIs noch zusätzliche Themen und ein komplettes, umfangreiches Rahmenwerk aufbürdet.

Zum letzten gezeigten Quelltext: Die erste Methode ist unsinnig und nicht lauffähig. Du erzeugst Listen und steckst da *Zeichenketten* (`QString`) hinein, und zwar in jede der beiden Listen genau *ein* Objekt. Weder der Typ der Elemente, noch in eine Liste genau ein Objekt zu stecken, erscheint mir hier sinnvoll. In der Schleife fügst Du dann diese Zeichenketten einem Layout zu, was ebenfalls nicht sinnvoll ist, und wo ich nicht mal überzeugt bin, dass das überhaupt funktioniert. Wo ich sicher bin ist das `j` in der Schleife verwendet wird, aber überhaupt nicht definiert wurde. Und `i` ist ein sehr schlechter Name für Objekte vom Typ `QString`, denn bei Laufvariablen mit Namen wie `i`, `j`, oder `k` erwarten die allermeisten Programmierer das dort ganze Zahlen dran gebunden sind.

In der anderen Methode gehst Du in einer Schleife über Listen und das einzige was in der Schleife gemacht wird, ist den *Namen* der Laufvariablen zu löschen. Was absolut sinnfrei ist, denn das bewirkt letztendlich gar nichts ausser den Namen zu löschen, der im nächsten Schleifendurchlauf wieder an einen anderen Wert gebunden wird (wenn diese Listen denn jemals mehr als ein Element enthalten würden).

``del something`` löscht *Namen* und *keine Objekte*. Da die Objekte noch in der jeweiligen Liste vorhanden sind, wäre das auch ziemlich fatal, denn wenn ``del`` tatsächlich explizit das Objekt löschen würde, was denkst Du denn was passieren sollte wenn man auf das Objekt in der Liste zugreift? In Programmiersprachen bei denen man sich selbst um den dynamisch belegten Speicher kümmern muss, würde man dann auf Speicher zugreifen an dem eventuell schon wieder ganz andere Daten liegen, und so Speicher für etwas benutzen für das er gar nicht mehr vorgesehen ist. Damit korrumpiert man sich üblicherweise die Daten, ohne dass das *sofort* auffällt, und/oder das Programm stürzt hart ab wenn man zum Beispiel ”zufällige” Werte aus dem Speicherbereich als Zeiger verwendet, die aber gar nicht auf RAM zeigen das zum Prozess gehört.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Und dein Problem ist mir immer noch nicht klar, was soll dein Programm denn machen? Wozu brauchst du die dynamisch erzeugten LineEdits genau? Wenn du das mal ausführlicher erklären könntest, würdest du mit Sicherheit mehr Hilfe bekommen, wie man das Problem ggf. einfacher lösen könnte.
Ich probiere aus, um es zu begreifen. Um mit dieser Technik weitere Dinge dynamisch zu erzeugen. Was soll ich Dir bitte noch ausführlicher erklären? Das Programm funktioniert doch, aber nur nicht richtig und ich möchte es richtig machen und verstehen. Hatte es ja auch oft genug gepostet und man kann es doch sehen.

Da steht nichts von Demütigung und Herabsetzung. Vlt solltet Ihr erstmal verstehen was ein Forum ist...... :K
http://de.wikipedia.org/wiki/Internetforum


Wir haben versucht, dir zu erklären, was du vermeiden solltest, was du ändern kannst, und vor allem worüber du dich besser informieren kannst/solltest. Wenn das keine Hilfe ist, dann weiß ich auch nicht.
Wo hast Du denn die Infos, wo ich etwas finden kann? Du hast mir geraten die Instanzen nicht zu überschreiben und das mache ich ja in dem ich meine Intanznamen einlese, neu erzeuge und dann in die liste packe.

Wie auch immer! Ich mach das schon selber! Kein bock mehr hier zu posten, wenn man ständig alles rechtfertigen muss.

@BlackJack, wenn ich es verstehen würde, warum sollte ich dann hier posten ;-) Ich poste doch kein Programm, dass schon funktioniert, dann hätte ich ja kein Problem, logisch? ;-)
Das GUI nichts für Anfänger sei halte ich für unfug. Ich habe mit Qt vor zwei Wochen begonnen und lernen tut man durch herumprobieren bzw. durch programmieren. Wenn alles gleich funktionieren würde, dann bräuchte man ja nicht mehr lernen. Klar hat man Defizite, aber die schließt man eben, wenn man mit Problemen konfrontiert wird.
BlackJack

@machupicchu: Natürlich überschreibst Du die Instanzen immer noch, das wurde Dir aber auch schon gesagt. Ob Du nun direkt das Attribut überschreibst, oder die Liste die immer genau diesen einen Wert enthält, macht keinen Unterschied. Letzteres ist nur unnötig komplizierter. Ausserdem sind hier mehrere der Meinung, dass GUI-Programmierung vielleicht noch nicht das richtige für Dich ist, Du hast nämlich noch deutlich grundlegendere Verständnisprobleme wie das mit Werten und OOP funktioniert.

Du willst dynamisch etwas aus einem Layout entfernen, was Du vorher mal dynamisch dort hinzugefügt hast. Dazu musst Du Dir offensichtlich merken was Du hinzugefügt hast, um das dann später auch wieder aus dem Layout (explizit) entfernen zu können.

Edit: Es gibt einen unterschied zwischen Quelltext bei dem der Autor ein Detail nicht versteht, oder etwas falsch verstanden hat, und solchem der gänzlich unsinnig und nach wildem herumprobieren ohne Sinn und Verstand aussieht. Man muss auch mal ausprobieren, aber systematisch und nicht einfach alles durchprobieren bis irgendwas zufällig funktioniert. Und wenn etwas nicht funktioniert sollte man auch verstehen warum es nicht funktioniert, damit man tatsächlich etwas dabei lernt. Zum Beispiel dem Vorschlag folgen sich mal Zeile für Zeile klar machen warum die umgesetzte ”Lösung” mit den Listen vom Effekt her nichts anderes ist als das direkte überschreiben von Attributen mit den vorherigen Widget-Objekten, nur eben etwas umständlicher. Und das ist etwas was überhaupt nichts mit GUI-Programmierung zu tun hat, sondern viel grundlegender ist.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Ok! Ich fang mal von vorne an!
Ich hatte folgende Vorüberlegungen angestellt:
Hinweis: Szenario 3 kam für mich am ehesten in Frage.

Szenario 1:
Ich füge ein erzeugtes Objekt in die Liste.

Code: Alles auswählen

person_list = []

line_edit = QLineEdit('Personen')

person_list.append(line_edit)
Möchte ja mehrere Objekte erzeugen, deshalb kommt dies nicht in Frage.

Szenario 2:
Erzeuge 10 Objekte und füge sie meiner Liste hinzu

Code: Alles auswählen

for i in range(0, 9):
      line_edit = raw_input("Line edit name: ")
      person_list = []
      line_edit = QLineEdit('Personen')
      person_list.append(line_edit)
Durch ein Buttonklick event wird nur das erste Objekt in meine Liste hinzugefügt und immer wieder überschrieben.
Das kommt also nicht in Frage.

Szenario 3:
Nutze insert und len Funktionen, um mein Objekt am Ende der Liste zu setzen.

Code: Alles auswählen

 line_edit = raw_input("Line edit name: ")
      person_list = []
      line_edit = QLineEdit('Personen')
      count_list = len(person_list)
      person_list.insert(count_list - 1, line_edit)
Dies dürfte eher meinen Erwartungen entsprechen.

Szenario 3, nun auf mein Qt Programm bezogen.
Erzeuge vorerst nur Label Objekte. Füge mein neu erzeugtes Objekt am Ende meiner Liste.
Dadurch dürften die anderen Objekte nicht überschrieben werden.

Code: Alles auswählen

def createNewTextEditApiKey(self):
        if self.lineEdit_combobox_api.currentText() == 'New Data':
            text_line_label, _ = QInputDialog.getText(self, 'Input Dialog',
            'Enter data name:')
            self.create_list_collection_newlineLabel = []  
            text_line_label = QLabel(text_line_label)
            list_len_label = len(self.create_list_collection_newlineLabel)
            self.create_list_collection_newlineLabel.insert(list_len_label - 1, text_line_label)
            #Möchte jetzt nun iwie traversiert meine Liste mit den Objekten in mein Layer bekommen
            objects_from_list = [x for x in self.create_list_collection_newlineLabel]
            self.line_edit_layout_datasource.addWidget(objects_from_list)
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Problem bei Szenario 2:

Code: Alles auswählen

for i in range(0, 9):
    line_edit = raw_input("Line edit name: ")
    person_list = []
    line_edit = QLineEdit('Personen')
    person_list.append(line_edit)
Die Liste wird niemals länger als ein Element, da sie, wie bereits mehrere Mal angesprochen, jedes Mal neu erzeugt wird. Es liegt also nicht am ButtonClick, sondern daran, dass deine Schleife bei jedem Durchlauf das Listenobjekt neu baut.

Problem bei Szenario 3:

Code: Alles auswählen

line_edit = raw_input("Line edit name: ")
    person_list = []
    line_edit = QLineEdit('Personen')
    count_list = len(person_list)
    person_list.insert(count_list - 1, line_edit)
count_list ist immer(!) 0. Daher wird hier immer der Index -1 an insert(index, object) übergeben. Das kann nicht funktionieren.
Warum wird line_edit zwei Mal verwendet, für gänzlich unterschiedliche Ziele?

Gleiches gilt dementsprechend auch für "Szenario 3, nun auf mein Qt Programm bezogen.".
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Ok, dass hat mir schon ein wenig weitergeholfen.
Mir war nicht klar, dass die Liste nicht erweitert wird und immer beim Index 0 bleibt.
Habe das Problem jetzt folgendermaßen gelöst:

Code: Alles auswählen

 list_label = [] 
 count = len(list_label) -1
    
   
     
    def createNewTextEditApiKey(self):
        if self.lineEdit_combobox_api.currentText() == 'New Data':
            text, _ = QInputDialog.getText(self, 'Input Dialog',
            'Enter data name:')
            self.new_line_label = QLabel(text)
            self.list_label.append(self.new_line_label)
            self.line_edit_layout_datasource.addWidget(self.new_line_label)
        print self.list_label
          
     
    def deleteData(self):
        if self.lineEdit_combobox_api.currentText() == 'Delete Data':
            del self.list_label[self.count]



Möchte jetzt parallel zu meiner Liste auch die Objekte von meiner GUI Oberfläche löschen.
Mir ist klar, dass ich immer das selbe Objekt anspreche und es deshalb nicht funktioniert. Komme da leider nicht weiter.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Mir war nicht klar, dass die Liste nicht erweitert wird und immer beim Index 0 bleibt.
Sie wird schon erweitert, du überschreibst die Liste aber immer wieder mit einer leeren Liste.
Mir ist klar, dass ich immer das selbe Objekt anspreche und es deshalb nicht funktioniert. Komme da leider nicht weiter.
Der Wert self.count ändert sich ja auch nicht. Der Wert wird nicht automatisch aktualisiert, wenn du ein Element zur Liste hinzufügst:

Code: Alles auswählen

In [1]: list_label = []
In [2]: count = len(list_label)-1
In [3]: count
Out[3]: -1
In [4]: list_label.append('foo')
In [5]: count
Out[5]: -1
Eigentlich willst du auch keinen Counter für den Index, da du ja mit Sicherheit kontrollieren willst, welches Label gelöscht werden soll. Wenn du immer nur das letzte Label löschen wills, greifst du mit lable_list[-1] darauf zu. Zu del hat meine ich BlackJack schon weiter oben was geschrieben.

Nochmal (keine Moralpredigt, sondern als Hilfe): Du machst den zweiten Schritt vor dem ersten, da diese Probleme die absoluten Grundlagen in Python darstellen, hier z.B. richtiges Verwenden von Listen und Variablen. Versuche doch erstmal ein Einsteiger-Tutorial durchzuarbeiten, bevor du dich in die GUI-Programmierung stürzt.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

@EmaNymton
Danke erstmal für Deine Nachricht.
Ich habe immernoch das Problem und ich werde kein Einsteiger Tutorial besuchen, solange ich das Problem nicht gelöst habe. Wir können ein Kompromiss eingehen. Du zeigst mir wie ich das Problem lösen kann, anhand eines Beispiels. Danach werde ich ein Einsteiger Tutorial besuchen.

Dann habt Ihr Eure Ruhe und ich mein Ziel erreicht. ;-)

Ja, den counter hatte ich vorerst in meiner delete Funktion. Aber hatte ja auch geschrieben, dass ich es mit dem delete nicht gebacken kriege. Habe ja jetzt die Objekte in die Liste bekommen. Habe es jetzt nochmal erweiter bzw. verbessert.

Code: Alles auswählen

list_label = []
    def createNewTextEditApiKey(self):
        if self.lineEdit_combobox_api.currentText() == 'New Data':
            text, _ = QInputDialog.getText(self, 'Input Dialog',
            'Enter data name:')
            self.new_line_label = QLabel(text)
            self.list_label.append(self.new_line_label)
            label_objects = [x for x in self.list_label]
            self.line_edit_layout_datasource.addWidget(label_objects)
        print self.list_label                                                                 
         
     
    def deleteData(self):
        if self.lineEdit_combobox_api.currentText() == 'Delete Data':
            #count = len(self.list_label) -1
            #print count
            del self.list_label[-1] #Liste wird gelöscht


Hier fehlt mir nur noch der Ansatz, um die Objekte von meinem Layout zu löschen.
Antworten