基于Custom Tkinter的Python聊天GUI程序无响应/崩溃求助
问题原因
你的代码里,establish_host_connection()中的server.accept()是阻塞式调用——它会一直停在这里等待客户端连接,而CustomTkinter的GUI事件循环也运行在主线程中。主线程被阻塞后,无法处理界面刷新、用户交互等事件,直接导致界面假死甚至崩溃。
解决方法
把Socket连接逻辑放到子线程中运行,让主线程专注处理GUI事件循环。
修改后的代码示例:
import threading import socket import rsa import customtkinter as ctk public_key_of_partner = None # 补充生成密钥示例(假设你之前已完成这部分) public_key, private_key = rsa.newkeys(2048) def establish_host_connection(): global public_key_of_partner server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOSTIP = socket.gethostbyname(socket.gethostname()) server.bind((HOSTIP, 9099)) server.listen() client, _ = server.accept() print('connected') client.send(public_key.save_pkcs1("PEM")) public_key_of_partner = rsa.PublicKey.load_pkcs1(client.recv(1024)) print('Connected') # 若需更新GUI,必须用after切回主线程操作 # 示例:app.after(0, lambda: status_label.configure(text="已连接")) def host_button_click_event(): nickname_dialog = ctk.CTkInputDialog(text="Enter Nickname:", title="Nickname") nickname = nickname_dialog.get_input() if not nickname: return # 处理用户取消输入的情况 # 将Socket逻辑放入子线程 threading.Thread(target=establish_host_connection, daemon=True).start() # 示例GUI初始化 app = ctk.CTk() host_btn = ctk.CTkButton(app, text="作为主机连接", command=host_button_click_event) host_btn.pack(padx=20, pady=20) app.mainloop()
关键说明
- 用
threading.Thread创建子线程,把阻塞的Socket操作转移到子线程,主线程不会被卡住,界面能正常响应。 - 设置
daemon=True,让子线程随主线程退出而结束,避免程序退出后残留后台线程。 - 如果需要在子线程中更新GUI元素,必须使用CustomTkinter的
after()方法切换回主线程操作——GUI框架通常禁止在非主线程修改界面组件。
内容的提问来源于stack exchange,提问作者Kryptic_Koder
相关产品推荐
相关产品推荐

