Erzeugung eines Entrys mit einer Schleife

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

Hallo zusammen,

ich möchte gerne mehrere Labels und Entrys erzeugen, am besten mittels einer Schleife die gesteuert wird mit der vorherigen Eingabe.
Die weiteren Eingaben sollen dann in eine Liste oder direkt in die SQLite Datenbank geschrieben werden,
mit der Datenbank bin ich mir noch nicht ganz im klaren wie das genau Funktioniert.

Code:
def Database_Entry(event):
#labelInput_query_number.pack_forget()
entryInput_query_number.pack_forget()
labelInput_query_number.pack_forget()

# Hier wird nur die Anzahl der Durchläufe übergeben
testen = int(entryInput_query_number.get())
index = 0
value = StringVar()
value.set(0)
example = []
# passt noch nicht so wirklich wo liegt der Fehler?
# Wenn man das nur immer wüsste
for index in range(testen):
argument_query = Label(master, text='Argument [%.f]: '% index)
argument_query.pack(side='left')
entryArgument_query = Entry(master, textvariable=value, width=30)
entryArgument_query.pack(side='left')
# Eventuell fehlt hier noch der bind Befehl, bin mir dessen aber nicht ganz sicher
# Vielleicht macht der Befehl auch gar keinen Sinn keine Ahnung
example.append(entryArgument_query.get())

# Testausgabe auf der Konsole!
print(example)

Die Idee mit der Datenbank besteht daraus, die Eingaben dauerhaft zu speichern und dann immer wieder Skript abzurufen, entweder als Ausgabe was in der Datenbank steht oder als Vergleiche. Dies ist aber eher nicht relevant gehe ich mal davon aus.

Die Namen example, value und testen sind frei gewählt zum testen, da ich noch keine Erfahrung mit GUIs habe und nur Konsolenanwendungen geschrieben hab.

Vielen Dank für die Hilfe bei meinem Problem,
freue mich auf Lösungsvorschläge und Kritiken.

Bleibt gesund,
Martin
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Funktion klingt eher nach einer Klasse und ist auch so geschrieben. Funktionen werden nach Tätigkeiten benannt. Und auch komplett klein geschrieben, wie Variablennamen auch.
Alles was eine Funktion braucht, muss sie über ihre Argumente bekommen, `entryInput_query_number`, `labelInput_query_number` und `master` kommen aber aus dem Nichts.

Bei GUIs löscht man nicht einfach Widgets, außer vielleicht Tabellen.
`index = 0` wird gar nicht gebraucht.
Du brauchst natürlich für jede Tabellenzeile eine eigenes `value`-Objekt, das Du in einer Liste speichern solltest, entryArgument_query.get liefert natürlich gleich nach dem Erzeugen von entryArgument_query noch kein sinnvolles Ergebnis.

Für jede nicht-triviale GUI brauchst Du selbst definierte Klassen, wo sonst, willst Du denn example speichern?
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Hallo Sirius3,

leider versteh ich nur wenig von dem was du mir hier aufgezählt hast, zum einem tue ich mir noch sehr schwer mit Klassen, nicht was Veerbung angeht sondern viel mehr wie ich nach def __init__(master=None, self): , weitere Funktionen aufrufen kann. Ich kann jedoch verstehen, dass du meinen Code für sehr Abendteuerlich empfindest, glaub mir tue ich auch noch. Hatte erst mit Klassen angefangen aber da hat leider nichts funktioniert, zu mindestens nicht so wie ich es wollte und da ich es nicht verstanden hab, hab ich es sein lassen.

Die Argumente `entryInput_query_number`, `labelInput_query_number` und `master`, sind alle global angelegt und können übergeordnet aufgerufen werden, ja ist nicht schick, aber wie gesagt kenne mich mit Klassen nicht aus, bzw. versteh nur die Hälfte davon.

Könntest du mir eventuell trotzdem mit dem vorhandenen Code weiterhelfen?
Wenn ich es richtig verstanden habe, muss ich für jedes Entry, in der Schleife ein seperates Value anlegen oder bin ich da falsch?

Ich könnte hier auch gerne den kompletten Code rein senden, Problem ist nur das er 160 Zeilen lang ist.

Und warum es mir nicht den Code erkannt hat weiß ich auch nicht, die Darstellung ist nicht sehr glücklich.

Vielen Dank schon mal Sirius3
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Code wird dann erkannt, wenn er in code-Tags eingeschlossen ist (der </>-Knopf im vollständigen Editor).

