Ich habe folgendes Problem und folgendes Ziel:
Was ich erstellen will, ist in eine mit dem GUI auf Tkinter basierte Anwendung,
die mit längeren Prozessen umgehen können soll (sprich Prozess abbrechen, evtl. pausieren).
Es liegt eine *.txt-Datei vor, in der strukturiert Einträge eines Wörterbuchs stehen (Ich bin in JSON-Mgmt noch nicht wirklich involviert, verstehe die Dokumentation noch nicht richtig davon, um es wirklich nutzen zu können). Diese wird nach einem Eintrag mit geg. Eigenschaft durchsucht (etwa Wortart, Bedeutung Sprache A, Bedeutung Sprache B). Da das Durchsuchen länger braucht, liefert das Fenster keine Antwort mehr (Keine Rückmeldung), was zur Folge hat, dass keine Interaktion mehr möglich ist. Was ich noch bräuchte, ist die Option, einen Suchprozess nutzergesteuert zu beenden oder zu pausieren oder noch anderweitig das Programm nutzen zu können.
Ich bin mir sicher, dass ich dazu mit MultiThreading arbeiten muss. Was sich als Problem gestaltet, ist, dass Tkinter-Anwendungen schlecht mit MultiThreading umgehen kann (so heißt es, meint Google). Es heißt, der Main-Loop müsse dafür im MainThread laufen. Nach meiner Interpretation ist der MainThread alles das, was nicht in einem neuen Thread ausgeführt wird. Die Mainloop-Anweisung steht am Ende, nicht in einem neuen Thread. Dazu soll der Nebenthread, in dem genannter Suchprozess läuft, einerseits vom Nutzer über die Tkinter-Oberfläche terminierbar sein und andererseits soll der Thread nach jedem Vorgang einen Ladebalken auf der Oberfläche ansprechen, sodass Fortschritt erkennbar ist und Einträge zeigen, die das Programm durch geg. Suchbefehl gefunden hat.
Ich habe schon versucht von einem Nebenthread aus einen Ladebalken anzusprechen und ".step()en" zu lassen. Das hat nicht geklappt.
Das hier ist der Code, mit dem ich es versucht habe (Erf. Module sind bereits importiert):
Code: Alles auswählen
lock = threading.Lock()
wins1 = tkinter.Tk()
wins2 = ttk.Progressbar(wins1,orient="horizontal",length=450,mode="determinate",maximum=100)
wins2.pack()
def qaa():
wins2.step(50)
wins1.mainloop()
qa = threading.Thread(target=qaa,daemon=True)
qa.start()
Code: Alles auswählen
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files\Python35\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Program Files\Python35\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File ".../Check Vs 2.py", line 57, in qaa
wins2.step(50)
File "C:\Program Files\Python35\lib\tkinter\ttk.py", line 1023, in step
self.tk.call(self._w, "step", amount)
RuntimeError: main thread is not in main loop
Vielen Dank im Vorraus
mfG Im().