You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5使用QTimer.singleShot实现标签切换仅显示第二个标签问题求助

问题根因
  • 绿色标签label1创建完成后未调用show()方法,Qt控件默认创建后为隐藏状态,无法直接显示
  • QTimer.singleShot为异步非阻塞API,调用后不会阻塞当前代码执行,你把切换标签的逻辑直接写在了singleShot之后,代码会立刻执行切换操作,2秒延迟完全没有生效
  • 需要延迟执行的标签切换逻辑没有绑定到singleShot的回调槽函数中,空的empty函数没有任何实际作用
修正后完整代码
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

labelList = [None, None]

def firstLabel(frame):
    label1 = QtWidgets.QLabel(window)
    label1.setGeometry(240, 80, 40, 40)
    label1.setStyleSheet("background-color: rgb(20, 87, 30)")
    labelList[0] = label1
    label1.show() # 新增:显示绿色标签
    secondLabel(frame)

def switchLabel(frame):
    # 延迟2秒后执行的切换逻辑
    label2 = QtWidgets.QLabel(window)
    label2.setGeometry(20, 40, 200, 120)
    label2.setStyleSheet("background-color: rgb(255, 75, 20);")
    label2.show()
    labelList[1] = label2
    labelList[0].hide()

def secondLabel(frame):
    # 把切换逻辑绑定到定时器回调,2秒后自动触发
    QtCore.QTimer.singleShot(2000, lambda: switchLabel(frame))

def myFunc(frame):
    firstLabel(frame)

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setFixedWidth(300)
window.setFixedHeight(200)
window.setWindowTitle("Window")
window.move(100, 50)

frame = QtWidgets.QFrame(window)
frame.setGeometry(0, 0, 300, 200)
frame.setStyleSheet("background-color: rgb(208, 208, 208);")
myFunc(frame)

window.show()
sys.exit(app.exec_())

内容的提问来源于stack exchange,提问作者GrantWard101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:06:03