Und wenn Du das mit den Klassen nicht verstehst, dann geh einen Schritt zurück und lerne erst, wie Klassen funktionieren. Wenn dabei etwas nicht funktioniert und Du Fragen hast, kannst Du sie gerne stellen.
160 Zeilen sind nicht viel, wenn es sich aber um so Kraut-und-Rüben-Code handelt, wirst Du schnell an der Kompliziertheit scheitern.

„Das mit dem Rechts-vor-Links habe ich noch nicht verstanden und die vielen Verkehrszeichen verwirren mich, aber Gas-geben kann ich schon.”
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Hier ist mein kompletter Code.
Leider hilft mir an dieser Stelle deine Kritik auch nicht weiter, da sie eher in meinen Augen destruktiv und aggressiv ist. Es tut mir Leid dass ich die Standards nicht erfülle, aber ich programmiere mit Python auch erst seit knapp 2-3 Wochen. Dafür find ich es eigentlich gut was ich da geschrieben hab und bisher verstanden habe.! Also ich versuche es nochmal könnte ich Unterstützung bekommen oder ist das Forum hier nicht für Unterstützung?

Ja global angelegte Variablen sind schlecht und macht man nicht, aber wenn man nicht weiß wie man sich helfen kann macht man eben das was am leichtesten scheint!!.

Die Funktion Graphic(master) war eigentlich mal eine Klasse daraus wollte ich dann Unterfunktionen aufrufen, hat aber gar nicht geklappt und ich habe es aufgegeben, da ich einen gewissen Zeitdruck hab. Vielleicht gibt es ja eine Lösung den Code relativ leicht und schnell in Klassen aufzusplitten, ich habs versucht aber es hat nicht geklappt.!

Code: Alles auswählen

try: 
    import Tkinter 
except:
    import tkinter 
    from tkinter import ttk
    from tkinter.messagebox import showinfo
    from tkinter.filedialog import askopenfilename  
    import tkinter.messagebox
    from tkinter import *
   
def Database_Entry(event):
    #labelInput_query_number.pack_forget()
    entryInput_query_number.pack_forget()
    labelInput_query_number.pack_forget()

    # Hier wird nur die Anzahl der Durchläufe übergeben
    testen = int(entryInput_query_number.get())
    index = 0
    value = StringVar()
    value.set(0)
    example = []
    # passt noch nicht so wirklich wo liegt der Fehler?
    # Wenn man das nur immer wüsste
    for index in range(testen):
        argument_query = Label(master, text='Argument [%.f]: '% index)
        argument_query.pack(side='left')
        entryArgument_query = Entry(master, textvariable=value, width=30)
        entryArgument_query.pack(side='left')
        # Eventuell fehlt hier noch der bind Befehl, bin mir dessen aber nicht ganz sicher
        example.append(entryArgument_query.get())

    # Testausgabe auf der Konsole!
    print(example)


def CallbackFunction_0(event):
    if combolist.get() == 'Datenbank beschreiben':
        # Testausgabe auf der Konsole
        #print('Datenbank beschreiben')
        # Auswahlmenü verschwinden lassen
        combolist.pack_forget()
        label_top.pack_forget()
        # Label zur Sicherung wie viele Argumente erstellt werden sollen
        global labelInput_query_number
        labelInput_query_number = Label(master, text='Wie viele Datensätze wollen Sie sortieren?')
        labelInput_query_number.pack(side='left')
        # Hier nochmal darüber sehen
        variable_query_number = StringVar() 
        variable_query_number.set(0)
        global entryInput_query_number
        entryInput_query_number = Entry(master, textvariable=variable_query_number, width=20)
        entryInput_query_number.pack(side='left')
        # Ausgabe durch Entertaste
        entryInput_query_number.bind('<Return>', Database_Entry)

    elif combolist.get() == 'Datenbank auslesen':
        # Testausgabe auf der Konsole
        #print('Datenbank auslesen')
        # Auswahlmenü verschwinden lassen
        combolist.pack_forget()
        label_top.pack_forget()
        # Neue Funktion einrichten

    elif combolist.get() == 'Sortieren und Ordnen':
        # Testausgabe auf der Konsole
        #print('Sortieren und Ordnen')
        # Auswahlmenü verschinden lassen
        combolist.pack_forget()
        label_top.pack_forget()

        # Änderung der Hauptmaske
        # Button zum Öffnen der .csv-Datei
        file_open = Button(master, text="Datei öffnen", command=CallbackFunction_1, height=2, width=15)
        file_open.place(x=10,y=205)

        # Button zum Beenden des Programmes
        demolition = Button(master, text="Abbruch", command=master.destroy, height=2, width=15)
        demolition.place(x=375, y=205)

        # Dauerschleife
        master.mainloop()



