Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 日志发射函数和QT发射信号之间的名称冲突_Python_Pyqt_Pyqt5_Pyside_Pyside2 - Fatal编程技术网

Python 日志发射函数和QT发射信号之间的名称冲突

Python 日志发射函数和QT发射信号之间的名称冲突,python,pyqt,pyqt5,pyside,pyside2,Python,Pyqt,Pyqt5,Pyside,Pyside2,我试图在每次调用日志处理程序emit函数时发送一个Qt信号。但是我认为MyLogHandler.emit和log.emit函数是冲突的 from PySide2.QtCore import QObject, Signal import logging class MyLogHandler(logging.Handler, QObject): log = Signal(str) def emit(self, record): self.log.emit('sen

我试图在每次调用日志处理程序emit函数时发送一个Qt信号。但是我认为MyLogHandler.emit和log.emit函数是冲突的

from PySide2.QtCore import QObject, Signal
import logging

class MyLogHandler(logging.Handler, QObject):
    log = Signal(str)

    def emit(self, record):
        self.log.emit('send')

if __name__ == "__main__":
    logging.getLogger().addHandler(MyLogHandler())
    logging.warning('logging test')
错误:

TypeError: emit() takes 2 positional arguments but 3 were given
更新:

我曾尝试使用composition(per@eyllansc),但仍然无法将信号连接到QML文件。我不确定为什么我不能在QML中接收信号。它似乎没有发出任何东西。我做错了什么

from functools import cached_property
import logging
import sys

from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
from PySide2.QtCore import QCoreApplication, QObject, QTimer, Signal, QUrl

class Main(QObject):
    log = Signal(str)


class Log(object):
    def __init__(self):
        logging.basicConfig(
            level=logging.DEBUG,
            format="%(asctime)s [%(levelname)s] %(message)s",
            handlers=[
                logging.FileHandler("debug.log", mode='w'),
                logging.StreamHandler(),
                MyLogHandler()
            ]
        )

class MyLogHandler(logging.Handler):
    @cached_property
    def main(self):
        return Main()

    def emit(self, record):
        msg = self.format(record)
        self.main.log.emit(msg)


if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    main = Main()

    Log()

    QTimer.singleShot(1000, lambda: logging.warning("logging test"))
    engine.rootContext().setContextProperty("main", main)
    engine.load(QUrl("Main3.qml"))
    app.exec_()
QML:Main3.QML

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    width: 500
    height: 500
    visible: true
    title: qsTr("MIST")

    Text {
        id: text
        anchors.fill: parent

    }

    Connections {
        target: main

        function onLog(msg) {
            text.text = msg
        }

    }
}

问题是两个基类都有一个导致冲突的
emit()
方法。解决方法不是使用继承,而是使用组合:

从functools导入缓存的\u属性
导入日志记录
从PySide2.QtCore导入QCoreApplication、QObject、QTimer、Signal
类桥(QObject):
日志=信号(str)
类MyLogHandler(logging.Handler):
@缓存的不动产
def桥接器(自):
返回桥()
def排放(自我,记录):
msg=self.format(记录)
self.bridge.log.emit(msg)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QCoreApplication()
handler=MyLogHandler()
handler.bridge.log.connect(打印)
logging.getLogger().addHandler(handler)
QTimer.singleShot(1000,lambda:logging.warning(“logging test”))
QTimer.singleShot(2000,QCoreApplication.quit)
app.exec()
更新:

