Доступ к интерфейсу PyQt4 из нескольких потоков - PullRequest
0 голосов
/ 05 июля 2019

У меня очень простой интерфейс PyQt, вкладки и кнопки. Я добавил текстовое поле, чтобы показать результаты выполнения, всплывающие, в фоновом режиме, в другой теме. На моей производственной машине происходит только сегментация, в то время как на разрабатываемых машинах (все виртуальные) работают как положено.

Все машины, как виртуальные, так и физические, представляют собой Ubuntu 16.04.6 LTS из 32 бит. Python2.7, PyQt4, все установлено с apt. (Я должен использовать аппаратное обеспечение, чтобы оно работало только в 32 битах).

Я пытался выполнить код EXACT на разных машинах, и на всех них он работает более или менее хорошо, меньше на производстве, он дает сбой.

import os, sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import pyqtSlot
from PyQt4.QtGui import *
from subprocess import Popen, PIPE
from time import sleep
from nbstreamreader import NonBlockingStreamReader as NBSR
import threading
from time import sleep
class MainWindow(QtGui.QWidget):
    textbox=""
    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.setGeometry(0,0, 500,650)
        self.setWindowTitle("Xarxa Rescat")
        self.setWindowIcon(QtGui.QIcon("icon.png"))
        self.resize(500,650)
        self.setMinimumSize(500,650)
        self.center()
......
        self.textbox = QPlainTextEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(280,300)
......
    def addText(self, text):
    self.textbox.appendPlainText(text)


app = QtGui.QApplication(sys.argv)
frame = MainWindow()
frame.show()

def outputs(nbsrObj,qtframe):
    while True:
        output = nbsr.readline(0.1)
        # 0.1 secs to let the shell output the result
        if output is not None:
            frame.addText(output)
    return

sleep(1)
p = Popen(['sudo', 'ls', '-lisah'],
       stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = False, bufsize = 1)

nbsr = NBSR(p.stdout)
t = threading.Thread(target=outputs, args=(nbsr,frame,))
t.start()

sys.exit(app.exec_())  

Ожидается: выполнение ls, что мой класс NBSR получит stdout и вызовет функцию addText, которая добавит результат ls в текстовое поле.

Пример работы на виртуальной машине: Working example

На изображении вы можете видеть в терминале, как первое выполнение запускается при ошибке сегментации, которая приводит к автоматическому завершению программы. Это именно то, что всегда происходит со мной на физической машине.

...