PyQt4가 QThread 클래스에서 기본 Gui 클래스의 함수를 호출 할 수 없습니다.

sundar_ima

다음은 더 많은 시간이 소요되는 작업을 구현하려는 샘플 코드 구조입니다. 더 큰 작업을 수행하기 위해 QThread를 사용하고 emited 신호를 사용하여 진행률 표시 줄을 업데이트했습니다 (메인 클래스에서). 많은 시간이 소요되는 작업이 완료 될 때까지 모든 작업이 잘됩니다. 그러나 메인 GUI 클래스에서 함수를 호출하면 문제가 발생합니다. 다음은 내가 시도하고있는 코드 구조입니다 (주석 읽기).

import time
from scripts.gui import Ui_Dialog
from PyQt4 import QtGui
from PyQt4 import QtCore

class AppGui(QtGui.QDialog, Ui_Dialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
    # Main code here.
    # This GUI pops up for user input and opens a main GUI.

    def main_function(self):
        # Doing some main coding here.

        self.work_thread = WorkThread()
        self.work_thread.update.connect(self.ui.progressBar.setValue)
        self.work_thread.start()

        # I wanted to continue more coding here after the thread is finished. But self.work_thread.wait() is blocking main gui.
        # Therefore, I moved the continuation code to different function --> sub_function()

    def sub_function(self):

        # Do the remaining code left over from the main_function()


class WorkThread(QtCore.QThread):


    update = QtCore.pyqtSignal(int)

    def __init__(self):
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):

        self.thread = GenericThread(scripts.function, arg1, arg2)  # This "scripts.function()" function does long process.
        self.thread.start()

        while self.thread.isRunning():
            # Do some long process.
            time.sleep(1)
            self.update.emit(signal)

        print "Distro extraction completed..."


        if self.thread.isFinished():
            self.main_class = AppGui()
            self.main_class.sub_function()  # <-- Problematic call to main AppGui function.

        if self.isFinished():

            return


class GenericThread(QtCore.QThread):

    def __init__(self, function, *args, **kwargs):
        QtCore.QThread.__init__(self)
        self.function = function
        self.args = args
        self.kwargs = kwargs

    def __del__(self):
        self.wait()

    def run(self):
        self.function(*self.args, **self.kwargs)
        return

이것은 내가 뛰고 난 후 얻은 것입니다.

내가 생각하는 것은 WorkThread () 클래스에서 메인 AppGui ()의 함수를 잘못 호출하고 있다는 것입니다.

QPixmap: It is not safe to use pixmaps outside the GUI thread
Larger operation is complete...
QObject::installEventFilter(): Cannot filter events for objects in a different thread.
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python2.7: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.

이 문제를 해결하는 데 도움을 주시면 감사하겠습니다.

Cui Heng

그 이유는 작업자 스레드가 신호를 방출하기 때문입니다.이 신호는 UI 슬롯에 직접 바인딩 할 수 없지만 일반 슬롯에 바인딩 한 다음 업그레이드하려면 UI 슬롯을 호출해야합니다. 나는 당신의 코드를 모두 가지고 있지 않으므로 이와 비슷한 파일을 작성하면 정상적으로 작동합니다.

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


class WorkerThread(QThread):
    updateSignal = pyqtSignal(int)

    def run(self):
        count = 0
        while True:
            time.sleep(0.1)
            self.updateSignal.emit(count)
            count += 1


class ProgressBar(QProgressBar):
    def __init__(self, parent=None):
        super(ProgressBar, self).__init__(parent)
        self.worker = WorkerThread()
        self.worker.updateSignal.connect(self.updateProgress) # here should bind to a general slot

    def startWorker(self):
        self.worker.start()

    def updateProgress(self, progress):
        self.setValue(progress)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    p = ProgressBar()
    p.startWorker()
    p.show()
    app.exec_()

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

별도의 QThread 클래스를 만들고 여기에서 특정 함수 만 호출 할 수 있습니까?

분류에서Dev

PYQT 4 : 다른 클래스에서 GUI 함수를 어떻게 호출 할 수 있습니까?

분류에서Dev

기본 클래스 목록에 파생 클래스를 추가 한 다음 C #의 기본 클래스 목록에서 Derived 클래스의 메서드를 호출 할 수 있습니까?

분류에서Dev

WKInterfaceMap 클래스의 addAnnotation에서 사용 가능한 함수를 호출 할 수 없습니다.

분류에서Dev

SWIG 래퍼에서 전용 기본 클래스 멤버 함수를 노출 할 수 없습니다.

분류에서Dev

C ++ 기본 클래스가 삭제되었거나 액세스 할 수없는 함수를 호출합니다.

분류에서Dev

파생 클래스의 가상 함수는 기본 클래스의 가상 함수를 호출합니다.

분류에서Dev

C ++에서는 기본 클래스에서 공용 메서드를 호출 할 수 없습니다.

분류에서Dev

모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

분류에서Dev

Flutter는 다른 클래스에서 비동기 함수를 호출 할 수 없습니다.

분류에서Dev

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

분류에서Dev

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

분류에서Dev

