SQL-Abfrage-Ergebnisse in tkinter
Ich habe eine tkinter-Schnittstelle, wo ich noch etwas zeigen Abfrage-Ergebnisse, und ich brauche für den Benutzer zu ändern, können Sie eine Spalte und legen die Ergebnisse. Derzeit ziehen die Abfragen mache ich etwas wie dieses:
conn = connection_info_goes_here
cur = conn.cursor()
cur.execute(query_goes_here)
- Und dies ist meine Abfrage:
SELECT id, reviewer, task, num_seconds, start_time, end_time
FROM hours
WHERE DATE(start_time) = '2014-12-18'
AND reviewer = 'john'
Den Bereich, den der Benutzer ändern muss, ist num_seconds
(nur zahlen). Meine Frage ist, wie mache ich die Abfrage Ergebnisse zeigen, im Netz und wie kann ich eines der Felder, die änderbar mit einer Schaltfläche zum Absenden der änderungen?
Zusätzliche info: ich habe bereits mit einer sehr unordentlichen Weise mit exec()
und programmgesteuert erstellen von Variablen für jedes Feld. Es wurde sehr lange und verwirrend, und ich glaube wirklich, es muss einen besseren und einfacheren Weg, dies zu tun.
Jede Hilfe ist willkommen. Danke!!
Kurzes Update: da war auf Eis gelegt, ich werde fügen Sie ein Bild von etwas ähnlich zu dem, was ich Suche:
Die Werte in den Eingabe-label muss ersetzen Sie die Werte in der Spalte auf der rechten Seite, wenn ich wieder hochladen in die DB.
Wenn ich sage, ich habe diese in einem unordentlichen Weise, ist, weil ich (die einzige Möglichkeit die ich mir vorstellen könnte):
def cor_window():
corrections = Tk()
corrections.title("Corrections")
corrections_frame = ttk.Frame(corrections)
cor_values = []
count=0
cor_count=0
for x in results:
count2=0
for y in results[count]:
if count2 == 3:
exec('int' + str(cor_count) + '=tkinter.StringVar')
exec('int' + str(cor_count) + '_entry = ttk.Entry(corrections, width=20, textvariable=int' + str(cor_count) + ')')
exec('int' + str(cor_count) + '_entry.grid(column=count2, row=count+2)')
cor_count = cor_count+1
cor_values.append('int' + str(cor_count) + '_entry')
ttk.Label(corrections, width=20, anchor=CENTER, relief=SUNKEN, borderwidth=1, text= results[count][count2]).grid(column=count2+1, row=count+2)
elif count2 > 3:
ttk.Label(corrections, width=20, anchor=CENTER, relief=SUNKEN, borderwidth=1, text= results[count][count2]).grid(column=count2+1, row=count+2)
else:
ttk.Label(corrections, width=20, anchor=CENTER, relief=SUNKEN, borderwidth=1, text= results[count][count2]).grid(column=count2, row=count+2)
count2=count2+1
count=count+1
ttk.Button(corrections, text="Done!", command=upload_cor).grid(column=0, row=1)
Wo results
ist die Liste mit den query-Ergebnisse und upload_cor
ist die Funktion, die das hochladen werden die änderungen an der DB. Da ich exec
, auch wenn der Benutzer ändert den Eintrag im Feld, die ich nicht benutzen kann .get()
zu bekommen, was der Benutzer eingetippt hat. Wenn ich versuche, verwenden .get()
, bekomme ich nur None
auch wenn etwas eingegeben wurde, in das Eingabefeld.
Ich brauche nur eine andere Methode, dies zu tun, wieder, alle Ideen sind willkommen.
- num_seconds verwenden würde, ein Eintrag (oder eine Liste von Eintrags-IDs) und der rest würde von Etiketten. Sie hätte auch zu link die Nummer der Zeile auf den Datensatz und vergleichen Sie jeden Eintrag auf den ursprünglichen Wert, um zu sehen, welche Zeilen sich geändert haben, aber wenn die "id" eindeutig ist, dann sollte es einfach sein. Entry-widget info effbot.org/tkinterbook/entry.htm
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie definitiv nicht wollen, zu verwenden, exec, und Sie brauchen nicht zu verwenden, die
textvariable
option. Beide von denen nur die Verwirrung. Einfach speichern Sie Ihre widgets wie ein Wörterbuch, bekommen die Daten direkt aus dem entry-widget, und es wird alles sehr einfach zu handhaben.Hier ist ein funktionierendes Beispiel:
Ich würde tatsächlich umzusetzen, das ein wenig anders durch die Schaffung einer
Table
Klasse mit einemadd_row
Methode, aber ich wollte nicht zu Komplex werden. Die Grundidee ist die gleiche, ob Sie erstellen eineTable
Klasse, tun es alle in einer Klasse, oder muss es prozedural erstellen Sie ein Wörterbuch zur Darstellung Ihrer Daten. Sie könnte verwenden Sie verschachtelte Listen zu, aber ich finde die Wörterbücher werden viel einfacher zu bedienen. Sie sind auch selbst dokumentieren, da Sie auf Dinge, die symbolische Namen anstatt nur zu wissen, dass die Spalte 4 ist die Startzeit.