【问题标题】:How to prevent PyQt Line Edit and Message Box from being stuck in an infinite loop?如何防止 PyQt 行编辑和消息框陷入无限循环?
【发布时间】:2019-02-12 16:45:55
【问题描述】:

在下面的代码中,在行编辑框中进行任何类型的编辑或完成后,都会调用修改函数。然后,程序会陷入死循环,导致QMessageBox不断弹窗和'modifying..'打印语句,最终导致程序崩溃。

我尝试将self.win.processEvents() 放在不同的位置,但没有帮助。

from PyQt5 import QtWidgets


class Test:
    def __init__(self):
        self.app = QtWidgets.QApplication([])
        self.win = QtWidgets.QMainWindow()
        self.le_dwell_filter = QtWidgets.QLineEdit()
        self.le_dwell_filter.editingFinished.connect(self.modify)
        self.win.setCentralWidget(self.le_dwell_filter)
        self.win.show()

    def modify(self):
        print('Modifying...')
        msgbox = QtWidgets.QMessageBox()
        msgbox.setText('modification done!')
        msgbox.show()

    def start(self):
        self.app.exec()


if __name__ == '__main__':
    my_test = Test()
    my_test.start()

我原以为这会打印一个“正在修改...”,但不知何故 QMessageBox 不断弹出并且打印不断发生..我认为这与 PyQt 事件循环有关?

【问题讨论】:

  • 您正在创建 msgbox,正在显示它,但它没有添加到任何窗口/父窗口小部件中。
  • @matiit 也解决了这个问题!但为什么呢?

标签: python pyqt5 infinite-loop qlineedit qmessagebox


【解决方案1】:

你想要一个QMessageBox,为什么要在修改方法中创建一个新的QMessageBox?,你要做的就是重用:

class Test:
    def __init__(self):
        self.app = QtWidgets.QApplication([])
        self.win = QtWidgets.QMainWindow()
        self.le_dwell_filter = QtWidgets.QLineEdit()
        self.le_dwell_filter.editingFinished.connect(self.modify)
        self.win.setCentralWidget(self.le_dwell_filter)
        self.win.show()
        self.msgbox = QtWidgets.QMessageBox()

    def modify(self):
        print('Modifying...')
        self.msgbox.setText('modification done!')
        self.msgbox.show()

    def start(self):
        self.app.exec()

【讨论】:

  • 啊。谢谢!这就说得通了。虽然我想知道为什么原来的情况是无限循环?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多