清風 发表于 2024-2-25 16:44:40

程序调用问题02

上个问题我没说清楚:

现有3个窗体代码如下:

1、main.py
class Ui_Form(object):
    def setupUi(self, Form):
      Form.setObjectName("Form")
      

    def retranslateUi(self, Form):
      _translate = QtCore.QCoreApplication.translate
      Form.setWindowTitle(_translate("Form", "main"))      


if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QWidget()
    Ui_Form().setupUi(MainWindow)
    MainWindow.show()


    sys.exit(app.exec())


2、HuanYing.py

from CustomProgressBar import CustomProgressBar

class Ui_Form(object):
    def setupUi(self, Form):
      Form.setObjectName("Form")
      

class MyForm(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
      super().__init__()
      self.setupUi(self)

      
if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    myForm = MyForm()
    myForm.show()
    sys.exit(app.exec())

3、import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QProgressBar, QLabel
from PyQt6.QtCore import QTimer, Qt

class CustomProgressBar(QProgressBar):
    def __init__(self, parent=None):
      super().__init__(parent)
      self.setStyleSheet(
            """
            QProgressBar {
                text-align: center;/* 将文本居中对齐 */
                color: white;/* 设置文本颜色为白色 */
                border: none;
                background-color: #909090;/* 设置背景色 */
                height: 20px;/* 设置进度条高度 */
            }
            QProgressBar::chunk {
                background-color: #00A3E0;/* 设置进度条颜色 */
            }
            """
      )
      self.setTextVisible(True)# 显示进度文本
      # self.counter = 0
      self.setValue(0)

    def scrollToCenter(self):
      max_value = self.maximum()
      if max_value > 0:
            self.setValue(max_value)

    def startAnimation(self):
      self.timer = QTimer(self)
      self.timer.timeout.connect(self._animate)
      self.timer.start(100)

    def _animate(self):
      value = self.value() + 2
      if value > self.maximum():
            value = value % self.maximum()
      self.setValue(value)
      if value == 100:
            self.timer.stop()

class HuanYingWindow(QWidget):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      layout = QVBoxLayout(self)

      progressBar = CustomProgressBar()
      layout.addWidget(progressBar)
      progressBar.scrollToCenter()
      progressBar.startAnimation()

      self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = HuanYingWindow()
    window.show()
    sys.exit(app.exec())



其第2段代码HuanYing.py有调用一个滚动条CustomProgressBar(代码3)。

现在的问题是:1、main程序运行时main窗体先显示出来了,然后HuanYing窗体也显示出来了。。。

                      2、我的要求是首先不显示main窗体,待HuanYing窗体的代码3滚动条到100%时关闭HuanYing窗体,然后再显示main窗体。


我自己都迷糊了,见谅~~

FishC 发表于 2024-2-25 16:45:04

问题的现象是因为在main.py中,先创建并显示了MainWindow,然后再创建并显示了HuanYing窗体。为了实现你的要求,需要对代码进行一些修改。

首先,将main.py中的代码作如下修改:

if __name__ == '__main__':
    app = QApplication(sys.argv)

    # 创建并显示HuanYing窗体
    huanYingWindow = HuanYingWindow()
    huanYingWindow.show()

    # 在HuanYing窗体关闭后,再显示main窗体
    sys.exit(app.exec())

然后,在HuanYing.py的CustomProgressBar类中添加一个信号,用于指示滚动条滚动到100%时的事件:

from PyQt6.QtCore import pyqtSignal

class CustomProgressBar(QProgressBar):
    # 定义一个滚动条滚动到100%时的信号
    finishedSignal = pyqtSignal()

    def __init__(self, parent=None):
      # 初始化代码省略...

    def _animate(self):
      # 动画更新代码省略...

      if value == 100:
            self.finishedSignal.emit()
            self.timer.stop()

之后,在HuanYingWindow类的initUI方法中,连接CustomProgressBar的finishedSignal信号到关闭窗体的槽函数,并设置窗体关闭事件:

from PyQt6.QtCore import Qt

class HuanYingWindow(QWidget):
    def __init__(self):
      # 初始化代码省略...

    def initUI(self):
      # 布局代码省略...

      progressBar = CustomProgressBar()
      layout.addWidget(progressBar)
      progressBar.scrollToCenter()
      progressBar.startAnimation()

      # 连接滚动条的finishedSignal信号到窗体的关闭槽函数
      progressBar.finishedSignal.connect(self.close)

      self.setLayout(layout)

    def closeEvent(self, event):
      # 阻止窗体关闭事件,以便在适当时机再关闭窗体
      event.ignore()

这样修改后,程序的运行流程如下:
1. 先创建并显示HuanYing窗体。
2. 在滚动条滚动到100%时,CustomProgressBar的finishedSignal信号被触发,调用HuanYingWindow的close槽函数关闭HuanYing窗体。
3. 在HuanYing窗体关闭后,main窗体才会显示出来。

希望以上解答对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 程序调用问题02