PyQt QTreeWidget.clear() вызывает сбой

У меня установлены python 2.5 и PyQt 4.8.6. ОС - Windows XP Sp2. Я использую следующий код для заполнения TreeWidget:

def updateTreeWidget(self, widget, results):
        """ Updates the widget with given results """
        widget.clear()
        for item in results:
            temp = QtGui.QTreeWidgetItem()
            j = 0
            for elem in item: 
                temp.setText(j , str(elem))
                j += 1
            widget.addTopLevelItem(temp)       
        for column in range(widget.columnCount()):
            widget.resizeColumnToContents(column)

Это вызывает сбои при втором использовании. Если я закомментирую одну из следующих строк:

widget.addTopLevelItem(temp) 

or

widget.clear() 

работает без проблем.

Я вызываю функцию в потоке каждые 60 секунд. Вот определение класса MyThread.

class MyThread(threading.Thread):
    def __init__(self, db, widget, function, script, parameter):
        threading.Thread.__init__(self)
        self.db = db
        self.function = function
        self.script = script
        self.parameter = parameter
        self.widget = widget
        self.event = threading.Event()

    def run(self):            
        while 1:
            self.event.wait(60)
            parameter = [getCurrentTimeStr()] + self.parameter
            res = self.db.getQuery(self.script % tuple(parameter))
            self.function(self.widget, res) 

Этот поток запускается, когда в главном окне init():

class MainWnd(QtGui.QMainWindow):
    def __init__(self, parent = None):

        # some code

        self.db = DbAccess()

        QtGui.QWidget.__init__(self, parent)

        self.ui = Ui_mainWnd()
        self.ui.setupUi(self)

        self.thread = MyThread(self.db, self.ui.treeWidget, self.updateTreeWidget, self.script, self.param)
        self.thread.start()

Виджет был создан с помощью Qt Designer.


person oldPadavan    schedule 21.12.2011    source источник
comment
Не могли бы вы показать часть кода, где вы создаете QTreeWidget и где вы вызываете эту функцию?   -  person alexisdm    schedule 21.12.2011
comment
Вместо того, чтобы считать j самостоятельно, рассмотрите более питоническое решение for j, elem in enumerate(item):.   -  person Ferdinand Beyer    schedule 21.12.2011


Ответы (1)


Обновление элементов GUI из потока, который не совпадает с циклом обработки событий Qt, является большим запретом.

Обычный способ решить эту проблему - использовать соединение с сигналом/слотом в очереди или однократный QTimer для прохождения границ потока и выполнения вашей функции в основном потоке.

person Chris    schedule 21.12.2011