2015-11-16 19 views
7

PyQt uygulamasında artık hata (stderr?) Konsolu yazdırmıyor.PyQt: Çıkış yok Hata msg (traceback) çıkışta

Ben QtDesigner kullanmak ve böyle arayüzlerini de:

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 bir QPushButton ve bir etiket içerir. Qt olmayan bir uygulamada testfunc (açık bir şekilde bir hata verir) çağırdığımda, hata iletisini, traceback'i vb. Alırsınız. Bu kodu çalıştırdığımda, yalnızca çıkar.

Daha önce QtDesigner olmadan bir PyQt uygulaması yazdım ve hataları beklendiği gibi konsola yazdırdım. QtDesigner ve miras ile arasındaki fark nedir?

+0

Önceden oluşturulmuş binary'yi kullanarak PyQt'yi yüklediniz mi, yoksa kendiniz mi derlediniz? –

+0

Bu önceden 64 bitlik ikili sürümü kullandım: https://riverbankcomputing.com/software/pyqt/download5 – Jannis

+0

Sanırım sorun bu. Ben aynı sorunu vardı, bu yüzden PyQt5'i mingw32 kullanarak derledim ve şimdi her şey çalışıyor. –

cevap

7

Bu, muhtemelen PyQt-5.5'te istisnaların ele alınış biçimlerindeki değişikliklerden kaynaklanmaktadır. Daha fazla bilgi için PyQt5 belgelerinde Unhandled Python Exceptions'a bakın.

Ben normal konsolunda örnek çalıştırmak, bu gördüğüm budur:

$ 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) 

Yani temel fark, yani sadece normal gibi (işlenmeyen bir özel durum karşılaştığında uygulama şimdi hemen iptal edecektir python betiği). Elbette, bu davranışı try/except bloğu kullanarak veya global olarak sys.excepthook'u geçersiz kılarak denetleyebilirsiniz.

Herhangi bir geri izleme görmüyorsanız, bunun nedeni uygulamayı çalıştırmak için kullandığınız Python IDE ile ilgili bir sorun olabilir.

+0

Yanıt için teşekkürler! Evet, bir try/except bloğu kullandığımda uygulama sonlanmadı. Bunun IDE ile ilgili bir sorun olduğunu düşünmüyorum. GUI olmayan bir test için hala geri tepme vardı ve bunu hem pycharm hem de eclipse ile denedim. Ve eski PyQt sürümünde, geri dönüş benim istediğim gibi çalışıyor. PyQt5.5 ile, programı "hata ayıklama kipinde" çalıştırırsam geri izlemeye devam edebilir. Bu gerçekten yavaştı. En son güncellemeden sonra bir PyQt5.5 uygulamasını nasıl ayıklayacaksınız? – Jannis

+0

@Jannis. Ama bu ** bu IDE'lerle ilgili bir sorun gibi geliyor, değil mi? Cevabımda gösterdiğim gibi, komut dosyasını bir konsolda çalıştırdığımda traceback * * görüntülenir. Öyleyse neden IDE'leriniz bunu yapamıyor? Kendimi bir IDE kullanmamıştım ve programımda her zaman bir istisna belirledim - hata ayıklama söz konusu olduğunda benim için hiçbir şey değişmedi. – ekhumoro

+0

Haklısınız, yorumunuzu yeterince dikkatlice okumadım. Bunu test etmek için PyQt5.5'i yeniden yükledim. Bir konsolda seninle aynı çıktıyı elde ederim. Her iki pycharm ve tutulmada da traceback ortaya çıkmaz. PyQt5.4.1 ile gösterildikleri sırada PyQt5.5 ile traceback'i göstermezler. Aralarında herhangi bir değişiklik yapmadım. Yakında istisnaları kullanmayı inceleyeceğim. Şimdilik normal traceback ile mutluyum. – Jannis