You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:06:09