Python 日志发射函数和QT发射信号之间的名称冲突
我试图在每次调用日志处理程序emit函数时发送一个Qt信号。但是我认为MyLogHandler.emit和log.emit函数是冲突的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
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”传递给处理程序。注意:我的答案是概念性的,我不是想提供关于可读性或顺序的最佳代码,我只是想解决实际问题。如果你想