Как предотвратить застревание PyQt Line Edit и Message Box в бесконечном цикле?

В приведенном ниже коде после любого редактирования или завершения в поле редактирования строки будет вызываться функция модификации. Затем программа застрянет в бесконечном цикле, что приведет к непрерывным всплывающим окнам QMessageBox и операторам печати «модификация..», за которыми последует возможный сбой программы.

Пробовал ставить 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?


person Ethan    schedule 12.02.2019    source источник
comment
вы создаете msgbox, вы его показываете, но он не добавляется ни в один оконный/родительский виджет.   -  person matiit    schedule 12.02.2019
comment
@matiit, который также решил проблему! Но почему?   -  person Ethan    schedule 12.02.2019


Ответы (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()
person eyllanesc    schedule 12.02.2019
comment
Ах. Спасибо! Это имеет смысл. Хотя мне интересно, почему бесконечный цикл в исходном случае? - person Ethan; 12.02.2019