наследование multiprocessing manager.list с сигналом pyqt5 - PullRequest
0 голосов
/ 18 июня 2020

У меня есть общий список процессоров. В этом списке при изменении размера из другого процесса он запускает функцию в основном процессоре для изменения QWidget. Поскольку я не могу добавить что-то в QWidget из другого процесса, мне нужно, чтобы функция слота запускалась в основном процессоре. Поэтому мне нужно, чтобы функция слота активировалась при изменении размера списка. @musicamante отлично поработал над созданием подкласса списка, но он не работает с manager().list(). Я пытался унаследовать multiprocessing.manager, но это не сработало. Я применил простой пример для наследования от BaseProxy, но, похоже, не работает. Пожалуйста, найдите код ниже.

from multiprocessing import Manager
from PyQt5 import QtCore
from multiprocessing.managers import BaseManager
from multiprocessing.managers import BaseProxy


class ListProxy(QtCore.QObject):
    resized = QtCore.pyqtSignal(list)

class SignalList(list):
    def __init__(self, *args):
        super().__init__(*args)
        self._proxy = ListProxy()
        self.resized = self._proxy.resized

    def append(self, item):
        super().append(item)
        self.resized.emit(self)

    def extend(self, iterable):
        super().extend(iterable)
        self.resized.emit(self)

    def pop(self, *args):
        item = super().pop(*args)
        self.resized.emit(self)
        return item

    # this is required for slicing -> myList[:] = []
    # you might want to check if the length of the list is actually changed
    # before emitting the signal
    def __setitem__(self, *args, **kwargs):
        super().__setitem__(*args, **kwargs)
        self.resized.emit(self)

    def __delitem__(self, *args, **kwargs):
        super().__delitem__(*args, **kwargs)
        self.resized.emit(self)

    # this is required for concatenation -> myList += iterable
    def __iadd__(self, *args, **kwargs):
        super().__iadd__(*args, **kwargs)
        self.resized.emit(self)
        return self

class DataSetProxy(BaseProxy):
    _exposed_ = ('append', '__len__')

    def append(self, item):
        return self._callmethod('append', item)

    def __len__(self):
        return self._callmethod('__len__')

class MyManager(BaseManager):
    pass

MyManager.register('Mylist', SignalList, DataSetProxy)


@QtCore.pyqtSlot(list)
def onclick(l):
    print('resized', l)


if __name__ == '__main__':
    manager = MyManager()
    manager.start()
    mylist = manager.Mylist()
    mylist.resized.connect(onclick)
    mylist.append('item1')
    mylist.append('item2')
    mylist[:] = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...