Tôi đang cố gắng làm cho ứng dụng đọc dữ liệu từ ổ cắm, nhưng phải mất một thời gian và khóa giao diện, làm thế nào để làm cho nó phản ứng với các sự kiện tk trong khi chờ đợi?Làm thế nào để thực hiện các sự kiện thay đổi tkinter trong khi đang đợi dữ liệu socket?
Trả lời
Thats thật dễ dàng! Và bạn thậm chí không cần chủ đề! Nhưng bạn sẽ phải cấu trúc lại mã I/O một chút. Tk có tương đương với XtAddInput() của Xt, cho phép bạn đăng ký một hàm gọi lại sẽ được gọi từ mainloop Tk khi I/O có thể trên một bộ mô tả tập tin. Dưới đây là những gì bạn cần:
from Tkinter import tkinter
tkinter.createfilehandler(file, mask, callback)
Tệp có thể là tệp Python hoặc đối tượng socket (thực tế, bất kỳ phương thức nào bằng fileno()) hoặc mô tả tệp nguyên. Mặt nạ là một trong các hằng số tkinter.READABLE hoặc tkinter.WRITABLE. Các callback được gọi như sau:
callback(file, mask)
Bạn phải unregister gọi lại khi bạn đã hoàn tất, sử dụng
tkinter.deletefilehandler(file)
Lưu ý: vì bạn không biết có bao nhiêu byte có sẵn để đọc, bạn không thể sử dụng các phương thức đọc hoặc đọc của đối tượng tệp Python, vì chúng sẽ nhấn mạnh vào việc đọc số byte được xác định trước. Đối với các socket, các phương thức recv() hoặc recvfrom() sẽ hoạt động tốt; đối với các tệp khác, hãy sử dụng os.read(file.fileno(), maxbytecount).
Đây là một trong những tính năng thực sự tuyệt vời của Tk - nhận được sự kiện khi một tệp có thể đọc giúp xử lý socket dễ dàng. –