Creation of PyQt5.QtWidgets.QTreeView causes "Process finished with exit code -1073740791 (0xC0000409)"

-2

Good day.

I have an error in moment of creation QTreeView by PyQt5 in my Python project. I'm trying to create a GUI for my Python server by using QAbstractItemModel and QTreeView. Import and using QAbstractItemModel does cause any trouble, and code work fine. But then i've try to create a view, the process has stopped and error is thrown: "Process finished with exit code -1073740791 (0xC0000409)"

I'm working on Windowns 10 Pro, with python 3.6.8 (32 bits), PyQt5 5.12.1, and PyCharm 2019.1.1.

First of all, i'm try to use another PyQt5 version, but it was pointless (tested in PyQt5 5.12.1, 5.10, 5.9). Same error. I had some difficulties cause version of pythons *.pyd (which x64) in x86 python interpritator, but when it was solved, the error appeared.

There is a same behavior with python interpritator for x86 and x64 systems.

Building a PyQt5 from source, which was downloaded from here

As far as i serfing stackoverflow with this question, i caught my eye on this article. If i understand correctly, error 0xC0000409 is a windows error and it causes by some value, which request to reserve more free space on stack for it self, then stack has.

I'm confused by that. Using a standart PyQt5 package, installed by PyCharm (all operations were carried out in a virtual environment), shouldn't cause such trouble.

Did i understand problem correclty? Did i miss somethig? Please help.

Here is a code:

############TreeModel.py
from PyQt5.QtCore import QAbstractItemModel, QFile, QIODevice, QModelIndex, Qt
from PyQt5.QtWidgets import QApplication, QCheckBox, QComboBox, QGridLayout, QGroupBox, QHBoxLayout, QLabel, \
    QLineEdit, QTreeView, QVBoxLayout, QWidget

ID = "ID"
DISTRIBUTOR = "Distributor"
ADDRESS = "Address"
NAME = "Name"


class TreeItem(object):
    def __init__(self, data, parent=None):
        self.parentItem = parent
        self.itemData = data
        self.childItems = []

    @property
    def id(self):
        return self.itemData[ID]

    @property
    def dist(self):
        return self.itemData[DISTRIBUTOR]

    @property
    def addr(self):
        return self.itemData[ADDRESS]

    @property
    def name(self):
        return self.itemData[NAME]

    def appendChild(self, item):
        self.childItems.append(item)

    def removeChilds(self):
        self.childItems.clear()

    def child(self, row):
        return self.childItems[row]

    def childCount(self):
        return len(self.childItems)

    def columnCount(self):
        return len(self.itemData)

    def data(self, column):
        try:
            return self.itemData[column]
        except IndexError:
            return None

    def parent(self):
        return self.parentItem

    def row(self):
        if self.parentItem:
            return self.parentItem.childItems.index(self)

        return 0


class TreeModel(QAbstractItemModel):
    def __init__(self, parent=None):
        super(TreeModel, self).__init__(parent)

        #self.client_root = TreeItem(("Title", "Summary"))
        self.client_root = TreeItem((ID, DISTRIBUTOR, ADDRESS, NAME))
        self.torrent_root = TreeItem(("torrernt", "size"))
        #self.setupModelData(data.split('\n'), self.client_root)

    def columnCount(self, parent):
        if parent.isValid():
            return parent.internalPointer().columnCount()
        else:
            return self.client_root.columnCount()

    def data(self, index, role):
        if not index.isValid():
            return None

        if role != Qt.DisplayRole:
            return None

        item = index.internalPointer()

        return item.data(index.column())

    def flags(self, index):
        if not index.isValid():
            return Qt.NoItemFlags

        return Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.client_root.data(section)

        return None

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        if not parent.isValid():
            parentItem = self.client_root
        else:
            parentItem = parent.internalPointer()

        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QModelIndex()

    def parent(self, index):
        if not index.isValid():
            return QModelIndex()

        childItem = index.internalPointer()
        parentItem = childItem.parent()

        if parentItem == self.client_root:
            return QModelIndex()

        return self.createIndex(parentItem.row(), 0, parentItem)

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0

        if not parent.isValid():
            parentItem = self.client_root
        else:
            parentItem = parent.internalPointer()

        return parentItem.childCount()

    def update_clients(self, client):
        if isinstance(client, dict):
            self.client_root.removeChilds()
            for uuid, data in client.items():
                item = TreeItem({ID:uuid,
                                 DISTRIBUTOR:data[DISTRIBUTOR],
                                 ADDRESS:data[ADDRESS],
                                 NAME:data[NAME]})
                self.client_root.appendChild(item)

    def update_process(self, process):
        if isinstance(process, dict):
            clients = [self.client_root]
            for uuid, proc in process.items():
                for c in clients:
                    if c.id == uuid:
                        if c.childCount() > 0:
                            c.removeChilds()
                        for num, data in proc.items():
                            c.appendChild({NUM: num,
                                           PROC_NAME: data[PROC_NAME],
                                           PROC_STS: data[PROC_STS],
                                           PROC_PRGR: data[PROC_PRGR]})

    def update_torrents(self, torrent):
        if isinstance(torrent, dict):
            self.torrent_root.removeChilds()
            for tname, size in torrent.items():
                self.torrent_root.appendChild({"torrent": tname, "size": size})

