s1gnific4nt
s1gnific4nt

Reputation: 53

How to add log in pytqt5?

I am new to pyqt5 and I am trying to create a program with logs and I follow this.

I made a GUI for my program with QTDesigner :

gui.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'GUI.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt

from info import info_os, now, jam, wificonnectedto, ipaddress, mac,gatew,status
from Btn import Switch



class Ui_widps(object):
    def setupUi(self, widps):
        widps.setObjectName("widps")
        widps.resize(714, 548)
        widps.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
        widps.setAcceptDrops(False)
        widps.setDocumentMode(False)
        widps.setDockNestingEnabled(False)
        widps.setUnifiedTitleAndToolBarOnMac(False)
        self.centralwidget = QtWidgets.QWidget(widps)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 30, 101, 101))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.LayoutInformation = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.LayoutInformation.setContentsMargins(0, 0, 0, 0)
        self.LayoutInformation.setObjectName("LayoutInformation")
        self.txOs = QtWidgets.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txOs.setFont(font)
        self.txOs.setObjectName("txOs")
        self.LayoutInformation.addWidget(self.txOs)
        self.txCdate = QtWidgets.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txCdate.setFont(font)
        self.txCdate.setObjectName("txCdate")
        self.LayoutInformation.addWidget(self.txCdate)
        self.txCtime = QtWidgets.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txCtime.setFont(font)
        self.txCtime.setObjectName("txCtime")
        self.LayoutInformation.addWidget(self.txCtime)
        self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(10, 161, 81, 111))
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.LayoutConnectionInfo = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
        self.LayoutConnectionInfo.setContentsMargins(0, 0, 0, 0)
        self.LayoutConnectionInfo.setObjectName("LayoutConnectionInfo")
        self.txConnto = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txConnto.setFont(font)
        self.txConnto.setObjectName("txConnto")
        self.LayoutConnectionInfo.addWidget(self.txConnto)
        self.txtIpad = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txtIpad.setFont(font)
        self.txtIpad.setObjectName("txtIpad")
        self.LayoutConnectionInfo.addWidget(self.txtIpad)
        self.txMacAd = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txMacAd.setFont(font)
        self.txMacAd.setObjectName("txMacAd")
        self.LayoutConnectionInfo.addWidget(self.txMacAd)
        self.txGateway = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txGateway.setFont(font)
        self.txGateway.setObjectName("txGateway")
        self.LayoutConnectionInfo.addWidget(self.txGateway)
        self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(80, 280, 119, 31))
        self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
        self.LayoutWirelessSec = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
        self.LayoutWirelessSec.setContentsMargins(0, 0, 0, 0)
        self.LayoutWirelessSec.setObjectName("LayoutWirelessSec")
        self.txtWirelessSec = QtWidgets.QLabel(self.verticalLayoutWidget_3)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.txtWirelessSec.setFont(font)
        self.txtWirelessSec.setObjectName("txtWirelessSec")
        self.LayoutWirelessSec.addWidget(self.txtWirelessSec)
        self.verticalLayoutWidget_4 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_4.setGeometry(QtCore.QRect(10, 320, 161, 161))
        self.verticalLayoutWidget_4.setObjectName("verticalLayoutWidget_4")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_4)
        self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.txtArp = QtWidgets.QLabel(self.verticalLayoutWidget_4)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txtArp.setFont(font)
        self.txtArp.setObjectName("txtArp")
        self.verticalLayout_4.addWidget(self.txtArp)
        self.txtRapp = QtWidgets.QLabel(self.verticalLayoutWidget_4)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txtRapp.setFont(font)
        self.txtRapp.setObjectName("txtRapp")
        self.verticalLayout_4.addWidget(self.txtRapp)
        self.txtSniff = QtWidgets.QLabel(self.verticalLayoutWidget_4)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.txtSniff.setFont(font)
        self.txtSniff.setObjectName("txtSniff")
        self.verticalLayout_4.addWidget(self.txtSniff)
        self.verticalLayoutWidget_5 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_5.setGeometry(QtCore.QRect(340, 90, 371, 301))
        self.verticalLayoutWidget_5.setObjectName("verticalLayoutWidget_5")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_5)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.verticalLayoutWidget_6 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_6.setGeometry(QtCore.QRect(450, 10, 151, 71))
        self.verticalLayoutWidget_6.setObjectName("verticalLayoutWidget_6")
        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_6)
        self.verticalLayout_6.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.txtGraph = QtWidgets.QLabel(self.verticalLayoutWidget_6)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.txtGraph.setFont(font)
        self.txtGraph.setAlignment(QtCore.Qt.AlignCenter)
        self.txtGraph.setObjectName("txtGraph")
        self.verticalLayout_6.addWidget(self.txtGraph)
        self.verticalLayoutWidget_8 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_8.setGeometry(QtCore.QRect(170, 320, 161, 171))
        self.verticalLayoutWidget_8.setObjectName("verticalLayoutWidget_8")
        self.LayoutBtnWirelessSec = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_8)
        self.LayoutBtnWirelessSec.setContentsMargins(0, 0, 0, 0)
        self.LayoutBtnWirelessSec.setObjectName("LayoutBtnWirelessSec")
        self.Arppbtn = Switch()
        self.Arppbtn.setObjectName("Arppbtn")
        self.LayoutBtnWirelessSec.addWidget(self.Arppbtn)
        self.Rappbtn = Switch()
        self.Rappbtn.setObjectName("Rappbtn")
        self.LayoutBtnWirelessSec.addWidget(self.Rappbtn)
        self.Sniffpbtn = Switch()
        self.Sniffpbtn.setObjectName("Sniffpbtn")
        self.LayoutBtnWirelessSec.addWidget(self.Sniffpbtn)
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(410, 390, 247, 80))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.txtthreat = QtWidgets.QLabel(self.horizontalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.txtthreat.setFont(font)
        self.txtthreat.setObjectName("txtthreat")
        self.horizontalLayout.addWidget(self.txtthreat)
        self.txttotalthreat = QtWidgets.QLabel(self.horizontalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.txttotalthreat.setFont(font)
        self.txttotalthreat.setObjectName("txttotalthreat")
        self.horizontalLayout.addWidget(self.txttotalthreat)
        self.verticalLayoutWidget_7 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_7.setGeometry(QtCore.QRect(109, 29, 141, 101))
        self.verticalLayoutWidget_7.setObjectName("verticalLayoutWidget_7")
        self.LayoutFungsiInfo = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_7)
        self.LayoutFungsiInfo.setContentsMargins(0, 0, 0, 0)
        self.LayoutFungsiInfo.setObjectName("LayoutFungsiInfo")
        self.osinfotxt = QtWidgets.QLabel(self.verticalLayoutWidget_7)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.osinfotxt.setFont(font)
        self.osinfotxt.setObjectName("osinfotxt")
        self.LayoutFungsiInfo.addWidget(self.osinfotxt)
        self.cdatetxt = QtWidgets.QLabel(self.verticalLayoutWidget_7)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.cdatetxt.setFont(font)
        self.cdatetxt.setObjectName("cdatetxt")
        self.LayoutFungsiInfo.addWidget(self.cdatetxt)
        self.ctimetxt = QtWidgets.QLabel(self.verticalLayoutWidget_7)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.ctimetxt.setFont(font)
        self.ctimetxt.setObjectName("ctimetxt")
        self.LayoutFungsiInfo.addWidget(self.ctimetxt)
        self.txtinfo = QtWidgets.QLabel(self.centralwidget)
        self.txtinfo.setGeometry(QtCore.QRect(90, 10, 91, 19))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.txtinfo.setFont(font)
        self.txtinfo.setObjectName("txtinfo")
        self.verticalLayoutWidget_9 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_9.setGeometry(QtCore.QRect(90, 160, 181, 111))
        self.verticalLayoutWidget_9.setObjectName("verticalLayoutWidget_9")
        self.LayoutFungsiWCI = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_9)
        self.LayoutFungsiWCI.setContentsMargins(0, 0, 0, 0)
        self.LayoutFungsiWCI.setObjectName("LayoutFungsiWCI")
        self.contotxt = QtWidgets.QLabel(self.verticalLayoutWidget_9)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.contotxt.setFont(font)
        self.contotxt.setObjectName("contotxt")
        self.LayoutFungsiWCI.addWidget(self.contotxt)
        self.ipaddtxt = QtWidgets.QLabel(self.verticalLayoutWidget_9)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.ipaddtxt.setFont(font)
        self.ipaddtxt.setObjectName("ipaddtxt")
        self.LayoutFungsiWCI.addWidget(self.ipaddtxt)
        self.mactxt = QtWidgets.QLabel(self.verticalLayoutWidget_9)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.mactxt.setFont(font)
        self.mactxt.setObjectName("mactxt")
        self.LayoutFungsiWCI.addWidget(self.mactxt)
        self.getwaytxt = QtWidgets.QLabel(self.verticalLayoutWidget_9)
        font = QtGui.QFont()
        font.setPointSize(8)
        self.getwaytxt.setFont(font)
        self.getwaytxt.setObjectName("getwaytxt")
        self.LayoutFungsiWCI.addWidget(self.getwaytxt)
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(41, 140, 171, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        widps.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(widps)
        self.statusbar.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
        self.statusbar.setSizeGripEnabled(True)
        self.statusbar.setObjectName("statusbar")
        widps.setStatusBar(self.statusbar)
        self.menubar = QtWidgets.QMenuBar(widps)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 714, 27))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.menuAbout = QtWidgets.QMenu(self.menubar)
        self.menuAbout.setObjectName("menuAbout")
        widps.setMenuBar(self.menubar)
        self.actionSave_Logs = QtWidgets.QAction(widps)
        self.actionSave_Logs.setObjectName("actionSave_Logs")
        self.actionExit = QtWidgets.QAction(widps)
        self.actionExit.setObjectName("actionExit")
        self.actionInstruction = QtWidgets.QAction(widps)
        self.actionInstruction.setObjectName("actionInstruction")
        self.actionAbout = QtWidgets.QAction(widps)
        self.actionAbout.setObjectName("actionAbout")
        self.menuFile.addAction(self.actionSave_Logs)
        self.menuFile.addAction(self.actionExit)
        self.menuAbout.addAction(self.actionInstruction)
        self.menuAbout.addAction(self.actionAbout)
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuAbout.menuAction())

        self.retranslateUi(widps)
        QtCore.QMetaObject.connectSlotsByName(widps)

    def retranslateUi(self, widps):
        _translate = QtCore.QCoreApplication.translate
        widps.setWindowTitle(_translate("widps", "Wireless Intrusion Prevention System"))
        self.txOs.setText(_translate("widps", "Operating System :"))
        self.txCdate.setText(_translate("widps", "Current Date :"))
        self.txCtime.setText(_translate("widps", "Current Time :"))
        self.txConnto.setText(_translate("widps", "Connected To : "))
        self.txtIpad.setText(_translate("widps", "IP Address :"))
        self.txMacAd.setText(_translate("widps", "Mac Address :"))
        self.txGateway.setText(_translate("widps", "Gateway :"))
        self.txtWirelessSec.setText(_translate("widps", "Wireless Security"))
        self.txtArp.setText(_translate("widps", "ARP Protection"))
        self.txtRapp.setText(_translate("widps", "Rogue Access Point Protection"))
        self.txtSniff.setText(_translate("widps", "Sniffing Protection"))
        self.txtGraph.setText(_translate("widps", "Logs"))
        self.Arppbtn.setText(_translate("widps", "On"))
        self.Rappbtn.setText(_translate("widps", "On"))
        self.Sniffpbtn.setText(_translate("widps", "On"))
        self.txtthreat.setText(_translate("widps", "Total Threats Detection :"))
        self.txttotalthreat.setText(_translate("widps", "0"))
        self.osinfotxt.setText(_translate("widps",info_os))
        self.cdatetxt.setText(_translate("widps",now.toString(Qt.DefaultLocaleLongDate)))
        self.ctimetxt.setText(_translate("widps", jam.toString(Qt.DefaultLocaleLongDate)))
        self.txtinfo.setText(_translate("widps", "Information"))
        self.contotxt.setText(_translate("widps",wificonnectedto))
        self.ipaddtxt.setText(_translate("widps", ipaddress))
        self.mactxt.setText(_translate("widps", mac))
        self.getwaytxt.setText(_translate("widps", gatew))
        self.statusbar.showMessage("Status: "+status)
        self.label_5.setText(_translate("widps", "Wireless Connection Info"))
        self.menuFile.setTitle(_translate("widps", "File"))
        self.menuAbout.setTitle(_translate("widps", "Help"))
        self.actionSave_Logs.setText(_translate("widps", "Save Logs"))
        self.actionExit.setText(_translate("widps", "Exit"))
        self.actionInstruction.setText(_translate("widps", "Instruction"))
        self.actionAbout.setText(_translate("widps", "About"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    widps = QtWidgets.QMainWindow()
    ui = Ui_widps()
    ui.setupUi(widps)
    widps.show()
    sys.exit(app.exec_())

My program logic to add Logs :

widps.py

import sys
from PyQt5 import QtWidgets
import logging
from gui import Ui_widps

class QTextEditLogger(logging.Handler):
    def __init__(self, parent):
        super().__init__()
        self.widget = QtWidgets.QPlainTextEdit(parent)
        self.widget.setReadOnly(True)

    def emit(self, record):
        msg = self.format(record)
        self.widget.appendPlainText(msg)


class DialogLog(QtWidgets.QDialog, QtWidgets.QPlainTextEdit,Ui_widps):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        logTextBox = QTextEditLogger(self)
        logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        logging.getLogger().addHandler(logTextBox)
        logging.getLogger().setLevel(logging.DEBUG)
        self.verticalLayout_5.addWidget(logTextBox.widget)

app = QtWidgets.QApplication(sys.argv)
dlglog = DialogLog()
dlglog.show()
dlglog.raise_()
sys.exit(app.exec_())

info.py = function for collecting information wireless

import platform
from PyQt5.QtCore import QDate, Qt, QTime
import subprocess
import uuid
import socket
import netifaces
import urllib.request
import sys
info_os = platform.system() + platform.release()
now = QDate.currentDate()
jam = QTime.currentTime()

try:
    url = "https://www.google.com"
    urllib.request.urlopen(url)
    status = "Wifi Terkoneksi"
except ConnectionError:
    status = "Wifi tidak terkoneksi silahkan koneksikan dahulu"
    sys.exit(0)

if platform.system() == "Linux":
    var = subprocess.check_output(["iwgetid","-r"])
elif platform.system() == "Windows":
    cmd = "netsh wlan show interface=Wi-Fi mode=ssid | findstr SSID"
    procs = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    var = procs.communicate()[0]
wificonnectedto = var

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ipaddress = s.getsockname()[0]
s.close()

gw = netifaces.gateways()
gatew = gw['default'][netifaces.AF_INET][0]

mac1 = str(hex(uuid.getnode()))
mac = mac1[2:4]+ ':' +mac1[4:6]+ ':' +mac1[6:8]+ ':' +mac1[8:10]+ ':' +mac1[10:12]+ ':' +mac1[12:14]

Btn.py = function for button

    from PyQt5.QtCore import QPropertyAnimation, QRectF, QSize, Qt, pyqtProperty
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import (
    QAbstractButton,
    QApplication,
    QSizePolicy,
    QWidget,
)


class Switch(QAbstractButton):
    def __init__(self, parent=None, track_radius=10, thumb_radius=8):
        super().__init__(parent=parent)
        self.setCheckable(True)
        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

        self._track_radius = track_radius
        self._thumb_radius = thumb_radius

        self._margin = max(0, self._thumb_radius - self._track_radius)
        self._base_offset = max(self._thumb_radius, self._track_radius)
        self._end_offset = {
            True: lambda: self.width() - self._base_offset,
            False: lambda: self._base_offset,
        }
        self._offset = self._base_offset

        palette = self.palette()
        if self._thumb_radius > self._track_radius:
            self._track_color = {
                True: palette.highlight(),
                False: palette.dark(),
            }
            self._thumb_color = {
                True: palette.highlight(),
                False: palette.light(),
            }
            self._text_color = {
                True: palette.highlightedText().color(),
                False: palette.dark().color(),
            }
            self._thumb_text = {
                True: '',
                False: '',
            }
            self._track_opacity = 0.5
        else:
            self._thumb_color = {
                True: palette.highlightedText(),
                False: palette.light(),
            }
            self._track_color = {
                True: palette.highlight(),
                False: palette.dark(),
            }
            self._text_color = {
                True: palette.highlight().color(),
                False: palette.dark().color(),
            }
            self._thumb_text = {
                True: '✔',
                False: '✕',
            }
            self._track_opacity = 1

    @pyqtProperty(int)
    def offset(self):
        return self._offset

    @offset.setter
    def offset(self, value):
        self._offset = value
        self.update()

    def sizeHint(self):  # pylint: disable=invalid-name
        return QSize(
            4 * self._track_radius + 2 * self._margin,
            2 * self._track_radius + 2 * self._margin,
        )

    def setChecked(self, checked):
        super().setChecked(checked)
        self.offset = self._end_offset[checked]()

    def resizeEvent(self, event):
        super().resizeEvent(event)
        self.offset = self._end_offset[self.isChecked()]()

    def paintEvent(self, event):  # pylint: disable=invalid-name, unused-argument
        p = QPainter(self)
        p.setRenderHint(QPainter.Antialiasing, True)
        p.setPen(Qt.NoPen)
        track_opacity = self._track_opacity
        thumb_opacity = 1.0
        text_opacity = 1.0
        if self.isEnabled():
            track_brush = self._track_color[self.isChecked()]
            thumb_brush = self._thumb_color[self.isChecked()]
            text_color = self._text_color[self.isChecked()]
        else:
            track_opacity *= 0.8
            track_brush = self.palette().shadow()
            thumb_brush = self.palette().mid()
            text_color = self.palette().shadow().color()

        p.setBrush(track_brush)
        p.setOpacity(track_opacity)
        p.drawRoundedRect(
            self._margin,
            self._margin,
            self.width() - 2 * self._margin,
            self.height() - 2 * self._margin,
            self._track_radius,
            self._track_radius,
        )
        p.setBrush(thumb_brush)
        p.setOpacity(thumb_opacity)
        p.drawEllipse(
            self.offset - self._thumb_radius,
            self._base_offset - self._thumb_radius,
            2 * self._thumb_radius,
            2 * self._thumb_radius,
        )
        p.setPen(text_color)
        p.setOpacity(text_opacity)
        font = p.font()
        font.setPixelSize(1.5 * self._thumb_radius)
        p.setFont(font)
        p.drawText(
            QRectF(
                self.offset - self._thumb_radius,
                self._base_offset - self._thumb_radius,
                2 * self._thumb_radius,
                2 * self._thumb_radius,
            ),
            Qt.AlignCenter,
            self._thumb_text[self.isChecked()],
        )

    def mouseReleaseEvent(self, event):  # pylint: disable=invalid-name
        super().mouseReleaseEvent(event)
        if event.button() == Qt.LeftButton:
            anim = QPropertyAnimation(self, b'offset', self)
            anim.setDuration(120)
            anim.setStartValue(self.offset)
            anim.setEndValue(self._end_offset[self.isChecked()]())
            anim.start()

    def enterEvent(self, event):  # pylint: disable=invalid-name
        self.setCursor(Qt.PointingHandCursor)
        super().enterEvent(event)


def main():
    app = QApplication([])

    # Thumb size < track size (Gitlab style)
    w = QWidget()
    w.setLayout(l)
    w.show()

    app.exec()


if __name__ == '__main__':
    main()

I try to run the program but I get an error like this:

File "/home/s1gnific4nt/IDSIPS/widps.py", line 36, in <module>
    dlglog = DialogLog()
  File "/home/s1gnific4nt/IDSIPS/widps.py", line 23, in __init__
    self.setupUi(self)
  File "/home/s1gnific4nt/IDSIPS/gui.py", line 22, in setupUi
    widps.setDocumentMode(False)
AttributeError: 'DialogLog' object has no attribute 'setDocumentMode'

Why did this happen and how do i fix this?

Upvotes: 0

Views: 3882

Answers (1)

eyllanesc
eyllanesc

Reputation: 243983

Your error is simple and has nothing to do with the log, but when you used Qt Designer you chose the Main Window template, and when you use that template you must use QMainWindow since when you convert it to .py and use methods of that class, example the setDocumentMode() method is part of QMainWindow and not QDialog, so it throws the error, so the solution is to change the inheritance. On the other hand it is not necessary to inherit QTextEditLogger so remove it, I do not understand why the answers of the question you indicate use it.

import sys
import logging
from PyQt5 import QtCore, QtWidgets

from gui import Ui_widps


class QTextEditLogger(logging.Handler):
    def __init__(self, parent):
        super().__init__()
        self.widget = QtWidgets.QPlainTextEdit(parent)
        self.widget.setReadOnly(True)

    def emit(self, record):
        msg = self.format(record)
        self.widget.appendPlainText(msg)


class MainWindow(QtWidgets.QMainWindow, Ui_widps):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        logTextBox = QTextEditLogger(self)
        logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        logging.getLogger().addHandler(logTextBox)
        logging.getLogger().setLevel(logging.DEBUG)
        self.verticalLayout_5.addWidget(logTextBox.widget)

        # test: add log after 1 second
        QtCore.QTimer.singleShot(1000, self.test)

    def test(self):
        logging.debug('damn, a bug')
        logging.info('something to remember')
        logging.warning('that\'s not right')
        logging.error('foobar')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

enter image description here

Upvotes: 3

Related Questions