每当我使用 xxx.join() 时,它都不会起作用,eitehr 只是停止并且不继续执行其余代码或使我的程序崩溃。在这种情况下使我的程序崩溃。我通常不需要它,但对于我当前的程序,我试图允许客户端等待来自服务器的消息,并且我需要 .join() 来允许这一点而不会崩溃。 new_message 只会使我的程序崩溃,并且不允许形成新的 GUI。 终端中没有出现错误,只是崩溃
def email_verify_gui():
# new gui
email_entry.destroy()
username_entry.destroy()
createpassword_entry.destroy()
confirmpassword_entry.destroy()
invalid_passwords.destroy()
invalid_boxes.destroy()
next_button.destroy()
S2.configure(text="Verify your email.")
img2 = customtkinter.CTkImage(dark_image=Image.open("emailverify2.png"), size=(250, 175))
subtitle = customtkinter.CTkLabel(master=frame_signup, text=("Complete the tab we opened "
"so that we can verify your email."),
text_color="#fff", font=("Century Gothic", 16), wraplength=300)
subtitle.place(x=27, y=90)
email_img = customtkinter.CTkLabel(master=frame_signup, image=img2, text="")
email_img.place(x=35, y=130)
def server_email():
server_email_status = False
client.send(("send email").encode())
client.send(new_email.encode())
print(new_email)
file_path = "C:\\Users\\gunne\\PycharmProjects\\Playground\\email verification html.html"
webbrowser.open(file_path, new=2)
def new_message():
while True:
server_verify_message = client.recv(2048).decode()
if server_verify_message:
print(server_verify_message)
break
thread_email_verify_gui = threading.Thread(target=email_verify_gui)
thread_server_email = threading.Thread(target=server_email)
thread_new_message = threading.Thread(target=new_message)
print("Threads Established")
thread_email_verify_gui.start()
#thread_email_verify_gui.join()
print("STAGE 1")
thread_server_email.start()
#thread_server_email.join()
print("STAGE 2")
无需 .join() 即可工作,但只要我使用 new_message(),我的程序仍然会崩溃
您需要使用
ThreadPoolExecutor
来实现这一点,基本上它允许您在线程上添加回调。
from concurrent.futures import ThreadPoolExecutor
def email_verify_gui():
# new gui
email_entry.destroy()
username_entry.destroy()
createpassword_entry.destroy()
confirmpassword_entry.destroy()
invalid_passwords.destroy()
invalid_boxes.destroy()
next_button.destroy()
S2.configure(text="Verify your email.")
img2 = customtkinter.CTkImage(dark_image=Image.open("emailverify2.png"), size=(250, 175))
subtitle = customtkinter.CTkLabel(master=frame_signup, text=("Complete the tab we opened "
"so that we can verify your email."),
text_color="#fff", font=("Century Gothic", 16), wraplength=300)
subtitle.place(x=27, y=90)
email_img = customtkinter.CTkLabel(master=frame_signup, image=img2, text="")
email_img.place(x=35, y=130)
def server_email():
server_email_status = False
client.send(("send email").encode())
client.send(new_email.encode())
print(new_email)
file_path = "C:\\Users\\gunne\\PycharmProjects\\Playground\\email verification html.html"
webbrowser.open(file_path, new=2)
def new_message():
while True:
server_verify_message = client.recv(2048).decode()
if server_verify_message:
print(server_verify_message)
break
executor = ThreadPoolExecutor(max_workers=3)
future = executor.submit(email_verify_gui)
future.add_done_callback(lambda x:server_email)
future.add_done_callback(lambda x:new_message)
了解更多信息 -> https://superfastpython.com/threadpoolexecutor-in-python