2009-12-26 43 views

Trả lời

2

Stick thử excepts ở khắp mọi nơi ứng dụng của bạn có thể sụp đổ (I/O, mạng vv). Bất cứ khi nào một ngoại lệ được gọi, hãy gọi một hàm sẽ giết cửa sổ cũ, sinh ra một cửa sổ thông báo tkinter mới hoặc custom one với thông báo lỗi của bạn.

Thực hiện root.after đến cửa sổ mới và gửi báo cáo lỗi (urllib).

Đặt nút khởi động lại nếu bạn muốn.

Không có khung báo cáo sự cố - vì tkinter không phải là loại GUI. Nó khá là một wrapper cho các ứng dụng dòng lệnh đơn giản.

Go pyqt/gtk hoặc wxpython nếu bạn muốn các tính năng được hiển thị trong ảnh chụp màn hình ở trên. Nhưng tôi khá chắc chắn rằng khi nào bạn đi, bạn sẽ phải viết phóng viên của riêng bạn.

+5

Tôi không đồng ý với tuyên bố rằng tkinter là "khá nhiều một trình bao bọc cho các ứng dụng dòng lệnh đơn giản". Tkinter là một thư viện GUI hoàn chỉnh phù hợp cho tất cả các mục đích. Và trên thực tế, Tkinter cũng có thể được sử dụng để thực hiện tất cả các tính năng trong ảnh chụp màn hình. –

+0

Tôi không đồng ý, nhưng nếu một người làm một giao diện đầy đủ, có thể duy trì (với báo cáo sự cố và chủ đề), với nỗ lực ít nhất, người ta sẽ sử dụng một trong các bộ công cụ khác mà tôi liệt kê ở trên. Lý do họ tồn tại là vì Tkinter không đáp ứng đủ nhu cầu này. – torger

7

Thay vì gây ô nhiễm mã của bạn với try..except ở khắp mọi nơi, bạn chỉ nên thực hiện của riêng bạn ngoại trừ móc bằng cách đặt sys.excepthook. Dưới đây là ví dụ:

import sys 
import traceback 

def install_excepthook(): 
    def my_excepthook(exctype, value, tb): 
     s = ''.join(traceback.format_exception(exctype, value, tb)) 
     dialog = ErrorReportDialog(None, s) 
     dialog.exec_() 

    sys.excepthook = my_excepthook 

Gọi install_exception() khi ứng dụng của bạn bắt đầu.

ErrorReportDialog là hộp thoại Qt tôi đã tạo. traceback.format_exception() sẽ định dạng đối số được chuyển tới móc ngoại trừ theo cách tương tự trong trình thông dịch của Python.

CHỈNH SỬA: Tôi quên đề cập đến một chút xíu với điều đó. Nó không làm việc với các chủ đề (tốt, ít nhất là nó đã không lần cuối cùng tôi kiểm tra). Đối với mã đang chạy trong một chuỗi khác, bạn sẽ cần bọc nó trong khối try..except.

Các vấn đề liên quan