PyQt: QMessageBox Duplication

news2024/10/23 15:23:45

在使用 PyQt 的 QMessageBox 时,如果你遇到 消息框重复显示QMessageBox 重复实例化 的问题,通常是因为消息框没有正确管理或关闭,或者消息框的创建和显示逻辑中存在重复调用。以下是一些常见原因和解决方案。

在这里插入图片描述

1、问题背景

在 PyQt 中使用 QMessageBox 时,发现了一个重复的问题。当用户在回答问题时,会弹出一个确认消息框。然而,当用户确认并继续下一个问题时,会有 2 个消息框弹出,然后是 3 个,以此类推。

以下代码描述了该问题:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class IntegrationQuestions(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QDialog.__init__(self, parent)
        self.setWindowTitle('Integration')
        self.setMinimumSize(265,400)
        self.setMaximumSize(266,401)
        self.Question1()

    def Question1(self):
        # 从另一个文件中获取问题
        from FQuestions import FIntQuestion, FIntAnswer

        self.lbl1 = QtGui.QLabel("Integrate the equation below",self)
        self.lbl1.move(0,0)
        self.lbl1.resize(200,20)

        self.lbl2 = QtGui.QLabel(pretty(FIntQuestion[0], use_unicode = False), self)
        self.lbl2.resize(200, 80)
        self.lbl2.move(30,30)

        self.lbl3 = QtGui.QLabel("Sketch pad",self)
        self.lbl3.move(0,120)

        # 用户可以用来演算的自由区域
        self.SketchPad = QtGui.QTextEdit(self)
        self.SketchPad.resize(250,150)
        self.SketchPad.move(0,150)

        self.lbl4 = QtGui.QLabel("Answer",self)
        self.lbl4.move(0,300)

        # 用户输入的答案
        self.Answer = QtGui.QLineEdit(self)
        self.Answer.move(0,330)
        self.Answer.resize(250,20)

        self.next_question = QtGui.QPushButton('Next', self)
        self.next_question.move(160,360)

        # 连接按钮的单击事件和处理问题1的方法
        self.next_question.clicked.connect(self.HandleQuestion1)

        # 用于存储用户回答所有问题后的分数
        self.score = 0

        # 用于测试
        print(FIntAnswer[0])

    def HandleQuestion1(self):
        from FQuestions import FIntAnswer

        # 弹出确认消息框,询问用户是否确认答案
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure this is your final answer?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)

        # 如果用户确认答案,则检查答案是否正确
        if reply == QtGui.QMessageBox.Yes:
            if self.Answer.text() == FIntAnswer[0]:
                self.score += 1
            else:
                self.score += 0

            # 如果用户确认,则继续下一个问题
            self.Question2()

    def Question2(self):
        from FQuestions import FIntQuestion, FIntAnswer

        # 更新问题文本
        self.lbl2.setText(pretty(FIntQuestion[1], use_unicode = False))

        # 连接按钮的单击事件和处理问题2的方法
        self.next_question.clicked.connect(self.HandleQuestion2)

        # 用于测试
        print(FIntAnswer[1])

    def HandleQuestion2(self):
        from FQuestions import FIntAnswer

        # 弹出确认消息框,询问用户是否确认答案
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure this is your final answer?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)

        # 如果用户确认答案,则检查答案是否正确
        if reply == QtGui.QMessageBox.Yes:
            if self.Answer.text() == FIntAnswer[1]:
                self.score += 1
            else:
                self.score += 0

            # 如果用户确认,则继续下一个问题
            self.Question3()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = IntegrationQuestions()
    window.show()
    sys.exit(app.exec_())

当用户回答第一个问题并单击“Next”按钮时,会弹出一个消息框询问是否确认答案。如果用户确认,则会继续下一个问题。然而,当用户回答第二个问题并单击“Next”按钮时,会出现两个消息框,其中一个是第一个问题的确认消息框,另一个是第二个问题的确认消息框。以此类推,每回答一个问题,就会出现一个新的消息框。

2、解决方案

要解决这个问题,需要在连接新方法之前断开以前连接的信号。例如,在 HandleQuestion2 方法中,可以先断开 next_question 按钮与 HandleQuestion1 方法的连接,然后再将其与 HandleQuestion2 方法连接。

    # 断开按钮与处理问题1方法的连接
    self.next_question.clicked.disconnect(self.HandleQuestion1)

    # 连接按钮与处理问题2方法
    self.next_question.clicked.connect(self.HandleQuestion2)