def CallbackFunction_1():
    try:
        # Variable noch sinnvoll benennen
        csv_name = askopenfilename()
    except FileNotFoundError:
        # Errorausgabe
        print("\a\a")
        tkinter.messagebox.showerror(title='Warning', message='Datei nicht gefunden!')
        pass
    except IOError as exc:
        # Errorausgabe
        print("\a\a")
        tkinter.messagebox.showerror(title='Warning', message='Datei nicht lesbar!')
        pass
    if csv_name:
        Conversion_Function(csv_name)
    else:
        print("Error!")


def Graphic(master):
    # Hauptfensterinitialisierung
    # Initialisierung des Logo

    logo_picture = PhotoImage(file="Logo.png")
    logo_label = Label(master, image=logo_picture).pack(side="top")
    # Initialisierung des Icons in der Titelleiste
    icon = master.iconbitmap('logo_icon.ico')
    # Eigenschaften für dsa Fenster erzeugen/festlegen
    title = master.title('Sortierungstool')
    size = master.minsize(width=450, height=250)
    # Label für Auswahlmenü erzeugen
    global label_top
    label_top = Label(master, text='Wählen Sie eine Option aus: ')
    label_top.pack(side="top")
    # Auswahlmenü erzeugen
    value_data = ('', 'Datenbank beschreiben', 'Datenbank auslesen', 'Sortieren und Ordnen')
    selected_data = StringVar()
    global combolist
    combolist = ttk.Combobox(master, textvariable=selected_data)
    combolist['values'] = value_data
    combolist['state'] = 'readonly'
    combolist.pack(side='top')
    combolist.bind('<<ComboboxSelected>>', CallbackFunction_0)
    master.mainloop()


def main():
    global master
    master = tkinter.Tk()
    Graphic(master)
    master.mainloop()

if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst es wahrscheinlich nicht hören, aber ich habe Dir Unterstützung angeboten, für den Weg, der zum Ziel führt. Warum sollte ich Dir helfen, in den Abgrund zu stürzen?

Noch weitere konstruktive Tipps:
Fang mit den wichtigen Teilen an, also dem Lesen/Beschreiben der Datenbank.
Schreibe für jede Aufgabe eine eigene Klasse, die die Widgets in einen Frame packt, damit bist Du flexibel, wie Du die Teile zusammenbaust, entweder über Tabs oder eigene Fenster.
Es ist unüblich, alles in das selbe Fenster zu packen und die Elemente daraus wieder zu löschen.

Wie sieht die Datenbank aus? Welche Daten sollten gespeichert werden? Wie sollen sie wieder abgefragt werden?
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Du willst es wahrscheinlich nicht hören, aber ich habe Dir Unterstützung angeboten, für den Weg, der zum Ziel führt. Warum sollte ich Dir helfen, in den Abgrund zu stürzen?
Natürlich möchte ich es hören. Ich lese mich jetzt nochmal in OOP ein und versuche zu verstehen was du mir eigentlich mitgeteilt hast. Stand jetzt versteh ich gar nichts, was mich eben nicht gerade glücklich macht.
Noch weitere konstruktive Tipps:
Fang mit den wichtigen Teilen an, also dem Lesen/Beschreiben der Datenbank.
Schreibe für jede Aufgabe eine eigene Klasse, die die Widgets in einen Frame packt, damit bist Du flexibel, wie Du die Teile zusammenbaust, entweder über Tabs oder eigene Fenster.
Es ist unüblich, alles in das selbe Fenster zu packen und die Elemente daraus wieder zu löschen.
Wenn ich es richtig verstehe, meinst du, dass ich eine Klasse erstellen soll, dort alle Frames erstellen soll (mit Unterfunktionen) und dann daraus heraus andere Klassen aufrufen soll richtig? Das mit den Tabs versteh ich nicht, bzw. wüsste ich nicht wie ich das lösen soll, dafür fehlt mir einfach die Erfahrung mit tkinter oder PyQt5, deshalb hab ich mir der Combobox gelöst weil es für mich das einfachste war. Gibt es eventuell ein Beispiel, wo mir zeigt wie man es üblicherweise so ein Frame aufbaut?
Wie sieht die Datenbank aus? Welche Daten sollten gespeichert werden? Wie sollen sie wieder abgefragt werden?
Darüber hab ich mir ehrlich gesagt noch gar keine Gedanken gemacht, da ich es allgemein erstmal zum laufen bringen wollte, bin aber wie du merkst, hier schon gescheitert.
Im Grunde hatte ich die Idee, die Daten in einzelne Spalten oder eben als Liste abzulegen und dann prüfen ob das jeweilige Argument in einer .csv-Datei auftritt.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Dir noch keine Gedanken darüber gemacht hast, welche Daten Du eigentlich verarbeiten willst, dann fehlt Dir da noch ein wesentlicher Teil.

