2016-11-20 1 views
0

Im Versuch, Funktion zu machen, die 8 Werte den Fortschrittsbalken in der Fensteranwendung übergibt, die mit QtDesigner gemacht wird. Das ist, es gibt eine Funktion, die diese Werte tatsächlich erzeugt. Ich möchte es jede Sekunde ausführen, um diese Werte zu erhalten und Fortschrittsbalken zu aktualisieren, die Werte anzeigen.Das Signal, das in Python ausstrahlt, verursacht Ausgang Code 139

I kombiniert tutorials über eine grafische Anwendung mit Python machen und eine App mit dynamischen Aktualisieren progess Bars machen:

  1. Python Qt-Entwicklung: https://www.youtube.com/watch?v=eD91nE8q8Nk
  2. PyQt Fortschrittsbalken mit Gewinde: https://www.youtube.com/watch?v=ivcxZSHL7jM

Das Problem ist, dass Werte korrekt übergeben werden, aber wenn es zum Senden des Signals kommt, stürzt die ganze App mit der Nachricht ab:

Hier

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

ist mein Code:

Module, die die Werte erzeugt (probkowanie.py):

import time 
from random import randint 
import threading 

def getSignals(): 
    time.sleep(1) 
    signals = (randint(0, 100), randint(0, 100), randint(0, 100), randint(0, 100), randint(0, 100), randint(0, 100), randint(0, 100), randint(0, 100),) 
    return signals 

und hier ist Hauptprogrammcode:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from PySide.QtCore import * 
from PySide.QtGui import * 
from PyQt4 import QtCore 
import sys 
import time 

import signalPreview # window library 
import probkowanie # values generating library 

class MainDialog(QDialog, signalPreview.Ui_mainDialog): 

    def __init__(self, parent=None): 
     super(MainDialog, self).__init__(parent) 
     self.setupUi(self) 
     self.threadclass = ThreadClass() 
     self.threadclass.start() 
     self.connect(self.threadclass, QtCore.SIGNAL('MYO_SIGNALS'), self.updateProgressBars) 

    def updateProgressBars(self, signals): 
     self.progressBar.setValue(signals[0]) 

class ThreadClass(QtCore.QThread): 
    def __init__(self, parent = None): 
     super(ThreadClass, self).__init__(parent) 

    def run(self): 
     while 1: 
      signals = probkowanie.getSignals() 
      self.emit(QtCore.SIGNAL('MYO_SIGNALS'), 5) # this line causes crash 
      print signals # it works correctly 

app = QApplication(sys.argv) 
form = MainDialog() 
form.show() 
app.exec_() 

Ich denke, es könnte durch das Mischen von Bibliotheken verursacht werden. Ich benutze QtCore von PySide, obwohl Tutorial Nummer 2 auf PyQt4 basiert. Meine Entscheidung ist, weil das Tutorial Nummer 1 auf PySide basiert. Ich habe versucht, zu ändern:

from PySide import QtCore 

zu

from PyQt4 import QtCore 

aber dann bekomme ich ein anderes Bündel von Fehlern, die ich weiß nicht, was damit zu tun:

Traceback (most recent call last): 
    File "/usr/lib/pycharm/helpers/pydev/pydevd.py", line 1580, in <module> 
     globals = debugger.run(setup['file'], None, None, is_module) 
    File "/usr/lib/pycharm/helpers/pydev/pydevd.py", line 964, in run 
     pydev_imports.execfile(file, globals, locals) # execute the script 
    File "/mnt/Grubas/Projekty/Biomed/MYO/myo.py", line 36, in <module> 
     form = MainDialog() 
    File "/mnt/Grubas/Projekty/Biomed/MYO/myo.py", line 20, in __init__ 
     self.connect(self.threadclass, QtCore.SIGNAL('MYO_SIGNALS'), self.updateProgressBars) 
    TypeError: 'PySide.QtCore.QObject.connect' called with wrong argument types: 
    PySide.QtCore.QObject.connect(ThreadClass, str, instancemethod) 
    Supported signatures: 
    PySide.QtCore.QObject.connect(PySide.QtCore.QObject, str, callable, PySide.QtCore.Qt.ConnectionType = Qt.AutoConnection) 
    PySide.QtCore.QObject.connect(PySide.QtCore.QObject, PySide.QtCore.QMetaMethod, PySide.QtCore.QObject, PySide.QtCore.QMetaMethod, PySide.QtCore.Qt.ConnectionType = Qt.AutoConnection) 
    PySide.QtCore.QObject.connect(PySide.QtCore.QObject, str, PySide.QtCore.QObject, str, PySide.QtCore.Qt.ConnectionType = Qt.AutoConnection) 
    PySide.QtCore.QObject.connect(PySide.QtCore.QObject, str, str, PySide.QtCore.Qt.ConnectionType = Qt.AutoConnection) PySide.QtCore.QObject.connect(str, callable, PySide.QtCore.Qt.ConnectionType = Qt.AutoConnection) 
    PySide.QtCore.QObject.connect(str, PySide.QtCore.QObject, str, PySide.QtCore.Qt.ConnectionType = Qt.AutoConnection) 

