惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
宝玉的分享
宝玉的分享
腾讯CDC
博客园_首页
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
SecWiki News
SecWiki News
美团技术团队
P
Privacy International News Feed
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
D
DataBreaches.Net
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
S
Schneier on Security
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
Forbes - Security
Forbes - Security
D
Docker
T
Tenable Blog
S
Secure Thoughts
雷峰网
雷峰网
S
Security @ Cisco Blogs
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
阮一峰的网络日志
阮一峰的网络日志

智伤帝的个人博客

Maya 拍屏方案汇总 C++ 道法器术 C++ 基础入门 FBX 二进制数据解析 Maya RBF 算法应用 Maya 顶点色单通道笔刷 Maya CurveBrush 笔刷开发 Unreal C++ 工具开发最小实践 Maya C++ pyd 模块开发 Unreal C++ VScode 配置 Maya C++ mll hot reload 研究 Maya CMake 构建 C++ 插件编译环境 Unreal Python 导出 MetaHuman 控制器关键帧 TA 工具人知乎分享 Python 代码规范 Python - Import 机制 Python doit 库 Python dependencies 库 Python marshmallow 库
Python blinker 库
智伤帝 · 2022-02-28 · via 智伤帝的个人博客

前言

  Qt 内置了非常棒的 信号槽的函数。
  可以让 UI 进行异步调用。
  但是有些时候,并不想依赖 Qt 框架同时又能实现信号槽的功能。
  这里可以使用 blinker 库来完成。

Github 地址
官方说明文档

1
2
3
4
5
from blinker import signal,Signal

initialized = signal('initialized')
initialized is signal('initialized')
sig = Signal()

  可以使用匿名信号槽,也可以使用带名称的信号槽。


1
2
3
4
5
6
7
8
9
from blinker import signal
send_data = signal('send-data')
@send_data.connect
def receive_data(sender, **kw):
print("Caught signal from %r, data %r" % (sender, kw))
return 'received!'
result = send_data.send('anonymous', abc=123)
print(result)

  可以用装饰器的方式连接信号槽
  触发信号槽使用 send 方法
  并且信号槽执行完可以拿到函数触发的返回值。


1
2
3
4
5
6
7
8
9
from blinker import signal

dice_roll = signal('dice_roll')
@dice_roll.connect_via(1)
@dice_roll.connect_via(3)
@dice_roll.connect_via(5)
def odd_subscriber(sender):
print("Observed dice roll %r." % sender)
result = dice_roll.send(3)

  另外一个特点就是可以根据触发的参数去触发相应注册的函数。
  Qt 因为要使用 C++,这种注册方式会非常麻烦。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from blinker import signal

initialized = signal("initialized")


@initialized.connect
def initialize_call1():
print("initialize_call1")


@initialized.connect
def initialize_call2():
print("initialize_call2")


@initialized.connect
def initialize_call3():
print("initialize_call3")


for key, weakref in initialized.receivers.items():
func = weakref()
func()





  通过信号槽的 receivers 方法可以获取到注册到信号槽的所有函数。

总结

  这个库可以摆脱 Qt 的依赖实现函数的异步调用。
  如果是 Qt 的环境建议还是使用 Qt 内置的 信号槽,这样可以支持 Qt 的多线程等处理。
  但如果是 Python 环境下想要摆脱 Qt 的依赖,则推荐 blinker 来完成信号触发。
  blinker 还有个好处是可以获取到注册的函数列表,而 Qt 基于 C++ 的并没有提供这个功能,只能通过 Meta 对象来判断这个信号槽是否有函数连接。 参考实现

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 智伤帝的个人博客

打赏

  • 微信

    微信

  • 支付宝

    支付宝