导入日志
导入系统
从PySide2.QtCore导入QObject、QTimer、QUrl、Signal
从PySide2.QtGui导入qgui应用程序
从PySide2.QtQml导入QQmlApplicationEngine
主类(QObject):
日志=信号(str)
类QLogHandler(logging.Handler):
def _u初始(自身,发射器):
super()。\uuuu init\uuuuu()
自发光体=发光体
@财产
def发射器(自身):
返回自我。\u发射器
def排放(自我,记录):
msg=self.format(记录)
self.emitter.log.emit(msg)
def配置_日志(*,处理程序):
logging.basicConfig(
级别=logging.DEBUG,
format=“%(asctime)s[%(levelname)s](消息)s”,
处理程序=处理程序,
)
def main():
app=QGuiApplication()
main=main()
配置日志记录(
处理者=[
logging.FileHandler(“debug.log”,mode=“w”),
logging.StreamHandler(),
QLogHandler(主),
]
)
引擎=QQmlApplicationEngine()
engine.rootContext().setContextProperty(“main”,main)
发动机负荷(QUrl(“Main3.qml”))
QTimer.singleShot(1000,lambda:logging.warning(“logging test”))
ret=app.exec
系统退出(ret)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

问题在于两个基类都有一个导致冲突的
emit()
方法。解决方法不是使用继承,而是使用组合:

从functools导入缓存的\u属性
导入日志记录
从PySide2.QtCore导入QCoreApplication、QObject、QTimer、Signal
类桥(QObject):
日志=信号(str)
类MyLogHandler(logging.Handler):
@缓存的不动产
def桥接器(自):
返回桥()
def排放(自我,记录):
msg=self.format(记录)
self.bridge.log.emit(msg)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QCoreApplication()
handler=MyLogHandler()
handler.bridge.log.connect(打印)
logging.getLogger().addHandler(handler)
QTimer.singleShot(1000,lambda:logging.warning(“logging test”))
QTimer.singleShot(2000,QCoreApplication.quit)
app.exec()
更新:

导入日志
导入系统
从PySide2.QtCore导入QObject、QTimer、QUrl、Signal
从PySide2.QtGui导入qgui应用程序
从PySide2.QtQml导入QQmlApplicationEngine
主类(QObject):
日志=信号(str)
类QLogHandler(logging.Handler):
def _u初始(自身,发射器):
super()。\uuuu init\uuuuu()
自发光体=发光体
@财产
def发射器(自身):
返回自我。\u发射器
def排放(自我,记录):
msg=self.format(记录)
self.emitter.log.emit(msg)
def配置_日志(*,处理程序):
logging.basicConfig(
级别=logging.DEBUG,
format=“%(asctime)s[%(levelname)s](消息)s”,
处理程序=处理程序,
)
def main():
app=QGuiApplication()
main=main()
配置日志记录(
处理者=[
logging.FileHandler(“debug.log”,mode=“w”),
logging.StreamHandler(),
QLogHandler(主),
]
)
引擎=QQmlApplicationEngine()
engine.rootContext().setContextProperty(“main”,main)
发动机负荷(QUrl(“Main3.qml”))
QTimer.singleShot(1000,lambda:logging.warning(“logging test”))
ret=app.exec
系统退出(ret)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

请查看我的更新,我似乎无法将信号连接到GUI@Aaron您正在创建两个不同的QoObject,这就是为什么它不起作用的原因,我建议您检查基本的python注释是否有更干净的方法来编写所有这些内容?main()函数包含我的大部分重要代码,它的类型不直观,无法将qhandler.bridge导出为我的contextProperty。@一个可能的解决方案是将“main”传递给处理程序。注意:我的答案是概念性的,我不是想提供关于可读性或顺序的最佳代码,我只是想解决实际问题。如果你想谈论风格,那么你最好求助于你是了不起的埃德温!享受我刚给你买的咖啡:请看我的更新,我似乎无法将信号连接到GUI@Aaron您正在创建两个不同的QoObject,这就是为什么它不起作用的原因,我建议您检查基本的python注释是否有更干净的方法来编写所有这些内容?main()函数包含我的大部分重要代码,它的类型不直观,无法将qhandler.bridge导出为我的contextProperty。@一个可能的解决方案是将“main”传递给处理程序。注意:我的答案是概念性的,我不是想提供关于可读性或顺序的最佳代码,我只是想解决实际问题。如果你想