템플릿 클래스 내의 템플릿 함수 클래스에서 클래스 함수를 호출 할 수 없습니다.

분류에서Dev

모든 기본 클래스에서 동일한 메서드를 호출 할 수 없습니다.

분류에서Dev

SQLiteOpenHelper 클래스의 동기화 된 getinstance 메서드를 저장소 클래스에서 호출 할 수 없습니다 (해결할 수 없음).

분류에서Dev

같은 클래스에서 함수를 호출 할 수 없습니다.

분류에서Dev

PHP 클래스에서 전역 함수를 호출 할 수 없습니다.

분류에서Dev

PHP 클래스에서 전역 함수를 호출 할 수 없습니다.

분류에서Dev

tkinter 클래스에서 함수를 호출 할 수 없습니다.

분류에서Dev

HTML에서 Javascript 클래스를 호출 할 수 없습니다.

분류에서Dev

HTML에서 Javascript 클래스를 호출 할 수 없습니다.

분류에서Dev

파생 클래스를 기본 클래스를 반환하는 함수의 출력에 할당하는 동안 오류가 발생했습니다.

분류에서Dev

정의하지 않는 기본 클래스에서 순수 가상 함수를 호출합니까?

분류에서Dev

하위 클래스의 소멸자가 호출 된 경우 기본 클래스의 소멸자에 대한 호출을 중지 할 수 있습니까?

분류에서Dev

다른 클래스의 함수에서 자바 스크립트를 호출 할 수 없습니다.

분류에서Dev

Java의 클래스에서 void 메서드를 호출 할 수 없습니다.

분류에서Dev

laravel의 사용자 정의 클래스에서 호출 할 때 클래스를 찾을 수 없습니다.

분류에서Dev

C ++의 파생 클래스에서 기본 클래스 메서드를 오버로드 할 수 없습니다.

분류에서Dev

클래스에 정의 된 메서드를 호출 할 수 없습니다.

Related 관련 기사

  1. 1

    별도의 QThread 클래스를 만들고 여기에서 특정 함수 만 호출 할 수 있습니까?

  2. 2

    PYQT 4 : 다른 클래스에서 GUI 함수를 어떻게 호출 할 수 있습니까?

  3. 3

    기본 클래스 목록에 파생 클래스를 추가 한 다음 C #의 기본 클래스 목록에서 Derived 클래스의 메서드를 호출 할 수 있습니까?

  4. 4

    WKInterfaceMap 클래스의 addAnnotation에서 사용 가능한 함수를 호출 할 수 없습니다.

  5. 5

    SWIG 래퍼에서 전용 기본 클래스 멤버 함수를 노출 할 수 없습니다.

  6. 6

    C ++ 기본 클래스가 삭제되었거나 액세스 할 수없는 함수를 호출합니다.

  7. 7

    파생 클래스의 가상 함수는 기본 클래스의 가상 함수를 호출합니다.

  8. 8

    C ++에서는 기본 클래스에서 공용 메서드를 호출 할 수 없습니다.

  9. 9

    모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

  10. 10

    Flutter는 다른 클래스에서 비동기 함수를 호출 할 수 없습니다.

  11. 11

    기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

  12. 12

    기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

  13. 13

    템플릿 클래스 내의 템플릿 함수 클래스에서 클래스 함수를 호출 할 수 없습니다.

  14. 14

    모든 기본 클래스에서 동일한 메서드를 호출 할 수 없습니다.

  15. 15

    SQLiteOpenHelper 클래스의 동기화 된 getinstance 메서드를 저장소 클래스에서 호출 할 수 없습니다 (해결할 수 없음).

  16. 16

    같은 클래스에서 함수를 호출 할 수 없습니다.

  17. 17

    PHP 클래스에서 전역 함수를 호출 할 수 없습니다.

  18. 18

    PHP 클래스에서 전역 함수를 호출 할 수 없습니다.

  19. 19

    tkinter 클래스에서 함수를 호출 할 수 없습니다.

  20. 20

    HTML에서 Javascript 클래스를 호출 할 수 없습니다.

  21. 21

    HTML에서 Javascript 클래스를 호출 할 수 없습니다.

  22. 22

    파생 클래스를 기본 클래스를 반환하는 함수의 출력에 할당하는 동안 오류가 발생했습니다.

  23. 23

    정의하지 않는 기본 클래스에서 순수 가상 함수를 호출합니까?

  24. 24

    하위 클래스의 소멸자가 호출 된 경우 기본 클래스의 소멸자에 대한 호출을 중지 할 수 있습니까?

  25. 25

    다른 클래스의 함수에서 자바 스크립트를 호출 할 수 없습니다.

  26. 26

    Java의 클래스에서 void 메서드를 호출 할 수 없습니다.

  27. 27

    laravel의 사용자 정의 클래스에서 호출 할 때 클래스를 찾을 수 없습니다.

  28. 28

    C ++의 파생 클래스에서 기본 클래스 메서드를 오버로드 할 수 없습니다.

  29. 29

    클래스에 정의 된 메서드를 호출 할 수 없습니다.

뜨겁다태그

보관