pyqt5는 이벤트 노드를 기반으로 자동 팝업 창을 구현합니다.

1. 수요

이벤트의 진행 노드에 따라 실현

  • 자동 팝업 창, 노드 내용을 반영하는 창
  • 자동으로 팝업 제거

QThread를 사용하여 멀티스레딩을 수행하는 것은 번거롭고 QMessage 메시지 상자를 수동으로 클릭해야 하므로 위의 요구 사항을 쉽게 실현할 수 없습니다. 여기서는 QTimer+서브윈도우 방식으로 구현한다.

여기서는 주로 "In PYQT5, click the button in the main window to pop up the sub-window" 블로그와 "Use of QTimer in PyQt5" 블로그 를 참조하십시오 .

2. 예시

여기서는 인터페이스를 만들어야 한다고 가정하는데, 인터페이스는 카운팅 기능을 구현하고 있으며, 10초마다 팝업창이 뜨고 현재 카운트를 알려주는 창이 뜬다.

효과는 다음과 같습니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

여기에 이미지 설명 삽입

3. 코드 구현

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
 
class Main(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setFixedSize(650, 400) # 窗口大小
        self.setWindowTitle("主窗口")

        # 开始计数按钮
        start_button = QPushButton("开始计数", self)
        # 关联到计数函数
        start_button.clicked.connect(self.start_calculation)

        # 终止计数按钮
        stop_button =  QPushButton("终止计数", self)
        stop_button.clicked.connect(self.stop_calculation)

        # 布局
        layout = QGridLayout()
        layout.addWidget(start_button, 1, 1)
        layout.addWidget(stop_button, 1, 2)
        self.setLayout(layout)        
        
        # 子窗口对象是否存在
        self.childWindowExist = False # 默认为不存在

    # 开始计数
    def start_calculation(self):
        print("开始计数")
        self.num = 0 # 初始计数

        self.timer = QTimer()
        self.timer.start(1000) # 间隔1秒钟执行一次操作
        self.timer.timeout.connect(self.calculation)

    # 终止计数
    def stop_calculation(self):
        print("停止计数")
        self.num = 0
        self.timer.stop()
        if self.childWindowExist:
            self.child_window.close()
        self.childWindowExist = False

    # 计数函数
    def calculation(self):
        # 每次加1
        self.num += 1
        print("当前计数为{}".format(self.num))

        if self.num % 10 == 0:
            self.childWindowExist = True
            # 如果能够整除10,则弹窗
            self.child_window = Child()
            self.child_window.window_show("当前计数为{}".format(self.num))
            self.child_window.show()

        else:
            if self.childWindowExist:
                self.child_window.close()
 
class Child(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(300, 300)
        self.setWindowTitle("子窗口")

    def window_show(self, text):

        # 展示内容
        self.label = QLabel(text)
        
        # 子窗口中的布局
        layout = QGridLayout()
        layout.addWidget(self.label, 0, 0)

        self.setLayout(layout)

#运行主窗口
if __name__ == "__main__":
    app = QApplication(sys.argv)
 
    window = Main()
    window.show()
 
    sys.exit(app.exec_())

Supongo que te gusta

Origin blog.csdn.net/qq_30841655/article/details/126952670
Recomendado
Clasificación