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()
|