2015-11-16 19 views
7

Ứng dụng PyQt của tôi không còn in lỗi (stderr?) Vào bảng điều khiển nữa.PyQt: Không có lỗi msg (traceback) khi thoát

tôi sử dụng QtDesigner và nhập khẩu các giao diện người dùng như thế này:

from PyQt5 import QtCore, QtGui, QtWidgets 
import sys 
from PyQt5.uic import loadUiType 
Ui_MainWindow, QMainWindow = loadUiType("test.ui") 

class Main(QMainWindow, Ui_MainWindow): 
    """Main window""" 
    def __init__(self,parent=None): 
     super(Main, self).__init__(parent) 
     self.setupUi(self) 
     self.pushButton.clicked.connect(self.testfunc) 

    def testfunc(self): 
     print(9/0) 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    main = Main() 
    main.show() 
    sys.exit(app.exec_()) 

test.ui chứa một QPushButton và nhãn. Khi tôi gọi testfunc (mà rõ ràng là đưa ra một lỗi) trong một ứng dụng không Qt, tôi nhận được thông báo lỗi, traceback, vv Khi tôi thực thi mã này, nó chỉ thoát.

Tôi đã viết một ứng dụng PyQt không có QtDesigner trước đây và nó đã in các lỗi vào bảng điều khiển như mong đợi. Sự khác biệt với QtDesigner và thừa kế là gì?

+0

Bạn đã cài đặt PyQt bằng cách sử dụng nhị phân biên dịch sẵn hay bạn đã tự biên dịch nó? –

+0

Tôi đã sử dụng nhị phân 64 bit được định sẵn này: https://riverbankcomputing.com/software/pyqt/download5 – Jannis

+0

Tôi đoán đó là vấn đề. Tôi đã có vấn đề rất giống nhau, vì vậy tôi đã cài đặt lại PyQt5 từ các nguồn, biên dịch nó bằng cách sử dụng mingw32 và mọi thứ hiện đang hoạt động. –

Trả lời

7

Điều này có thể do những thay đổi trong cách ngoại lệ được xử lý trong PyQt-5.5. Xem Unhandled Python Exceptions trong tài liệu PyQt5 để biết thêm chi tiết.

Khi tôi chạy ví dụ của bạn trong một giao diện điều khiển bình thường, đây là những gì tôi thấy:

$ python test.py 
Traceback (most recent call last): 
    File "test.py", line 213, in testfunc 
    print(9/0) 
ZeroDivisionError: division by zero 
Aborted (core dumped) 

Vì vậy, sự khác biệt chính là các ứng dụng sẽ hiện ngay lập tức hủy bỏ khi gặp phải một ngoại lệ unhandled (tức là giống như một bình thường kịch bản python sẽ). Tất nhiên, bạn vẫn có thể kiểm soát hành vi này bằng cách sử dụng khối try/except hoặc toàn cầu bằng cách ghi đè sys.excepthook.

Nếu bạn không nhìn thấy bất kỳ truy nguyên nào, điều này có thể là do sự cố với IDE Python bạn đang sử dụng để chạy ứng dụng của mình.

+0

Cảm ơn bạn đã phản hồi! Có, khi tôi sử dụng một khối try/except, ứng dụng không chấm dứt. Tôi không nghĩ đây là vấn đề với IDE. Đối với một thử nghiệm không GUI tôi vẫn có traceback và tôi đã thử điều này với cả pycharm và eclipse. Và với phiên bản PyQt cũ, truy nguyên đang hoạt động như tôi muốn. Với PyQt5.5 vẫn có thể xem traceback nếu tôi chạy chương trình trong "chế độ gỡ lỗi". Đó là thực sự chậm mặc dù. Làm thế nào bạn có thể gỡ lỗi một ứng dụng PyQt5.5 sau khi cập nhật mới nhất? – Jannis

+0

@Jannis. Nhưng điều đó ** có ** âm thanh như một vấn đề với những IDE đó, phải không? Như tôi đã cho thấy trong câu trả lời của tôi, traceback * được hiển thị khi tôi chạy kịch bản của bạn trong một giao diện điều khiển. Vậy tại sao các IDE của bạn không thể làm điều đó? Tôi chưa bao giờ sử dụng một IDE bản thân mình, và luôn luôn đặt một excepthook trong chương trình của tôi - vì vậy không có gì nhiều đã thay đổi đối với tôi khi nói đến gỡ lỗi. – ekhumoro

+0

Bạn nói đúng, tôi không đọc đủ bình luận của bạn. Tôi đã cài đặt lại PyQt5.5 để kiểm tra điều này. Trong giao diện điều khiển, tôi nhận được kết quả tương tự như bạn. Trong cả hai pycharm và nhật thực, các traceback không hiển thị mặc dù. Họ không hiển thị các traceback với PyQt5.5 trong khi họ cho thấy nó cho PyQt5.4.1. Tôi không thay đổi bất kỳ tùy chọn nào ở giữa. Tôi sẽ sớm xem xét sử dụng excepthooks. Bây giờ tôi hài lòng với sự traceback bình thường. – Jannis

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