2016-11-20 34 views
0

私はQtDesignerで作成されたウィンドウアプリケーションのプログレスバーに8個の値を渡す関数を作成しようとしています。 実際にこの値を生成する関数があります。値を取得して値を表示するプログレスバーを更新するために毎秒実行したい。Pythonでシグナルが出ると終了コード139が発生する

  1. PythonのQtの開発:

    は、私は、Pythonとグラフィックアプリを作って動的に更新progessバーでアプリを作るについてのチュートリアルを組み合わせhttps://www.youtube.com/watch?v=eD91nE8q8Nk
  2. スレッドと
  3. PyQtはプログレスバー:https://www.youtube.com/watch?v=ivcxZSHL7jM

問題は値が正しく渡されていることですが、信号を送信するとアプリ全体がメッセージでクラッシュします:

ここ

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

私のコードです:値(probkowanie.py)を生成

モジュール:

#!/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_() 

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 

、ここでは、メインプログラムコードであります私はそれがライブラリを混在させることによって引き起こされるかもしれないと思う。チュートリアル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().)

私は自分で解決策を探すようにしましたが、必要なコードが見つかりませんでした。私はまた、(タプル)または(リスト)に(物体)からの信号の種類を変換しようとしたが、それは別のエラーにつながる:私が見つけ

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

最も溶液はPyQtはに基づいています。 PySideのための簡単な書き換え方法はありますか?ここ は正しいように思えるが、PyQtはを使用して作られているソリューションの一例です: https://stackoverflow.com/a/2595607/2550466

答えて

2

あなたはあなたがそれらのいずれかを削除する必要がありますので、PySideとPyQtはを混合して、問題を引き起こすだろうと考えるのは正しいです。しかし、クラッシュ自体はおそらくPySideのバグによって引き起こされます。ここに示されている同様の問題とSOの質問があります:

だから、あなたも、あなたが定義しMYO_SIGNALSを放出する方法を変更する必要があります。

以下は、スクリプトの修正バージョンである(変更された行はコメントしている):

# 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

私は私のポストを編集したため、追加的なエラーが発生します。型 'オブジェクト'の引数をキューに入れる方法 – Asmox

+0

@Asmox。私はあなたが古いバージョンのpysideを使用しているに違いないと思います。とにかく、代わりにpyqt4を使用するように私の答えを更新しました。これは大丈夫です。 – ekhumoro

+0

ありがとう、すべて正常に動作します! – Asmox

関連する問題