Как не допустить застревания PyQt Line Edit и Message Box в бесконечном цикле? - PullRequest
0 голосов
/ 12 февраля 2019

В приведенном ниже коде после любого вида редактирования или завершения в окне редактирования строки будет вызвана функция изменения.Затем программа застрянет в бесконечном цикле, в результате чего появятся непрерывные всплывающие окна 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()

Я бы подумал, что это напечатает один «Modifying ...», но каким-то образом QMessageBox продолжает появляться, и печать продолжает происходить ..Я думаю, что это связано с циклом PyQt Event?

1 Ответ

0 голосов
/ 12 февраля 2019

Вы хотите иметь один 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()
...