Erzeugung eines Entrys mit einer Schleife

Fragen zu Tkinter.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Ich möchte mit meinem Programm die Datenbank beschreiben mittels Eingabefeld "Entry", da sind noch keine Values vorhanden! Die Datenbank wird nur erzeugt um einen dauerhaften Speicher zu haben. Diese müssen erst erzeugt werden und dann wird der Rest erst weiter verarbeitet.
Hast du hierfür vielleicht ein Beispiel wie man ein Eingabefeld dynamisch anlegen kann?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wir drehen uns hier im Kreis. Solange Du nicht genau beschreiben kannst, was Du möchtest, wirst Du auch nicht in der Lage sein, das per Python auszudrücken.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Ich suche nach einer Möglichkeit, wie ich zum einem ein Entry dynamisch darstellen kann [eventuell besitzt tkinter auch ein anderes Eingabefeldmethode die besser für dynamische eingaben und weiterverarbeitung ist, hierfür kenne ich mich aber nicht aus]und die Eingaben die erfolgen direkt einer Liste zugeordnet werden.
Ich bin mittlerweile soweit, dass zwar Entrys die unabhängig voneinander sind erzeugt werden, aber die Übergabe in die Liste funktioniert nicht, es wird immer nur das letzte Elemente bei der betätigung mit Return angehängt.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wir haben hier zwei Probleme. Das erste ist, dass Du einen Fehler in Deinem Code hast, den Du zwar umschreibst, aber nicht zeigst, was es sehr schwierig macht, konkret zu helfen.

Und das zweite Problem ist, dass Du ein Programm schrieben willst, bisher aber noch nicht beschrieben hast, was das Programm machen soll, sondern immer nur, wie Du Dir ausgedacht hast, wie es funktionieren könnte. Dadurch ist es ziemlich schwierig, richtig zu helfen.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Problem 1:

Code: Alles auswählen

    def database_entry(self, event):

        # Übergabe der Durchlaufanzahl
        self.transfer_number = int(self.entryInput_query_number.get())
        self.index = 0

        for self.index in range(self.transfer_number):
            self.argument_query = tkinter.Label(self.root, text='Argument [%.f]: ' % self.index)
            self.argument_query.pack(side='top')

            self.entryArgument_query = tkinter.Entry(self.root, width=30)
            self.entryArgument_query.pack(side='top')
            self.entryArgument_query.bind('<Return>', self.test)

    # Test über eine Schleife     
    def test(self, event):
        self.example = []
        for index in range(self.transfer_number):
            self.example.append(self.entryArgument_query.get())

        print(self.example)
Problem 2:
In meinen Augen ist es völlig irrelevant was mein komplettes Programm machen soll.
Aber hier noch mal die Kurzfassung in Stichpunkten:
- Erstellung eines GUIs
- Hauptseite: Auswahlmenü, hier wählt man die jeweilige Option was das Programm tun soll
- Option 1: "Hier ist auch der Fehler!!", Datenbank beschreiben [Warum Datenbank? Weil ich einen widerkehrenden Speicherort benötige]
- Schritt 1: Eingabe wie viele Eingabefelder erstellt werden sollen
- Schritt 2: Befüllen einer Liste mit den jeweiligen Eingaben
- Übergabe an die Datenbank [vielleicht wird es auch einfach nur eine txt-Datei die erstellt ist, darüber bin ich mir noch nicht ganz sicher]
Problem: Was der Code oben anzeigt ist, ich erstelle zwar die Entries aber es wird nur der letzte Wert an meine Liste übergeben.
- Option 2: Entweder wird die txt-Datei oder eben die Datenbank ausgelesen
- Option 3: Abfrage ob die Datenbank oder txt-Datei beschrieben ist
- Ist die jeweilige Datei beschrieben, dann werden die Daten aus der Datenbank oder eben txt-Datei dazu verwendet um die Daten einer csv-Datei zu vergleichen, auszulesen und dann leserlich umzuschreiben, damit man auch etwas mit anfangen kann.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie schon mehrmals geschrieben, wenn Du eine variable Anzahl an Eingabefeldern hast, dann ist das ein seltsamer Datenbankentwurf. Solange ich nicht verstehe, was das soll, kann ich nicht helfen.

