小伙伴们,我们先来看问题,看看是不是和你遇到的一样。。。
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】同位置创建不同提示语,提示数秒后取消提示,出现与其它提示语重叠,如何解决?
有疑问欢迎评论留意!!
亲测有效,制作不易,你的点赞是小菜更新的动力,点个赞加个关注吧~
关注我,分享更多项目实际案例问题,帮您解决更多问题,少走弯路!!!