这样,当用户回答第二个问题并单击“Next”按钮时,只会弹出一个消息框询问是否确认答案,而不会出现两个消息框。

以下代码展示了修正后的代码:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class IntegrationQuestions(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QDialog.__init__(self, parent)
        self.setWindowTitle('Integration')
        self.setMinimumSize(265,400)
        self.setMaximumSize(266,401)
        self.Question1()

    def Question1(self):
        # 从另一个文件中获取问题
        from FQuestions import FIntQuestion, FIntAnswer

        self.lbl1 = QtGui.QLabel("Integrate the equation below",self)
        self.lbl1.move(0,0)
        self.lbl1.resize(200,20)

        self.lbl2 = QtGui.QLabel(pretty(FIntQuestion[0], use_unicode = False), self)
        self.lbl2.resize(200, 80)
        self.lbl2.move(30,30)

        self.lbl3 = QtGui.QLabel("Sketch pad",self)
        self.lbl3.move(0,120)

        # 用户可以用来演算的自由区域
        self.SketchPad = QtGui.QTextEdit(self)
        self.SketchPad.resize(250,150)
        self.SketchPad.move(0,150)

        self.lbl4 = QtGui.QLabel("Answer",self)
        self.lbl4.move(0,300)

        # 用户输入的答案
        self.Answer = QtGui.QLineEdit(self)
        self.Answer.move(0,330)
        self.Answer.resize(250,20)

        self.next_question = QtGui.QPushButton('Next', self)
        self.next_question.move(160,360)

        # 连接按钮的单击事件和处理问题1的方法
        self.next_question.clicked.connect(self.HandleQuestion1)

        # 用于存储用户回答所有问题后的分数
        self.score = 0

        # 用于测试
        print(FIntAnswer[0])

    def HandleQuestion1(self):
        from FQuestions import FIntAnswer

        # 弹出确认消息框,询问用户是否确认答案
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure this is your final answer?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)

        # 如果用户确认答案,则检查答案是否正确
        if reply == QtGui.QMessageBox.Yes:
            if self.Answer.text() == FIntAnswer[0]:
                self.score += 1
            else:
                self.score += 0

            # 断开按钮与处理问题1方法的连接
            self.next_question.clicked.disconnect(self.HandleQuestion1)

            # 如果用户确认,则继续下一个问题
            self.Question2()

    def Question2(self):
        from FQuestions import FIntQuestion, FIntAnswer

        # 更新问题文本
        self.lbl2.setText(pretty(FIntQuestion[1], use_unicode = False))

        # 连接按钮的单击事件和处理问题2的方法
        self.next_question.

通过上面这些方法,我们就可以避免 QMessageBox 的重复显示问题,并确保应用的对话框逻辑运行顺畅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无心剑七绝《泊院雕楼》

七绝泊院雕楼 清歌咏尽桂花香 泊院雕楼醉夕阳 逸兴无端飞万里 幽情宛转忆潇湘 2024年10月13日 平水韵七阳平韵 这首七绝《泊院雕楼》以清新脱俗的语言,描绘了一幅宁静致远的画面。 首句“清歌咏尽桂花香”,以“清歌”起兴,形象地描绘了桂花香…

C++——类和对象(三)

一.赋值运算符 1.运算符重载 (1) 运算符重载是具有特殊名字的函数,他的名字是由operator和后面要定义的运算符共同构成。和其他函数一样,它也具有其返回类型和参数列表以及函数体。 (2) 重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。…

React.createRef(),React.forwardRef(),forwardRef()结合next.js的link进行路由跳转

码云https://gitee.com/skyvilm/react-next.js 1.React.createRef() 作用:获取dom元素 使用 import React,{Component} from react export default class Index extends Componen{ constructor(props){ super(props) this.myrefReact.createRef(); //创建节点 } c…

如何批量从sql语句中提取表名

简介 使用的卢易表 的提取表名功能,可以从sql语句中批量提取表名。采用纯文本sql语法分析,无需连接数据库,支持从含非sql语句的文件文件中提取,支持各类数据库sql语法。 特点 快:从成百个文件中提取上千个表名只需1…

集成方案 | 借助 Microsoft Copilot for Sales 与 Docusign,加速销售流程!

加速协议信息提取,随时优化邮件内容~ 在当今信息爆炸的时代,销售人员掌握着丰富的数据资源。他们能够通过 CRM 平台、电子邮件、合同库以及其他多种记录系统,随时检索特定个人或组织的关键信息。这些数据对于销售沟通至关重要。然而&#x…

