- Von `threading.Thread` ableiten und in `.run()` eine Schleife bauen, welche deine CSV-Daten ausliest.
- Innerhalb dieser Schleife die einzelnen Datensätze in die Queue ablegen.
- Benachrichtigen, wenn die Aktualisierung beendet wurde, damit man dann von außen auf die Daten zugreifen kann.
In Quelltext ausgedrückt, könnte das in etwa so aussehen (ungetestet):
Code: Alles auswählen
class Updater(threading.Thread):
def __init__(self, queue, csv_filename):
self.queue = queue
self.csv_filename = csv_filename
self._finished = threading.Event()
def run(self):
with open(csv_filename) as csv_file:
for row in csv.reader(csv_file):
# Nur als Beispiel gedacht
self.queue.put({
'name': row[0], 'menge': row[1], 'preis': row[2]
})
self._finished.set()
def has_finished(self):
return self._finished.is_set()
class MyTkWindow(object):
# ...
def update_data(self):
if not self.updater:
# Erster Durchlauf -> Thread muss gestartet werden.
self.updater = Updater(self.queue, self.csv_filename)
self.updater.start()
if not self.updater.has_finished():
# Aktualisierung läuft noch -> versuche es in 500ms erneut.
self.root.after(500, self.update_data)
else:
while not self.queue.empty():
# Elemente der Queue nacheinander an GUI übermitteln.
self.set_gui_data(self.queue.get())
# Thread-Objekt "wegschmeißen", da es nicht wiederverwendet werden kann.
# Dient auch als Hinweis, dass ein neuer Thread gestartet muss, wenn die
# Aktualisierung mittels `.update_data()` später erneut angestoßen wird.
self.updater = None
So wie ich dich verstanden habe, willst du die Überführung der aktualisierten Daten in die GUI in einem Rutsch erledigen. Daher wird die `update_data()`-Methode in meinem Beispiel immer wieder aufgerufen bis der Thread mitgeteilt hat, dass nun alle Daten aus der CSV-Datei in den Speicher gelesen wurden. In dem 500ms dazwischen, kann die GUI etwas anderes tun. Eine `while`-Schleife würde die GUI an dieser Stelle einfrieren und den Effekt, den man durch das Threading erhalten möchte, letztlich nutzlos machen.
Und am Ende wird dann wird der Zwischenspeicher ausgelesen und die einzelnen Änderungen an die GUI zum Einpflegen übergeben.