2016-11-20 12 views
0

나는 QtDesigner로 만든 창 응용 프로그램의 진행 막대에 8 개의 값을 전달하는 함수를 만들려고합니다. 실제로이 값을 생성하는 함수가 있습니다. 나는 값을 표시하고 값을 표시하는 진행 막대를 업데이트하기 위해 매초마다 실행하려고합니다.파이썬에서 신호가 나오면 종료 코드 139가 발생합니다.

  1. 파이썬 Qt를 개발 :

    는 파이썬과 그래픽 응용 프로그램을 동적으로 업데이트 통해 진행 상태 막대와 응용 프로그램을 만드는 방법에 대한 자습서를 결합 https://www.youtube.com/watch?v=eD91nE8q8Nk
  2. 스레드와
  3. PyQt는 진행 바 : https://www.youtube.com/watch?v=ivcxZSHL7jM

문제는 값이 올바르게 전달되지만 신호를 보내면 전체 앱이 다음 메시지와 함께 충돌합니다.

값 (probkowanie.py) 생성

모듈 : 여기서

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

691,363,210 내 코드

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_() 

혼합 된 라이브러리가 원인 일 수 있습니다. 튜토리얼 2 번은 PyQt4를 기반으로하고 있지만 PySide의 QtCore를 사용합니다. 튜토리얼 1 번은 PySide를 기반으로하기 때문에 제 결정이되었습니다.

from PySide import QtCore 

from PyQt4 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) 

@EDIT 나는 변화 시도 @ekhumoro 스크립트가 제안한 변경 사항을 제공 한 후 충돌이 발생했지만 이제는 다른 오류가 발생합니다 :

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

나는 혼자 해결책을 찾으려고했지만, 내가 필요한 정확한 코드를 찾지 못했습니다. 또한, I (튜플) 또는 (목록)에서 (오브젝트)로부터의 신호의 형태를 변형하려고하지만, 다른 에러 리드 : I 발견

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

가장 PyQt는 솔루션을 기반으로한다. PySide 용으로 다시 작성할 수있는 쉬운 방법이 있습니까? 당신이 중 하나를 제거해야합니다, 그래서 https://stackoverflow.com/a/2595607/2550466

답변

2

당신은 PySide와 PyQt는 혼합하는 것은 문제를 일으킬 것이라고 생각하는 것이 옳다 : 다음은 올바른 것 같다하지만 PyQt는을 사용하여 만든되는 솔루션의 예입니다. 그러나 충돌 자체는 아마도 PySide의 버그로 인해 발생합니다.

그래서 당신은 또한 당신이 정의하는 방법을 변경하고 MYO_SIGNALS을 방출해야합니다 여기에 표시된 비슷한 문제를 가진 SO 질문이있다.

아래는 스크립트의 고정 된 버전입니다 (변경된 라인은 주석) :

# 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

내 게시물을 편집 한으로 인해 추가 오류. 'object'유형의 인수를 대기열에 넣는 방법? – Asmox

+0

@Asmox. 나는 당신이 pyside의 이전 버전을 사용해야한다고 생각합니다. 왜냐하면 그것이 저에게 잘 작동하기 때문입니다. 어쨌든, 대신 pyqt4를 사용하여 내 대답을 업데이 트했습니다, 당신을 위해 잘 작동합니다. – ekhumoro

+0

고맙습니다. 이제 모든 것이 제대로 작동합니다! – Asmox