Wie man Tabs macht, läßt sich einfach herausfinden:

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

class DatabaseNewEntry(ttk.Frame):
    pass

class DatabaseList(ttk.Frame):
    pass

class DatabaseOrder(ttk.Frame):
    pass

def main():
    root = tk.Tk()
    root.title("Sortierungstool")
    tab_control = ttk.Notebook(root)
    new_entry = DatabaseNewEntry(tab_control)
    entry_list = DatabaseList(tab_control)
    sort_and_order = DatabaseOrder(tab_control)
    tab_control.add(new_entry, text='Datenbank beschreiben')
    tab_control.add(entry_list, text='Datenbank auslesen')
    tab_control.add(sort_and_order, text='Sortieren und Ordnen')
    tab_control.pack(expand=1, fill="both")
    root.mainloop()

if __name__ == '__main__':
    main()
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Vielen Dank für Realisierung mit den Tabs, leider hilft mir das auch nicht so wirklich weiter.
Dennoch werde ich mich der Objektorientierung widmen und dort meine Zeit hineinstecken, damit ich das auch weiter hin mit der Combobox realisieren kann.

Mein altes und immer noch aktuelles Problem versteh ich nach wie vor nicht so ganz, dass:
Wenn meine Eingabe 4 beträgt, möchte ich 4 unteinander und unabhängige Entrys rausgeplotet bekommen, damit ich dann eben 4 verschiedene Eingaben an eine Liste weitergeben kann.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Hallo Sirius3,

ich habe das ganze nun mal mit Klassen projektiert und bekomme immer wieder die Fehlermeldung: 'Event' object has no attribute 'tk'.
Ich finde leider nicht meinen Fehler, fehlt mir eventuell eine Mehrfachvererbung?, fehlt der Befehl des Events ansich?
Liegt es an dem Befehl Combobox da dieser ein Event erwartet?

Hier mein Code:

Code: Alles auswählen

try:
    import Tkinter

except:
    from tkinter import *
    from tkinter import ttk
    from tkinter.messagebox import showinfo
    from tkinter.filedialog import askopenfilename
    import tkinter.messagebox
    import tkinter


class DatabaseNewEntry:
    def __init__(self, root):
        # Label zur Sicherung wie viele Argumente erstellt werden sollen
        # Hier kommt der Fehler
        self.labelInput_query_number = Label(root, text='Wie viele Datensätze wollen Sie sortieren?')
        self.labelInput_query_number.pack(side='left')

        # Hier nochmal darüber sehen
        self.variable_query_number = StringVar() 
        self.variable_query_number.set(0)
        self.entryInput_query_number = Entry(master, textvariable=self.variable_query_number, width=20)
        self.entryInput_query_number.pack(side='left')
        # Ausgabe durch Entertaste
        self.entryInput_query_number.bind('<Return>', self.database_entry)

    def database_entry(self, root):
        self.entryInput_query_number.pack_forget()
        self.labelInput_query_number.pack_forget()
	
	# Das passt auch nicht da ist ebenfalls ein Fehler drinnen
	# aber das ist das Problem wie Eingangs beschrieben
        # Hier wird nur die Anzahl der Durchläufe übergeben
        self.testen = int(self.entryInput_query_number.get())
        self.index = 0
        self.value = StringVar()
        self.value.set(0)
        self.example = []
        # passt noch nicht so wirklich wo liegt der Fehler?
        # Wenn man das nur immer wüsste
        for index in range(self.testen):
            self.argument_query = Label(root, text='Argument [%.f]: '% self.index)
            self.argument_query.pack(side='left')
            self.entryArgument_query = Entry(root, textvariable=self.value, width=30)
            self.entryArgument_query.pack(side='left')
            # Eventuell fehlt hier noch der bind Befehl, bin mir dessen aber nicht ganz sicher
            self.example.append(self.entryArgument_query.get())

        # Testausgabe auf der Konsole!
        print(self.example)
    pass