############shell.py
...

from PyQt5.QtWidgets import QTreeView
...
class ServerShell(cmd.Cmd):
    ...
    self.model = TreeModel()
    self.treeview = QTreeView()
    self.treeview.setModel(self.model)
    self.treeview.show()
    ...

def main():
    ...
    with mp.Manager() as m:
        ...
        shell = ServerShell(args)
        try:
            shell.cmdloop()
        except KeyboardInterrupt:
            print("Stopping server...")


if __name__ == '__main__':
    main()

For testing, i've create a short programm on python and PyQt5, which has a same problem. In fact, it's a functional copy of original programm.

from PyQt5.QtWidgets import QTreeView
from PyQt5.QtCore import QAbstractItemModel, QFile, QIODevice, QModelIndex, Qt
from PyQt5.QtWidgets import QApplication, QCheckBox, QComboBox, QGridLayout, QGroupBox, QHBoxLayout, QLabel, \
    QLineEdit, QTreeView, QVBoxLayout, QWidget

from enum import IntEnum
from enum import Enum


class events(IntEnum): ...

class commands(Enum): ...

class errors(Enum): ...

class status(Enum): ...

class messages(Enum): ...


TRNT_NAME = 'name'
TRNT_FILE = 'file'
TRNT_BYTEARRAY = 'bytearray'
TRNT_INFO = 'info'
TRNT_SIZE = 'archive size'

CMD_ID = 'ID'
CMD_WHO = 'WHO'
CMD_WHAT = 'WHAT'
CMD_CONN = 'LEECH'
CMD_PORT = 'PORT'
CMD_MGNT = 'MAGNET'
CMD_TRNT_DATA = 'TORRENT'

NUM = 'num'
ID = 'id'
ADDRESS = 'addr'
NAME = 'name'
DISTRIBUTOR = 'Distributor'

PROC_NAME= 'name'
PROC_PRGR= 'progress'
PROC_STS= 'status'
ID = "ID"
DISTRIBUTOR = "Distributor"
ADDRESS = "Address"
NAME = "Name"


class TreeItem(object):
    def __init__(self, data, parent=None):
        self.parentItem = parent
        self.itemData = data
        self.childItems = []

    @property
    def id(self):
        return self.itemData[ID]

    @property
    def dist(self):
        return self.itemData[DISTRIBUTOR]

    @property
    def addr(self):
        return self.itemData[ADDRESS]

    @property
    def name(self):
        return self.itemData[NAME]

    def appendChild(self, item):
        self.childItems.append(item)

    def removeChilds(self):
        self.childItems.clear()

    def child(self, row):
        return self.childItems[row]

    def childCount(self):
        return len(self.childItems)

    def columnCount(self):
        return len(self.itemData)

    def data(self, column):
        try:
            return self.itemData[column]
        except IndexError:
            return None

    def parent(self):
        return self.parentItem

    def row(self):
        if self.parentItem:
            return self.parentItem.childItems.index(self)

        return 0


class TreeModel(QAbstractItemModel):
    def __init__(self, parent=None):
        super(TreeModel, self).__init__(parent)

        # self.client_root = TreeItem(("Title", "Summary"))
        self.client_root = TreeItem((ID, DISTRIBUTOR, ADDRESS, NAME))
        self.torrent_root = TreeItem(("torrernt", "size"))
        # self.setupModelData(data.split('\n'), self.client_root)

    def columnCount(self, parent):
        if parent.isValid():
            return parent.internalPointer().columnCount()
        else:
            return self.client_root.columnCount()

    def data(self, index, role):
        if not index.isValid():
            return None

        if role != Qt.DisplayRole:
            return None

        item = index.internalPointer()

        return item.data(index.column())

    def flags(self, index):
        if not index.isValid():
            return Qt.NoItemFlags

        return Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.client_root.data(section)

        return None

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        if not parent.isValid():
            parentItem = self.client_root
        else:
            parentItem = parent.internalPointer()

        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QModelIndex()

    def parent(self, index):
        if not index.isValid():
            return QModelIndex()

        childItem = index.internalPointer()
        parentItem = childItem.parent()

        if parentItem == self.client_root:
            return QModelIndex()

        return self.createIndex(parentItem.row(), 0, parentItem)

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0

        if not parent.isValid():
            parentItem = self.client_root
        else:
            parentItem = parent.internalPointer()

        return parentItem.childCount()


def main():
    model = TreeModel()
    t = QTreeView()
    t.setModel(model)
    t.show()


if __name__ == '__main__':
    main()
python
pyqt5
asked on Stack Overflow Apr 29, 2019 by Alexander Khaustov • edited Apr 29, 2019 by Alexander Khaustov

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0