<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">Am 20.06.2021 um 16:01 schrieb Tony Arnold <<a href="mailto:tony.arnold@manchester.ac.uk" class="">tony.arnold@manchester.ac.uk</a>>:</div><br class="Apple-interchange-newline"><div class=""><div style="text-align:left; direction:ltr;" bgcolor="#ffffff" text="#2e3436" link="#737373" vlink="#2e3436" class=""><div class="">Hi Alex,</div><div class=""><br class=""></div><div class="">So the problem is how you reference ZoneModel in za.py. You're referencing it as model.ZoneModel on line 24. You should reference as just ZoneModel.</div><div class=""><br class=""></div><div class="">You also need to import sys in za.py, but that's not too critical unless you want to pass command line parameters into your application.</div><div class=""><br class=""></div><div class="">You also need to import QtCore in model.py as someone else has pointed out.</div><div class=""><br class=""></div><div class="">I've attached the corrected files.</div><div class=""><br class=""></div><div class="">I highly recommend using a suitable development environment which will highlight syntax and other errors dynamically. I would suggest using eric or pycharm.</div><div class=""><br class=""></div><div class="">Regards,</div><div class="">Tony.</div><div class=""><br class=""></div><div class="">On Sat, 2021-06-19 at 15:25 +0200, Axel Rau wrote:</div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex" class=""><pre class="">Hi all,</pre><pre class=""><br class=""></pre><pre class="">I’m new to qt and pyqt.</pre><pre class=""><br class=""></pre><pre class="">The test app [1] in one module works fine (mainwindow opens and shows loaded data).</pre><pre class="">After putting ZoneModel and Zone classes in separate modules (za.py, mode.py)[2], no MainWindow is displayed, just the app icon.</pre><pre class=""><br class=""></pre><pre class="">What am I doing wrong?</pre><pre class=""><br class=""></pre><pre class="">Any help appreciated,</pre><pre class="">Axel</pre><pre class=""><br class=""></pre><pre class="">[1]</pre><pre class=""><br class=""></pre><pre class="">from za_main_ui import Ui_mainWindow</pre><pre class="">from PyQt5 import QtWidgets, QtCore</pre><pre class=""><br class=""></pre><pre class="">##from PyQt5.QtCore import QModelIndex, Qt</pre><pre class=""><br class=""></pre><pre class="">import dns.query, dns.resolver, dns.zone, dns.rdataset, dns.rdatatype</pre><pre class="">import sys</pre><pre class=""><br class=""></pre><pre class="">windowHeading = 'za - DNS zone admin'</pre><pre class=""><br class=""></pre><pre class="">class ZoneModel(QtCore.QAbstractTableModel):</pre><pre class="">    def __init__(self, data=[[]], parent=None):</pre><pre class="">        super().__init__(parent)</pre><pre class="">        self.zone = Zone('some.do.main‘)</pre><pre class=""><br class=""></pre><pre class="">    def headerData(self, section: int, orientation: QtCore.Qt.Orientation, role: int):</pre><pre class="">        if role == QtCore.Qt.DisplayRole:</pre><pre class="">            if orientation == QtCore.Qt.Horizontal:</pre><pre class="">                return ['OwnerName', 'TTL', 'Type', 'Rdata'][section]</pre><pre class="">            else:</pre><pre class="">                return None</pre><pre class=""><br class=""></pre><pre class="">    def columnCount(self, parent=None):</pre><pre class="">        return self.zone.columnCount()</pre><pre class=""><br class=""></pre><pre class="">    def rowCount(self, parent=None):</pre><pre class="">        return self.zone.rowCount()</pre><pre class=""><br class=""></pre><pre class="">    def data(self, index: QtCore.QModelIndex, role: int):</pre><pre class="">        if role == QtCore.Qt.DisplayRole:</pre><pre class="">            row = index.row()</pre><pre class="">            col = index.column()</pre><pre class="">            return self.zone.data(row, col)</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">class Zone(object):</pre><pre class="">    IP_XFR_NS = '1234:5678:9abc:def::1'</pre><pre class=""><br class=""></pre><pre class="">    def __init__(self, zone_name):</pre><pre class="">        self.zone_name = zone_name</pre><pre class="">        self.z = dns.zone</pre><pre class="">        self.d = [['', '', '', '']]</pre><pre class=""><br class=""></pre><pre class="">    def data(self, row: int, column: int) -> str:</pre><pre class="">        if not self.d:</pre><pre class="">            self.loadZone()</pre><pre class="">        v = self.d[row][column]</pre><pre class="">        if not v: v = ''</pre><pre class="">        return str(v)</pre><pre class=""><br class=""></pre><pre class="">    def loadZone(self):</pre><pre class="">        row = 0</pre><pre class="">        self.z = dns.zone.from_xfr(dns.query.xfr(self.IP_XFR_NS, self.zone_name))</pre><pre class=""><br class=""></pre><pre class="">        for name in self.z.keys():</pre><pre class="">            name = str(name)</pre><pre class="">            if name == '@': name = ''</pre><pre class="">            self.d[row][0] = name</pre><pre class="">            node = self.z[name]</pre><pre class="">            for the_rdataset in node:</pre><pre class="">                self.d[row][1] = str(the_rdataset.ttl)</pre><pre class="">                for rdata in the_rdataset:</pre><pre class="">                    self.d[row][2] = dns.rdatatype.to_text(the_rdataset.rdtype)</pre><pre class="">                    self.d[row][3] = str(rdata)</pre><pre class="">                    row = row + 1</pre><pre class="">                    self.d.append(['', '', '', ''])</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">    def columnCount(self):</pre><pre class="">        if len(self.d) < 2:</pre><pre class="">            self.loadZone()</pre><pre class="">        return len(self.d[0])</pre><pre class=""><br class=""></pre><pre class="">    def rowCount(self):</pre><pre class="">        if len(self.d) < 2:</pre><pre class="">            self.loadZone()</pre><pre class="">        return len(self.d)</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">class ZaMainWindow(QtWidgets.QMainWindow,Ui_mainWindow):</pre><pre class="">    def __init__(self):</pre><pre class="">        super(ZaMainWindow,self).__init__()</pre><pre class="">        self.setupUi(self)</pre><pre class=""><br class=""></pre><pre class="">if __name__ == '__main__':</pre><pre class="">    app = QtWidgets.QApplication(sys.argv)</pre><pre class=""><br class=""></pre><pre class="">    domainZones = {}</pre><pre class="">    ip4Zones = {}</pre><pre class="">    ip6Zones = {}</pre><pre class=""><br class=""></pre><pre class="">    subdomains = {}</pre><pre class="">    ip4Nets = {}</pre><pre class="">    ip6Nets = {}</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">    mw = ZaMainWindow()</pre><pre class="">    model = ZoneModel()</pre><pre class="">    view = mw.maintableView</pre><pre class="">    view.setColumnWidth(0, 200)</pre><pre class="">    view.setColumnWidth(1, 40)</pre><pre class="">    view.setColumnWidth(2, 40)</pre><pre class="">    view.setColumnWidth(3, 400)</pre><pre class="">    hh = view.horizontalHeader()</pre><pre class="">    hh.setStretchLastSection(True)</pre><pre class="">    hh.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)</pre><pre class="">    view.setModel(model)</pre><pre class="">    mw.show()</pre><pre class=""><br class=""></pre><pre class="">    sys.exit(app.exec_())</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">[2]</pre><pre class="">za.py:</pre><pre class=""><br class=""></pre><pre class="">from za_main_ui import Ui_mainWindow</pre><pre class="">from .model import ZoneModel</pre><pre class="">from PyQt5 import QtWidgets</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">class ZaMainWindow(QtWidgets.QMainWindow,Ui_mainWindow):</pre><pre class="">    def __init__(self):</pre><pre class="">        super(ZaMainWindow,self).__init__()</pre><pre class="">        self.setupUi(self)</pre><pre class=""><br class=""></pre><pre class="">if __name__ == '__main__':</pre><pre class="">    app = QtWidgets.QApplication(sys.argv)</pre><pre class=""><br class=""></pre><pre class="">    domainZones = {}</pre><pre class="">    ip4Zones = {}</pre><pre class="">    ip6Zones = {}</pre><pre class=""><br class=""></pre><pre class="">    subdomains = {}</pre><pre class="">    ip4Nets = {}</pre><pre class="">    ip6Nets = {}</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">    mw = ZaMainWindow()</pre><pre class="">    model = model.ZoneModel()</pre><pre class="">    view = mw.maintableView</pre><pre class="">    view.setColumnWidth(0, 200)</pre><pre class="">    view.setColumnWidth(1, 40)</pre><pre class="">    view.setColumnWidth(2, 40)</pre><pre class="">    view.setColumnWidth(3, 400)</pre><pre class="">    hh = view.horizontalHeader()</pre><pre class="">    hh.setStretchLastSection(True)</pre><pre class="">    hh.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)</pre><pre class="">    view.setModel(model)</pre><pre class="">    mw.show()</pre><pre class=""><br class=""></pre><pre class="">    sys.exit(app.exec_())</pre><pre class=""><br class=""></pre><pre class="">model.py:</pre><pre class=""><br class=""></pre><pre class="">import dns.query, dns.resolver, dns.zone, dns.rdataset, dns.rdatatype</pre><pre class=""><br class=""></pre><pre class="">windowHeading = 'za - DNS zone admin'</pre><pre class=""><br class=""></pre><pre class="">class ZoneModel(QtCore.QAbstractTableModel):</pre><pre class="">    def __init__(self, data=[[]], parent=None):</pre><pre class="">        super().__init__(parent)</pre><pre class="">        self.zone = Zone('some.do.main')</pre><pre class=""><br class=""></pre><pre class="">    def headerData(self, section: int, orientation: QtCore.Qt.Orientation, role: int):</pre><pre class="">        if role == QtCore.Qt.DisplayRole:</pre><pre class="">            if orientation == QtCore.Qt.Horizontal:</pre><pre class="">                return ['OwnerName', 'TTL', 'Type', 'Rdata'][section]</pre><pre class="">            else:</pre><pre class="">                return None</pre><pre class=""><br class=""></pre><pre class="">    def columnCount(self, parent=None):</pre><pre class="">        return self.zone.columnCount()</pre><pre class=""><br class=""></pre><pre class="">    def rowCount(self, parent=None):</pre><pre class="">        return self.zone.rowCount()</pre><pre class=""><br class=""></pre><pre class="">    def data(self, index: QtCore.QModelIndex, role: int):</pre><pre class="">        if role == QtCore.Qt.DisplayRole:</pre><pre class="">            row = index.row()</pre><pre class="">            col = index.column()</pre><pre class="">            return self.zone.data(row, col)</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">class Zone(object):</pre><pre class="">    IP_XFR_NS = '1234:5678:9abc:def::1‘</pre><pre class=""><br class=""></pre><pre class="">    def __init__(self, zone_name):</pre><pre class="">        self.zone_name = zone_name</pre><pre class="">        self.z = dns.zone</pre><pre class="">        self.d = [['', '', '', '']]</pre><pre class=""><br class=""></pre><pre class="">    def data(self, row: int, column: int) -> str:</pre><pre class="">        if not self.d:</pre><pre class="">            self.loadZone()</pre><pre class="">        v = self.d[row][column]</pre><pre class="">        if not v: v = ''</pre><pre class="">        return str(v)</pre><pre class=""><br class=""></pre><pre class="">    def loadZone(self):</pre><pre class="">        row = 0</pre><pre class="">        self.z = dns.zone.from_xfr(dns.query.xfr(self.IP_XFR_NS, self.zone_name))</pre><pre class=""><br class=""></pre><pre class="">        for name in self.z.keys():</pre><pre class="">            name = str(name)</pre><pre class="">            if name == '@': name = ''</pre><pre class="">            self.d[row][0] = name</pre><pre class="">            node = self.z[name]</pre><pre class="">            for the_rdataset in node:</pre><pre class="">                self.d[row][1] = str(the_rdataset.ttl)</pre><pre class="">                for rdata in the_rdataset:</pre><pre class="">                    self.d[row][2] = dns.rdatatype.to_text(the_rdataset.rdtype)</pre><pre class="">                    self.d[row][3] = str(rdata)</pre><pre class="">                    row = row + 1</pre><pre class="">                    self.d.append(['', '', '', ''])</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">    def columnCount(self):</pre><pre class="">        if len(self.d) < 2:</pre><pre class="">            self.loadZone()</pre><pre class="">        return len(self.d[0])</pre><pre class=""><br class=""></pre><pre class="">    def rowCount(self):</pre><pre class="">        if len(self.d) < 2:</pre><pre class="">            self.loadZone()</pre><pre class="">        return len(self.d)</pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class=""><br class=""></pre><pre class="">---</pre><pre class="">PGP-Key: CDE74120  ☀  computing @ chaos claudius</pre><pre class=""><br class=""></pre></blockquote><div class=""><span class=""><pre class="">-- <br class=""></pre><div class=""><div class=""><font size="2" class=""><font color="#3366ff" class=""><b class="">Tony Arnold</b> MBCS, CITP | Senior IT Security Analyst | Directorate of IT Services | Office 1, Kilburn Building | The University of Manchester | Manchester M13 9PL | </font><font color="#ff0000" class="">T:</font><font color="#3366ff" class=""> +44 161 275 6093 | </font><font color="#ff0000" class="">M:</font><font color="#3366ff" class=""> +44 773 330 0039</font></font></div></div></span></div></div>
<span id="cid:4BC4A028-8858-47DA-813F-3EBC8E04BE40@in.chaos1.de"><model.py></span><span id="cid:E427D8F3-D7ED-462E-BB59-288EC2DB25D2@in.chaos1.de"><za.py></span></div></blockquote></div><br class=""><div class="">
<div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant-ligatures: normal; font-variant-position: normal; font-variant-caps: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">---<br class="">PGP-Key: CDE74120  ☀  computing @ chaos claudius</div></div></div></div></div></div>
</div>


<br class=""></div></body></html>