【项目亲测有效】【python-QTimer定时器】【方法二】解决同位置创建不同提示语,提示数秒后取消提示,出现与其它提示语重叠,如何解决?(只有一个QTimer定时器时)

小伙伴们,我们先来看问题,看看是不是和你遇到的一样。。。

1、触发了提示一:“账号不可大于20位!”,提示出现3秒后消失(图一);

2、在触发提示一后,继续触发提示二:“密码不可为空!”,此时出现了提示重叠(图二);

这个提示重叠是否和你遇到的一样呢,来往下看,先看代码的实现;

大概实现是点击登录按钮后,判断账号与密码的输入,校验输入的内容并给出提示,提示3秒后,提示消失,回到初始页面;

# 非项目完整代码(抽出部分举例)

import sys
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication


# 主窗口——登录
class Login_Window(QMainWindow, Ui_Login_Window, Login_Time_Action):

    def __init__(self, parent=None):
        super(Login_Window, self).__init__(parent)
        self.loginUi(self) # 调用页面ui文件

        # 按钮信号槽
        self.login_button.clicked.connect(self.login_action)

        # 定时器信号槽
        self.colse_tip_time = QTimer(self)
        self.colse_tip_time.timeout.connect(self.colse_tip)

        # 页面提示初始化关闭(保持原来页面)
        self.tip1_frame.setVisible(False)
        self.tip2_frame.setVisible(False)


	# 登录按钮槽函数
    def login_action(self):

		if len(username) > 20: # 输入大于20
		self.tip1_frame.setVisible(True)  # 显示文本“账号不可大于20位!”
		self.tip1.setText(" 账 号 不 可 大 于 20 位 ! ")
		self.username_input.setStyleSheet("border:2px solid rgb(221, 85, 51);"
										  "border-radius: 8px;") # 变更输入框边为红色

		self.colse_tip_time.start(3000) # 提示后,3秒触发定时器函数,回到初始页面
		self.username_input.clear()

		elif password == '': # 输入为空
		self.tip2_frame.setVisible(True)  # 显示文本“账号不可大于20位!”
		self.tip2.setText(" 密 码 不 可 为 空 !")
		self.password_input.setStyleSheet("border:2px solid rgb(221, 85, 51);"
										  "border-radius: 8px;") # 变更输入框边为红色
		
        self.colse_tip_time.start(3000)# 提示后,3秒触发定时器函数,回到初始页面

	# 定时器槽函数
	def colse_tip(self):
		
		# 关闭提示
		self.tip1_frame.setVisible(False)
		self.tip2_frame.setVisible(False)

		# 恢复输入框原本样式
		self.password_input.setStyleSheet(
			"color:#999; background-color:#fff; border-radius:8px; border:1px solid #ccc;")
		self.username_input.setStyleSheet(
			"color:#999; background-color:#fff; border-radius:8px; border:1px solid #ccc;")
        self.colse_tip_time.stop() # 关闭定时器
        del self.colse_tip_time # 删除定时器释放资源


if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWin = Login_Window()
    MainWin.show()
    sys.exit(app.exec_())

按上述代码,大概的需求是已经实现了的,能在对应的情况下给出对应的提示。但是在连续触发提示时则会重叠;

解决:

其实认真思路一下,可以发现还是定时器引起的问题,在上一个提示未取消前(3秒),继续触发下一个则会一并触发,出现重叠。

但是没有这个定时器的话,我们又没有办法实现3秒后取消提示。所以,我们除了在初始化时需要隐藏提示外,在点击登录按钮(进入槽函数时)也需要再初始化一次提示的元素;

下面是修改后的迭代,可以和上面的代码前后对比一下;

# 非项目完整代码(抽出部分举例)

	# 登录按钮槽函数
    def login_action(self):

        # 1、再次初始化提示的元素,使每次点击按钮,提示的元素都是处于一个隐藏的状态,
        # 2、当进入判断条件后,我们需要哪个提示元素,则直接修改状态为显示即可
        self.tip1_frame.setVisible(False)
        self.tip2_frame.setVisible(False)

		if len(username) > 20: # 输入大于20
		self.tip1_frame.setVisible(True)  # 显示提示元素一,文本“账号不可大于20位!”
		self.tip1.setText(" 账 号 不 可 大 于 20 位 ! ")
		self.username_input.setStyleSheet("border:2px solid rgb(221, 85, 51);"
										  "border-radius: 8px;") # 变更输入框边为红色
		
        self.colse_tip_time.start(3000) # 提示后,3秒触发定时器函数,回到初始页面
		self.username_input.clear()

		elif password == '': # 输入为空
		self.tip2_frame.setVisible(True)  # 显示提示元素二,文本“账号不可大于20位!”
		self.tip2.setText(" 密 码 不 可 为 空 !")
		self.password_input.setStyleSheet("border:2px solid rgb(221, 85, 51);"
										  "border-radius: 8px;") # 变更输入框边为红色

		self.colse_tip_time.start(3000) # 提示后,3秒触发定时器函数,回到初始页面

下面解释一下,两个地方初始化的作用

1、在页面初始化是为了,当进入页面的时候,我们需要保持页面原来的模样,不显示提示的元素样式出来,如何没有初始化的话,会是这样。。(图三)

2、而在“登录函数”中的初始化的,是为了我们在触发提示后(有定时器3秒/数秒的延迟),再次点击登录按钮触发其它提示时。使页面回到初始化状态,再触发第二次提示,可以理解成在第二提示触发前,会先隐藏所有的提示再触发,变相的关闭了其它提示。这个就不会造成重叠了。下面是修改代码后的效果。。(图四)

如果不止一个定时器的情况下,如何解决呢?

关注我看帖子(多个定时器时)【项目亲测有效】【python-pyqt-QTimer】同位置创建不同提示语,提示数秒后取消提示,出现与其它提示语重叠,如何解决?

有疑问欢迎评论留意!!

亲测有效,制作不易,你的点赞是小菜更新的动力,点个赞加个关注吧~

关注我,分享更多项目实际案例问题,帮您解决更多问题,少走弯路!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值