在项目实现过程中,有没小伙伴遇到这样的需求,在同一个位置默认一个初始的提示语,然后根据不同的场景给出不同的提示语,触发其它提示语几秒后,再默认回到初始的提示语。(关注我主页中有帖子,教你如何实现提示语提示后若干秒后关闭/回到默认状态)
举例:登录页中有个默认的提示语:请登录!当你输入密码错误时,触发提示“密码错误”3秒后,回到初始提示语“请登录!”
最近做的项目中就有这个类似的需求,实现过程中出现个问题:提示语触发后,回到默认提示语前,会与其它情况触发的提示语重叠。(图一、图二、图三、图四)
小伙伴们可以先思考一下,到底什么原因?我们正常的思路是:初始化默认的提示,当触发提示1条件时,则展示提示1、隐藏默认提示与提示2。当触发提示2条件时,则展示提示2、隐藏默认提示与提示1。以此类推下去,需要什么就展示什么,不需要则隐藏。
一开始我的实现思路也是这样,很明确很简单,但是就出现了上述的错误。
# 非项目代码(抽出部分举例)
if inupt_text =='': # 符合提示1
self.tip.setVisible(False) # 默认提示语隐藏
self.tip2.setVisible(False) # 提示2隐藏
self.tip1.setVisible(True) # 展示提示1
self.tip1.setText('垃圾还没填呢~~~') # 提示1设置提示语
self.tip1_time.start(4000) # (通过设置的信号,调用定时的槽函数)
# 槽函数内容为:X秒后,重新展示默认提示语
elif len(inupt_text) > 5: # 符合提示2
self.tip.setVisible(False) # 默认提示语隐藏
self.tip1.setVisible(False) # 提示1隐藏
self.tip2.setVisible(True) # 展示提示2
self.tip2.setText('什么垃圾名字那么长!!\n只能输入5个字哈~~')# 提示2设置提示语
self.tip2_time.start(4000)# (通过设置的信号,调用定时的槽函数)
# 槽函数内容为:X秒后,重新展示默认提示语
分析:
经过思考排查发现,当每一个提示触发后,都开启了一个定时器,定时器开启后则会一直存在。
回到问题出现的场景:
1、触发“提示1”,展示了需要的提示语(开启“提示1”的定时器,开始调用槽函数);
2、触发“提示2”,展示了需要的提示语,同一时间“提示1”的定时器中正在执行对应的槽函数(回到默认的初始页面);
所以就导致了在同时间里,“提示2”的提示语展示了、“提示1”的提示语完成了展示,通过定时器回到了“默认提示”,从而导致了重叠;(可以回看图四,重叠的内容就是“默认提示”)
(关注我主页帖子有如何设置QTimer定时器教程)
解决方法:
只要在进入判断后,在展示对应需要的提示前,停止定时器,再展示需要的提示;
self.tip2_time.stop() # QTimer定时器停止
注意:停止的定时器中,不能停止本次判断里用到的定时器,只能停止非本次判断里使用的定时器,否则会导致无法调用定时器的槽函数,无法在对应的秒数内,回到默认提示;
# 非项目代码(抽出部分举例)
if inupt_text =='': # 符合提示1
'''
解决:展示前,停止不需要用到的(提示2)的定时器,若有其它定时器一并停止,避免冲突
'''
self.tip2_time.stop() # QTimer定时器停止
self.tip.setVisible(False) # 默认提示语隐藏
self.tip2.setVisible(False) # 提示2隐藏
self.tip1.setVisible(True) # 展示提示1
self.tip1.setText('垃圾还没填呢~~~') # 提示1设置提示语
self.tip1_time.start(4000) # (通过设置的信号,调用定时的槽函数)
# 槽函数内容为:X秒后,重新展示默认提示语
elif len(inupt_text) > 5: # 符合提示2
'''
解决:展示前,停止不需要用到的(提示1)的定时器,若有其它定时器一并停止,避免冲突
'''
self.tip1_time.stop() # QTimer定时器停止
self.tip.setVisible(False) # 默认提示语隐藏
self.tip1.setVisible(False) # 提示1隐藏
self.tip2.setVisible(True) # 展示提示2
self.tip2.setText('什么垃圾名字那么长!!\n只能输入5个字哈~~')# 提示2设置提示语
self.tip2_time.start(4000)# (通过设置的信号,调用定时的槽函数)
# 槽函数内容为:X秒后,重新展示默认提示语
如果只有一个定时器的情况下,如何解决呢?
关注我看帖子
(只有一个QTimer定时器时)【项目亲测有效】【python-pyqt-QTimer】【解决二】同位置创建不同提示语,提示数秒后取消提示,出现与其它提示语重叠,如何解决?
有疑问欢迎评论留意!!
亲测有效,制作不易,你的点赞是小菜更新的动力,点个赞加个关注吧~
关注我,分享更多项目实际案例问题,帮您解决更多问题,少走弯路!!