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
Erzeugung eines Entrys mit einer Schleife
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?
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?
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
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
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.”
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.”
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.!
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()
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?
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?
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.
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?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.
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.Wie sieht die Datenbank aus? Welche Daten sollten gespeichert werden? Wie sollen sie wieder abgefragt werden?
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.
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:
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()
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.
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.
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:
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()
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.
*-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.
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?
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?
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.
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.
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.
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())
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.
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.
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?
Hast du hierfür vielleicht ein Beispiel wie man ein Eingabefeld dynamisch anlegen kann?
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.
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.
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.
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.
Problem 1:
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.
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)
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.