64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
# 提供在主线程中调用指定函数
|
||
|
||
from PySide2.QtCore import QObject, Slot, Signal, QTimer, QMutex
|
||
from uuid import uuid4 # 唯一ID
|
||
|
||
|
||
class __CallFunc(QObject):
|
||
def __init__(self):
|
||
super().__init__()
|
||
# 信号 在主线程中调用函数
|
||
self._callFuncSignal = self.cSignal()
|
||
self._callFuncSignal.signal.connect(self._cFunc)
|
||
# 计时器停止字典
|
||
self._timerStopDict = {}
|
||
self._timerLock = QMutex()
|
||
|
||
# ========================= 【接口】 =========================
|
||
|
||
# 立刻:在主线程中调用python函数
|
||
def now(self, func, *args):
|
||
self._callFuncSignal.signal.emit((func, args))
|
||
|
||
# 延时:在主线程中调用python函数。返回计时器ID
|
||
def delay(self, func, time, *args):
|
||
timerID = str(uuid4())
|
||
|
||
def go():
|
||
timer = QTimer(self)
|
||
timer.setSingleShot(True) # 单次运行
|
||
timer.timeout.connect(lambda: self._timerFunc(timerID, func, args))
|
||
timer.start(time * 1000)
|
||
|
||
self.now(go)
|
||
return timerID
|
||
|
||
# 取消已启用的延时
|
||
def delayStop(self, timerID):
|
||
self._timerLock.lock()
|
||
self._timerStopDict[timerID] = True # 记录停止
|
||
self._timerLock.unlock()
|
||
|
||
# ==================================================
|
||
# 计时器调用的函数
|
||
def _timerFunc(self, timerID, func, args):
|
||
self._timerLock.lock()
|
||
if timerID in self._timerStopDict:
|
||
del self._timerStopDict[timerID]
|
||
self._timerLock.unlock()
|
||
return
|
||
self._timerLock.unlock()
|
||
func(*args)
|
||
|
||
# 异步调用的槽函数
|
||
@Slot("QVariant")
|
||
def _cFunc(self, args):
|
||
args[0](*args[1])
|
||
|
||
# 信号类
|
||
class cSignal(QObject):
|
||
signal = Signal("QVariant")
|
||
|
||
|
||
CallFunc = __CallFunc()
|