class DatabaseList:
    def __init__(self, root):


        print("Datenbank lesen")

    pass

class CSVOrder:
    def __init__(self, root):
    	# Hier bekomme ich auch die Fehlermeldung wenn ich es aufrufen möchte
        # Änderung der Hauptmaske
        # Button zum Öffnen der .csv-Datei
        self.file_open = Button(root, text="Datei öffnen", command=self.callbackFunc_1, height=2, width=15)
        self.file_open.place(x=10,y=205)

        # Button zum Beenden des Programmes
        self.demolition = Button(root, text="Abbruch", command=root.destroy, height=2, width=15)
        self.demolition.place(x=375, y=205)

        print("Sortieren und Ordnen")

    def callbackFunc_1(self, root):
            try:
                # Variable noch sinnvoll benennen
                self.csv_name = askopenfilename()
            except FileNotFoundError:
                # Errorausgabe
                print("\a\a")
                tkinter.messagebox.showerror(title='Warning', message='Datei nicht gefunden!')
                pass
            except IOError as exc:
                # Errorausgabe
                print("\a\a")
                tkinter.messagebox.showerror(title='Warning', message='Datei nicht lesbar!')
                pass
            if csv_name:
                self.conversion_function()
            else:
                print("Error!")
    def conversion_function(self, root):
        print("Nothing")
    pass



class Graphic:
    def __init__(self, root):
        #super().__init__(root)
        # Hauptfensterinitialisierung
        # Eigenschaften für das Fenster erzeugen/festlegen
        self.title = root.title('Sortierungstool')
        self.size = root.minsize(width=450, height=250)
        # Initialisierung des Icons in der Titelleiste
        self.icon = root.iconbitmap('logo_icon.ico')
        # Initialisierung des Logo
        self.logo_picture = PhotoImage(file='Logo.png')
        self.logo_label = Label(root, image=self.logo_picture)
        self.logo_label.pack(side='top')
        # Label für Auswahlmenü erzeugen
        self.label_menue = Label(root, text='Wählen Sie eine Option aus: ')
        self.label_menue.pack(side="top")
        # Auswahlmenü als Solches erzeugen
        self.capacity = ('', 'Datenbank beschreiben', 'Datenbank auslesen', 'Sortieren und Ordnen')
        self.selected_data = StringVar()
        self.combolist = ttk.Combobox(root, textvariable=self.selected_data)
        self.combolist['values'] = self.capacity
        self.combolist['state'] = 'readonly'
        self.combolist.pack(side='top')
        self.combolist.bind('<<ComboboxSelected>>', self.callbackFunc_0)
        root.mainloop()
    def callbackFunc_0(self, root):
        if self.combolist.get() == 'Datenbank beschreiben':
            # Auswahlmenü verschwinden lassen
            self.combolist.pack_forget()
            self.label_menue.pack_forget()
            base = DatabaseNewEntry(root)

        elif self.combolist.get() == 'Datenbank auslesen':
            self.combolist.pack_forget()
            self.label_menue.pack_forget()
            base = DatabaseList(root)

        elif self.combolist.get() == 'Sortieren und Ordnen':
            self.combolist.pack_forget()
            self.label_menue.pack_forget()
            base = CSVOrder(root)
    pass

def main():
    root = Tk()
    graphic_rooting = Graphic(root)
    root.mainloop

if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Das try-except am Anfang ist Quatsch. Falls Tkinter existiert werden komplett andere Namen importiert als im except-Teil. Da der try-Block nicht zum Code passt, kann man ihn weglassen.
*-Importe sind schlecht, weil man nicht nachvollziehen kann, woher welcher Name stammt.
`DatabaseNewEntry` ist keine sinnvolle Klasse. Die macht nämlich zwei Dinge, die nicht zusammengehören. 1. die Eingabe, wie viele Datensätze sortiert werden sollen, und zweitens, irgendetwas anderes, was ich bisher noch nicht verstehe.
In `database_entry` bindest Du alles mögliche Zeugs an self, was da nichts verloren hat. Wenn man innerhalb einer for-Schleife was an self bindet, dann ist das eigentlich immer ein Logikfehler, weil sich dauerhafter Zustand und sich in jedem Schleifendurchgang überschreiben widersprechen.
Ansonsten geht das ja schon fast in die richtige Richtung, weil Du in self.example ja alle Entry-Widgets sammelst.