@EDIT Nachdem die von @ekhumoro vorgeschlagenen Änderungen nicht mehr abstürzen, bekomme ich einen weiteren Fehler:

QObject::connect: Cannot queue arguments of type 'object' (Make sure 'object' is registered using qRegisterMetaType().)

Ich habe versucht, selbst nach einer Lösung zu suchen, aber ich habe nicht den genauen Code gefunden, den ich brauche. Ich habe auch versucht, aus (Objekt) Art des Signals Umwandlung zu (Tupel) oder (Liste), aber es führt zu einem weiteren Fehler:

TypeError: Unknown type used to call meta function (that may be a signal): tuple

Die Lösungen I basiert auf PyQT gefunden. Gibt es eine einfache Möglichkeit, es für PySide umzuschreiben? Hier ist ein Beispiel-Lösung, die korrekt zu sein scheint, ist aber PyQT hergestellt unter Verwendung: https://stackoverflow.com/a/2595607/2550466

Antwort

2

Sie haben Recht, zu denken, dass pyside und PyQt Misch zu Problemen führen, so dass Sie einen von ihnen entfernen müssen. Der eigentliche Absturz ist wahrscheinlich auf einen Fehler in PySide zurückzuführen.Es ist eine Frage SO mit einem ähnlichen Problem hier gezeigt:

So müssen Sie auch die Art und Weise Sie und MYO_SIGNALS emittieren definieren ändern.

Unten finden Sie eine feste Version des Skriptes ist (die geänderten Zeilen sind kommentiert):

# from PySide.QtCore import * 
# from PySide.QtGui import * 
# from PyQt4 import QtCore 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 
import time 

import signalPreview # window library 
import probkowanie # values generating library 

class MainDialog(QDialog): 

    def __init__(self, parent=None): 
     super(MainDialog, self).__init__(parent) 
     self.setupUi(self) 
     self.threadclass = ThreadClass() 
     self.threadclass.start() 
     # self.connect(self.threadclass, QtCore.SIGNAL('MYO_SIGNALS'), self.updateProgressBars) 
     self.connect(self.threadclass, SIGNAL('MYO_SIGNALS'), self.updateProgressBars) 

    def updateProgressBars(self, signals): 
     self.progressBar.setValue(signals[0]) 

# class ThreadClass(QtCore.QThread): 
class ThreadClass(QThread): 
    def __init__(self, parent = None): 
     super(ThreadClass, self).__init__(parent) 

    def run(self): 
     while 1: 
      signals = probkowanie.getSignals() 
      # self.emit(QtCore.SIGNAL('MYO_SIGNALS'), 5) # this line causes crash 
      self.emit(SIGNAL('MYO_SIGNALS'), signals) 
      print signals # it works correctly 

app = QApplication(sys.argv) 
form = MainDialog() 
form.show() 
app.exec_() 
+0

Ich habe meinen Beitrag bearbeitet aufgrund zusätzlicher Fehler. Wie kann man Argumente vom Typ 'Objekt' in die Warteschlange stellen? – Asmox

+0

@Asmox. Ich denke, dass Sie eine ältere Version von pyside verwenden müssen, weil es für mich gut funktioniert. Wie auch immer, ich habe meine Antwort aktualisiert, um stattdessen pyqt4 zu verwenden, was auch für Sie in Ordnung sein sollte. – ekhumoro

+0

Vielen Dank, jetzt funktioniert alles richtig! – Asmox

Verwandte Themen