gpt4 book ai didi

python - pyqt 的信号与直接调用方法

转载 作者:行者123 更新时间:2023-11-28 22:56:19 24 4
gpt4 key购买 nike

我正在努力弄清楚为什么人们想要使用 pyqt 信号/槽而不是直接调用类方法。

这是一个简单的代码片段,说明了我的看法:

from PyQt4 import QtGui, QtCore

class Simple_signal(QtCore.QObject):
single_signal = QtCore.pyqtSignal()
double_signal = QtCore.pyqtSignal()

def __init__(self):
super().__init__()
# Connect one signal to one slot
self.single_signal.connect(self.handle_signal_choice1)

# Connect another signal to two slots
self.double_signal.connect(self.handle_signal_choice1)
self.double_signal.connect(self.handle_signal_choice2)

# Connect to one method
self.method = self.handle_signal_choice3

def handle_signal_choice1(self):
print("Simple_signal - CHOICE1 received")

def handle_signal_choice2(self):
print("Simple_signal - CHOICE2 received")

def handle_signal_choice3(self):
print("Simple_signal - CHOICE3 received")

if __name__ == "__main__":
simple_signal = Simple_signal()
print('Calling choice1 via single_signal')
simple_signal.single_signal.emit()

print('Calling choice1 and choice2 via double_signal')
simple_signal.double_signal.emit()

print('Calling choice3 via class method')
simple_signal.method()

信号的一个直接优势似乎是:将信号附加到两个插槽相当容易。但是,我也可以毫不费力地使用方法示例来做到这一点。

方法示例似乎比信号/槽示例获得更好的 CPU 时间结果(即更快),但如果您需要从一个信号调用多个槽,则可能会失去这种优势。

在我看来,调用方法比弄乱信号/槽设置更干净。

两者都适用于 QWidgets。

我是否需要更复杂的情况,信号/槽是比直接调用方法更好的选择?

谢谢。

编辑:出于对每种方法消耗的时间的好奇,我做了一些 timeit 检查。

将这些 timeit 行添加到代码中,并将原始代码(即 handle_signal_choice1 中)中的每个“打印”行替换为“pass”,这样打印到 shell 就不会减慢速度。

result=timeit.timeit('simple_signal.single_signal.emit()', 'from __main__ import simple_signal', number=10000)
print('Calling choice1 via single_signal')
print('timeit says : ', result)

result=timeit.timeit('simple_signal.double_signal.emit()', 'from __main__ import simple_signal', number=10000)
print('Calling choice1 and choice2 via double_signal')
print('timeit says : ', result)

result=timeit.timeit('simple_signal.method()', 'from __main__ import simple_signal', number=10000)
print('Calling choice3 via method')
print('timeit says : ', result)

这给了我以下结果,这证实了我对单个方法调用比单个信号/槽更快的怀疑:

Now start timeit tests
Calling choice1 via single_signal
timeit says : 0.010595089312688225
Calling choice1 and choice2 via double_signal
timeit says : 0.014604222516910098
Calling choice3 via method
timeit says : 0.0016033988748859057

如果您通过信号/槽而不是方法来驱动套接字事件循环,那将是一个很大的不同。单击按钮无关紧要。

最佳答案

使用信号和槽的原因不在于速度,而在于 loose coupling .使用信号和槽可以更好地重用。有一个 nice paper这超越了动机和好处。它确实增加了一些间接性,但恕我直言,这是非常值得的。

关于python - pyqt 的信号与直接调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com