Zum konkreten Code: etwas an self innerhalb einer for-Schleife zu binden ist nie sinnvoll, weil es mit dem nächsten Schleifendurchgang wieder überschrieben wird.
Das self.index = 0 ist genauso unsinn, weil das mit der for-Schleife auch sofort überschrieben wird.
Warum formatierst Du eine Ganzzahl als float?

Code: Alles auswählen

    def database_entry(self, event):
        number_of_transfers = int(self.entryInput_query_number.get())
        self.entries = []
        for index in range(number_of_transfers):
            tkinter.Label(self.root, text='Argument [%d]:' % index).pack(side='top')
            entry = tkinter.Entry(self.root, width=30)
            entry.pack(side='top')
            entry.bind('<Return>', self.test)
            self.entries.append(entry)

    def test(self, event):
        example = [
            entry.get()
            for entry in self.entries
        ]
        print(example)
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Die Verarbeitung mit der Datenbank kommt erst in späteren Schritten.
Die Eingabe dient nur um die Daten für die Weiterverarbeitung, mehr nicht.

Mir ist nicht bekannt, dass Python oder allgemein man einen "offline Speicher"-Modul gibt, da es dass scheinbar nicht gibt benutze ich eben eine Datenbank um etwas dauerhaft abzulegen und bei Wiederöffnung des Programmes darauf zuzugreifen.

Vielen Dank für den optimierten Code, dies hilft mir schon viel weiter.
Wenn ich es also richtig verstanden hab, ist es nie sinnig in Schleifen variablen an self zu binden?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Also brauchst Du eigentlich gar keine Datenbank?
Um Dir helfen zu können, müssen wir halt wissen, welche Art Daten Du speichern möchtest und wie Du damit arbeiten mußt. Es gibt etliche Arten von "offline-Speicher". Was der richtige ist, kommt auf die Aufgabe an.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Ok, sorry, dies wusste ich nicht. Nein brauch nicht umbedingt eine Datenbank.

Ich muss eigentlich nur Strings speichern und eventuell verändern.
Die Strings die dort geschrieben werden, werden gebraucht um die jeweiligen Werte in der csv-Datei abzusuchen und weiter zu verarbeiten.
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Code: Alles auswählen

Wenn ich es also richtig verstanden hab, ist es nie sinnig in Schleifen variablen an self zu binden?
Ja, weil die Variable ja nach oder während jedem Schleifendurchgang einen neuen Wert zugewiesen bekommt. Wenn du nach dem die Schleife durchgelaufen ist, auf die Variable zugreifst, merkst du, dass sie an den letzten Wert gebunden ist.
Teste das doch mal in einem einfachen Programm aus, das wird es vielleicht deutlicher.

Noch etwas zu Schluss: Du hast hier die Chance dass dir Profis (ich bin keiner) helfen. Nutze das und beantworte jede Frage so detailliert wie möglich. Das bringt dich und dein Programm enorm weiter.

Grüße und viel Erfolg
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ginge viel schneller, wenn Du endlich beschreiben würdest, was Du eigentlich machen möchtest.
Für einfache Listen gibt es zB. json oder csv als Speicherformat.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Also, im Grunde genommen ist es so, dass ich eine csv-Datei von einer Anlage (x-Beliebig) bekomme, diese ist willkürlich angelegt und hat keine Struktur. Das Programm [ich hab schon ein Programm geschrieben, dass genau das macht was ich möchte nur muss ich hier immer im Programm selbst den Code ändern was ich nicht will] soll nun die Datei neustrukturieren und sortieren, damit man es dann sauber in ein Diagramm plotten kann.

Warum die Eingaben? Die Eingaben dienen dazu um die Argumente die auch die csv-Datei besitzt abzusuchen. Da die jeweiligen Argumente sich aber immer wieder ändern können möchte ich diese über mein Programm schreiben, eventuell auch wieder verändern oder eben löschen und dann in einen Speicher ablegen. Meine Idee war eben diese in einer Datenbank abzulegen und diesen als Offline-Speicher zu verwenden.

Und mehr Informationen hab ich auch nicht.
Antworten