首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Python Tkinter mainloop 後代碼不執行:事件循環阻塞,需放入回調或線程

     編輯:程式設計綜合問答

原因

root.mainloop() 是阻塞式事件循環,其後代碼只有在窗口關閉後才會執行。

解決方案

1. 綁定事件回調(推薦)


def on_send():
    sock.send(data)
    # 接收也在回調或 after 中

btn_send.config(command=on_send)
root.mainloop() # 只有這行在主線程

2. after 定時輪詢


def check_recv():
    try:
        data = sock.recv(1024)
        if data: txt.insert(END, data.decode())
    except BlockingIOError: pass
    root.after(100, check_recv) # 100ms 輪詢

check_recv()
root.mainloop()

3. 守護線程 + 線程安全更新 UI


def recv_loop():
    while True:
        data = sock.recv(1024)
        if not data: break
        root.after(0, lambda d=data: txt.insert(END, d.decode())) # 必須在主線程更新 UI

threading.Thread(target=recv_loop, daemon=True).start()
root.mainloop()

核心鐵律

Tkinter 所有 UI 操作必須在主線程;耗時/阻塞操作放子線程,回調用 root.after(0, callback) 切回主線程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved