2011-12-21 2 views
4

私はPython 2.5とPyQt 4.8.6をインストールしました。 Os - Windows Xp Sp2。私はTreeWidgetを満たすために次のコードを使用します:PyQt QTreeWidget.clear()がクラッシュする

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) 

2度目の使用でクラッシュします。それは問題なく動作します

または

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のデザイナを使用して作成されました。

+0

'QTreeWidget'を作成するコードの部分と、その関数をどこで呼び出すことができますか? – alexisdm

+0

自分で 'j'を数えるのではなく、列挙型(item):' j、elemに対してもっとpythonicな解を考えてみましょう。 –

答えて

2

Qtのイベントループと同じでないスレッドからGUI要素を更新することは大きなノーノです。

これを解決する慣習的な方法は、キューに入れられた信号/スロット接続または単一のQTimerを使用してスレッドの境界を渡し、メインスレッド上で関数を実行することです。