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

如何不通过继承在PyQt两个类间传值,实现设置窗口选gif后主窗口播放

实现方案

你现有代码的问题是直接修改Main类的类属性后没有触发gif刷新逻辑,PyQt跨窗口传参最标准的实现是用自定义信号槽,修改如下:

步骤1:给Settings窗口新增自定义信号

导入信号类后在Settings类中定义信号,点击确定按钮时发射信号传递选中的文件名,不需要直接修改其他类的属性,耦合度更低。

步骤2:Main窗口绑定信号自动刷新gif

Main初始化时将Settings的自定义信号和自身的gif刷新方法绑定,只要Settings发射信号,Main就会自动加载新的gif播放。


完整修改后代码

import sys
import traceback
from PyQt5 import uic
from PyQt5.QtGui import *
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget


def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)


class Settings(QWidget):
    # 自定义信号:参数为选中的gif文件名
    gif_selected = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        uic.loadUi('settings.ui', self)
        self.PB_OK.clicked.connect(self.close_this_window)
        # 修复原列表中部分文件名缺失.gif后缀的问题
        self.all_gifs = ['cosmowave1.gif', 'cosmowave2.gif', 'cosmowave3.gif', 'retrowave1.gif', 'retrowave2.gif']
        self.CB_chooseGifs.addItems(self.all_gifs)

    def close_this_window(self):
        # 取当前选中的文件名,发射信号
        selected_gif = self.CB_chooseGifs.currentText()
        self.gif_selected.emit(selected_gif)
        self.close()


class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('mainWindow.ui', self)
        init_gif = 'cosmowave1.gif'
        self.movie = QMovie(self)
        self.add_a_gif(f'gifs/{init_gif}')
        # 创建设置窗口,绑定信号到刷新方法
        self.settings_window = Settings()
        self.settings_window.gif_selected.connect(self.update_gif)
        self.settings_PB.clicked.connect(self.settings)

    def add_a_gif(self, gif_image):
        self.movie.setFileName(gif_image)
        self.GIF_LBL.setMovie(self.movie)
        self.movie.start()

    def update_gif(self, gif_name):
        # 拼接路径后刷新gif
        self.add_a_gif(f'gifs/{gif_name}')

    def settings(self):
        self.settings_window.show()


if __name__ == '__main__':
    sys.excepthook = except_hook
    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:54:04