In Graphics.__init__ ist ein mainloop. Das ist ein Fehler, da __init__ wie der Name schon sagt, zum Initialisieren da ist, und nicht dass da ewig was läuft.
Das mainloop in main solltest Du dagegen aufrufen.

`callbackFunc_0` ist ein schlechter Name, was soll denn die 0? Ein Callback bekommt als einziges Argument ein Event, wie die Fehlermeldung auch deutlich sagt. Wie kommst Du drauf, dass das irgendetwas mit einem root zu tun hat?
Wenn Du root außerhalb von __init__ brauchst, mußt Du es an self binden.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Also, bei der database_entry Funktion sollen eigentlich je nach Eingabe, unabhängige Entry erstellt werden und dann in self.example[] geschrieben werden. Aber die Funktion passt vorne und hinten nicht, weiß mir leider auch nicht so wirklich zu helfen.

Den Fehler bei Graphics hab ich behoben. Hatte vergessen in der main() die Klammern zu setzen für root.mainloop().

Ich hab die Funktion callbackFunc_0 so benannt weil ich mehrere Callbacks verwenden wollte, hab es jetzt geändert.
Ich versteh noch nicht ganz wie ich mein root anderen Klassen mit übergeben kann, Ich bräuchte nämlich Root nicht nu in der Graphic Klasse oder macht es mehr Sinn, alle Graphischen Sachen in einer Klasse abzuarbeiten und in den anderen macht man dann das andere?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt self.root = root in __init__ schreiben, dann hast Du in allen Methoden zugriff darauf.

Ich hatte ja schon geschrieben, dass Du die Bedienung Deiner GUI nicht so ist, wie es üblich ist. Das macht es schwierig, zu verstehen, was Du eigentlich machen willst.

Beschreib doch mal in zwei Sätzen, was das Programm tun soll.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Also:
Zuerst wie man aus dem Code entnehmen kann gibt es verschiedene Squenzen zum Auswählen.
In der ersten Seqeunz soll zu erst über eine Eingabe die Argumente abgefragt werdeb die in eine SQLite Datenbank kommen. Im nächsten Schritt werden die unabhängige Entrys erstellt werden und dann soll Zeitgleich die Eingabe in eine Liste gespeichert werden, diese Liste wird dann der Datenbank übergeben. Damit wäre dieser Schritt fertig.

Die nächste Sequenz wäre nun die letzte "Sortieren und Ordnen" , in dieser soll abgefragt werden ob die Datenbank beschrieben ist oder nicht, ist Sie es nicht wird man wieder zurück geleitet zur alten Sequenz und man muss eben die Eingaben wieder machen. Die Eingaben aus der Datenbank werden dazu verwendet um die Argumente der csv-Datei und der datenbank abzugleichen und dann zu sortieren. Im Anschluss wird eine neue csv-Datei heraus geplottet die alles schön aufzeichnet.

Die Funktion/Methode macht nur wenig Sinn das ist mir auch klar, dies ist der Ersteversuch gewesen um die erste Sequenz mit der Liste zu realisieren.
self.testen = int(self.entryInput_query_number.get()) = gibt mir die Anzahl wie lange die Schleife laufen soll.

Code: Alles auswählen

    def database_entry(self, event):
        self.entryInput_query_number.pack_forget()
        self.labelInput_query_number.pack_forget()

        # Hier wird nur die Anzahl der Durchläufe übergeben
        self.testen = int(self.entryInput_query_number.get())
        self.index = 0
        self.value = tkinter.StringVar()
        self.value.set(0)
        self.example = []
        # passt noch nicht so wirklich wo liegt der Fehler?
        for index in range(self.testen):
            self.argument_query = tkinter.Label(self.root, text='Argument [%.f]: '% self.index)
            self.argument_query.pack(side='left')
            self.entryArgument_query = tkinter.Entry(self.root, textvariable=self.value, width=30)
            self.entryArgument_query.pack(side='left')
            # Eventuell fehlt hier noch der bind Befehl, bin mir dessen aber nicht ganz sicher
            self.example.append(self.entryArgument_query.get())
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man eine Datenbank hat, dann weiß man ja, wieviele und welche Felder man braucht, das muß man also nicht dynamisch machen.
Fang also erst einmal damit an, richtige statische GUIs zu programmieren, wenn das gut funktioniert, wirst Du hoffentlich wissen, warum Dein jetziger Ansatz nicht sinnvoll ist.
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.
Antworten