Ich habe ein Python-GUI-Programm, das die gleiche Aufgabe, aber mit mehreren Threads ausführen muss. Das Problem ist, dass ich die Threads anrufe, aber sie nicht parallel, sondern sequentiell ausführen. Die erste wird ausgeführt, sie endet und dann die zweite usw. Ich möchte, dass sie unabhängig voneinander beginnen.Python-GUI bleibt eingefroren, bis der Thread-Code fertig ausgeführt wird
Die Hauptkomponenten sind:
1. Menü (Ansicht)
2. ProcesStarter (Controller)
3. Prozess (Controller)
Das Menü ist, wo Sie auf "Start" klicken Taste, die eine Funktion bei ProcesStarter aufruft.
Die ProcesStarter erstellt Objekte von Prozess und Fäden und startet alle Threads in einer for-Schleife.
Menü:
class VotingFrame(BaseFrame):
def create_widgets(self):
self.start_process = tk.Button(root, text="Start Process", command=lambda: self.start_process())
self.start_process.grid(row=3,column=0, sticky=tk.W)
def start_process(self):
procesor = XProcesStarter()
procesor_thread = Thread(target=procesor.start_process())
procesor_thread.start()
ProcesStarter:
class XProcesStarter:
def start_process(self):
print "starting new process..."
# thread count
thread_count = self.get_thread_count()
# initialize Process objects with data, and start threads
for i in range(thread_count):
vote_process = XProcess(self.get_proxy_list(), self.get_url())
t = Thread(target=vote_process.start_process())
t.start()
Prozess:
class XProcess():
def __init__(self, proxy_list, url, browser_show=False):
# init code
def start_process(self):
# code for process
Wenn ich drücken Sie die GUI-Taste f oder "Start Process" die GUI ist gesperrt, bis beide Threads die Ausführung beenden. Die Idee ist, dass Threads im Hintergrund arbeiten und parallel arbeiten sollten.
nicht ganz richtig, 'Thread (target = None) .start()' vollständig gültig ist, nicht zu erwähnen, dass eine Methode für ein Objekt ist aufrufbar, also ist nichts falsch daran, es zuerst zu initialisieren und dann die Methode in einem Thread auszuführen. –
Danke! Ich habe heute etwas gelernt! (Ich werde auch meine Antwort bearbeiten) –
Code geändert und es funktioniert wie erwartet! – nullwriter