Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的信号发射导致退出代码139_Python_Multithreading_Pyside_Signals Slots - Fatal编程技术网

Python中的信号发射导致退出代码139

Python中的信号发射导致退出代码139,python,multithreading,pyside,signals-slots,Python,Multithreading,Pyside,Signals Slots,我正在尝试创建一个函数,它将8个值传递给使用QtDesigner创建的窗口应用程序中的进度条。 也就是说,有一个函数实际上生成了这个值。我想每秒钟执行一次,以获取这些值并更新显示这些值的进度条 我结合了有关使用Python制作图形应用程序和使用动态更新进度条制作应用程序的教程: Python Qt开发: 带线程的PyQt进度条: 问题在于,值传递正确,但在发送信号时,整个应用程序会崩溃,并显示以下消息: 过程结束,退出代码为139(被信号11中断: SIGSEGV) 这是我的密码: 生成值的模块

我正在尝试创建一个函数,它将8个值传递给使用QtDesigner创建的窗口应用程序中的进度条。 也就是说,有一个函数实际上生成了这个值。我想每秒钟执行一次,以获取这些值并更新显示这些值的进度条

我结合了有关使用Python制作图形应用程序和使用动态更新进度条制作应用程序的教程:

  • Python Qt开发:
  • 带线程的PyQt进度条:
  • 问题在于,值传递正确,但在发送信号时,整个应用程序会崩溃,并显示以下消息:

    过程结束,退出代码为139(被信号11中断: SIGSEGV)

    这是我的密码:

    生成值的模块(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
    
    这里是主要程序代码:

    #!/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_()
    
    我认为这可能是由混合库引起的。我使用PySide的QtCore,尽管教程2基于PyQt4。我的决定是因为教程1是基于PySide的。 我试着改变:

    from PySide import QtCore
    

    但是我又犯了一系列错误,我不知道该怎么办:

    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)
    
    回溯(最近一次呼叫最后一次):
    文件“/usr/lib/pycharm/helpers/pydev/pydevd.py”,第1580行,在
    globals=debugger.run(setup['file'],None,None,is_模块)
    文件“/usr/lib/pycharm/helpers/pydev/pydevd.py”,第964行,正在运行
    pydev_imports.execfile(文件、全局、局部)#执行脚本
    文件“/mnt/Grubas/Projekty/Biomed/MYO/MYO.py”,第36行,中
    form=MainDialog()
    文件“/mnt/Grubas/Projekty/Biomed/MYO/MYO.py”,第20行,在__
    self.connect(self.threadclass、QtCore.SIGNAL('MYO_SIGNALS')、self.updateProgressBars)
    TypeError:使用错误的参数类型调用了“PySide.QtCore.QObject.connect”:
    PySide.QtCore.QObject.connect(ThreadClass、str、instancemethod)
    支持的签名:
    PySide.QtCore.QObject.connect(PySide.QtCore.QObject,str,可调用,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,可调用,PySide.QtCore.Qt.ConnectionType=Qt.AutoConnection)
    PySide.QtCore.QObject.connect(str,PySide.QtCore.QObject,str,PySide.QtCore.Qt.ConnectionType=Qt.AutoConnection)
    
    @编辑 在提供@ekhumoro脚本提出的更改后,脚本没有崩溃,但现在我遇到另一个错误:

    QObject::connect:无法对“object”类型的参数进行排队(请确保 “对象”是使用qRegisterMetaType()注册的。)

    我试图自己寻找解决方案,但我没有找到我需要的确切代码。我还尝试将信号类型从(对象)转换为(元组)或(列表),但这会导致另一个错误:

    TypeError:用于调用元函数的未知类型(可能是 信号):元组

    我找到的大多数解决方案都是基于PyQT的。有没有一种简单的方法可以为PySide重写它? 下面是一个解决方案示例,它似乎是正确的,但使用PyQT生成:

    您认为混合使用PySide和PyQt会导致问题是正确的,因此您需要删除其中一个。然而,崩溃本身可能是由PySide中的错误引起的。这里有一个SO问题和一个类似的问题:

    因此,您还需要更改定义和发出
    MYO\u信号的方式

    下面是脚本的固定版本(更改的行将被注释):


    您认为混合使用PySide和PyQt会导致问题是正确的,因此需要删除其中一个。然而,崩溃本身可能是由PySide中的错误引起的。这里有一个SO问题和一个类似的问题:

    因此,您还需要更改定义和发出
    MYO\u信号的方式

    下面是脚本的固定版本(更改的行将被注释):


    由于其他错误,我已编辑我的帖子。如何对“object”类型的参数进行排队?@Asmox。我想你一定使用了pyside的旧版本,因为它对我来说很好用。无论如何,我已经更新了我的答案,改为使用pyqt4,这对你来说应该也可以。由于其他错误,我已经编辑了我的帖子。如何对“object”类型的参数进行排队?@Asmox。我想你一定使用了pyside的旧版本,因为它对我来说很好用。无论如何,我已经更新了我的答案,改为使用pyqt4,这对您来说也应该可以。
    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)
    
    # 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_()