【端到端】CVPR 2023最佳论文:UniAD解读

作者:知乎一根呆毛授权发布 传统的端到端网络是用多个小model串起来,但这会有误差累积的问题,因此我们提出了UniAD,一个综合框架,把所有任务整合到一个网络。整一个网络都是为planner而进行设计的。 Introduction a传…

SQL性能优化指南:如何优化MySQL多表join场景

目录 多表join问题SQL 这里解释下 Using join buffer (Block Nested Loop): 对性能产生的影响: 三种join算法介绍 join操作主要使用以下几种算法: (1)Nested Loop Join (2)Block Nested …

生信服务器配置:优化生物信息学数据处理的最佳实践

介绍 在生物信息学研究中,处理和分析大规模数据集(如基因组、转录组和蛋白质组数据)需要强大的计算资源和精确的服务器配置。生信服务器配置的优化可以显著提高数据处理的效率和结果的准确性。本文将探讨生信服务器配置的关键要素&#xff0…

【LeetCode热题100】分治-快排

本篇博客记录分治快排的4道题目&#xff1a;颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素&#xff08;库存管理&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…

【实战项目】——Boost搜索引擎(五万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、项目的相关背景 1.1、什么是Boost库&#xff1f; 1.2、什么是搜索引擎&#xff1f; 1.3、为什么要做Boost库搜索引擎&#xff1f; 二、搜索引擎的宏观原…

VirtualBOX虚拟机提高速度,鼠标卡顿解决——未来之窗数据恢复

一、刚安装完操作系统&#xff0c;鼠标操作不灵敏 需要安装系统增强 二、系统增强作用 1.鼠标丝滑 2.文件共享 3.可以共享剪贴板 三、安装步骤-设备-安装增强 四、安装步骤-设备-选择光驱 五、安装增强软件然后重启 六、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进…

【算法】动态规划:从斐波那契数列到背包问题

【算法】动态规划&#xff1a;从斐波那契数列到背包问题 文章目录 【算法】动态规划&#xff1a;从斐波那契数列到背包问题1.斐波那契数列2.爬楼梯3.零钱转换Python代码 4.零钱兑换 II5.组合数dp和排列数dp6.为什么动态规划的核心思想计算组合数的正确方法代码实现 为什么先遍历…

【C++打怪之路Lv8】-- string类

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

智能汽车智能网联

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

深入理解线性表--顺序表

目录 顺序表- Seqlist -> sequence 顺序 list 表 顺序表的概念 问题与解答 顺序表的分类 静态顺序表 动态顺序表 问题与解答(递进式) 动态顺序表的实现 尾插 头插 尾删 头删 指定位置插入 指定位置删除 销毁 总结 前言&#xff1a;线性表是具有相同特性的一类数据结构…

【exceljs】纯前端如何实现Excel导出下载和上传解析?

前段时间写过一篇类似的文章&#xff0c;介绍了sheetjs。最近发现了一个更好用的库ExcelJS&#xff0c;它支持高级的样式自定义&#xff0c;并且使用起来也不复杂。实际上sheetjs也支持高级自定义样式&#xff0c;不过需要使用付费版。 下面对比了Exceljs和Sheetjs&#xff1a…

Linux的习题+一道回溯类型的算法题

Linux的习题 Linux环境与版本 1.linux 2.6.* 内核默认支持的文件系统有哪些&#xff1f;[多选] A.ext3 B.ext2 C.ext4 D.xfs E.ufs 正确答案&#xff1a;ABCD A 全称Linux extended file system, extfs,即Linux扩展文件系统&#xff0c;ext2为第二代 D XFS一种高性能的日…

使用频率最高的 opencv 基础绘图操作 - python 实现

以下是 opencv-python 基本操作绘制示例&#xff0c;绘制&#xff1a; 1&#xff09;圆&#xff0c;2&#xff09;矩形&#xff0c;3&#xff09;线段&#xff0c;4&#xff09;文本。 安装 opencv-python pip install opencv-python 在图上绘制圆的操作&#xff0c;示例如…

HCIP-HarmonyOS Application Developer 习题(五)

1、以下哪种原子化布局能力属于自适应变化能力? A. 拉伸 B.占比 C. 隐藏 D.拆行 答案&#xff1a;A 分析&#xff1a;划分为“自适应变化能力”和“自适应布局能力”两类。 其中&#xff0c;自适应变化能力包含了缩放能力和拉伸能力&#xff0c;自适应布局能力包含了隐藏、折…

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…