PyQT table 更新容易崩溃

PyQT table update crash easyly

我第一次使用PyQT4。

我正在创建一个 QTableWidget 来显示 运行ing 消息...

当我的程序 运行 时,它会在十分钟内崩溃。

我尝试禁用我的 TableUpdate 功能,它不会再崩溃了。

有我的代码请帮帮我

class table_work(QThread):
    TableDataSignal = pyqtSignal()
    def __init__(self,main_self):
        # QThread.__init__(self)
        super(table_work, self).__init__(main_self)
        self.main_self = main_self
        self.table_update_list = list()

    @pyqtSlot(dict)
    def update_table_thread_o(self,work):

        try:
            row_pos = work['row_position']
            data = work['data']
            table_key_sort = work['key_sort']
            this_table = work['table']
            k = 0
            for table_key in table_key_sort:
                this_table.setItem(row_pos, k, QTableWidgetItem(unicode(data[table_key])))
                k += 1
            del work

        except:
           pass

    def update_table_thread(self):
        main_self = self.main_self

        table_work_list = self.table_update_list
        while 1:

            for work in self.table_update_list:
                row_pos = work['row_position']
                data = work['data']
                table_key_sort = work['key_sort']
                this_table = work['table']
                k = 0
                for table_key in table_key_sort:
                    this_table.setItem(row_pos, k, QTableWidgetItem(unicode(data[table_key])))
                    k += 1

            time.sleep(0.5)

    def run(self):
        self.update_table_thread()

这是更新 table 消息

 def update_table(self,address,change_obj=None,tabe_name='auto_card'):

        sample_dict = dict()
        table_key_sort = list()
        now_table_sort = 0

        if tabe_name == "auto_bot":
            this_table = self.auto_bot_procc_table
            table_data_list = self.auto_bot_procc_table_list
            now_table_sort = self.auto_bot_now_table_sort
            sample_dict['address'] = address
            sample_dict['money'] = 0
            sample_dict['run_time'] = 0
            sample_dict['item_cd'] = u"60分鐘後"
            sample_dict['stat'] = "Ready..."
            sample_dict['sort'] = now_table_sort

            table_key_sort.append('address')
            table_key_sort.append('money')
            table_key_sort.append('run_time')
            table_key_sort.append('item_cd')
            table_key_sort.append('stat')

        if tabe_name == "auto_card":
            this_table = self.process_table
            table_data_list =  self.now_procc_table_list
            now_table_sort = self.now_table_sort

            sample_dict['address'] = address
            sample_dict['done_num'] = 0
            sample_dict['pre_item'] = ""
            sample_dict['procc'] = "Ready"
            sample_dict['mission_procc'] = u"待命.."
            sample_dict['mission_num'] = 0
            sample_dict['mission_line'] = 0
            sample_dict['update_time'] = db.get_time()
            sample_dict['sort'] = now_table_sort
            sample_dict['option'] = ""


            table_key_sort.append('address')
            table_key_sort.append('done_num')
            table_key_sort.append('pre_item')
            table_key_sort.append('mission_procc')
            table_key_sort.append('procc')
            table_key_sort.append('mission_num')
            table_key_sort.append('mission_line')
            table_key_sort.append('update_time')

        if address not in table_data_list:
            this_table.insertRow(sample_dict['sort'])
            table_data_list[address] = sample_dict
            sample_dict['sort'] = self.auto_bot_now_table_sort
            self.auto_bot_now_table_sort += 1


        acc_data = table_data_list[address]
        if change_obj != None:
            key = change_obj['key']
            val = change_obj['val']
            if key in acc_data:
                acc_data[key] = val
                acc_data['update_time'] = db.get_time()

        rowPosition = acc_data['sort']


        temp = dict()
        temp['row_position'] = rowPosition
        temp['data'] = acc_data
        temp['key_sort'] = table_key_sort
        temp['table'] = this_table

        self.TableDataSignal.emit(temp) 
        del temp

有时我会得到一个 ANS。

本人是PYQT新手,经过这段时间的各种项目经验

我理解如果您不使用主线程来更改 UI,请始终使用 sign/emit

即使你的代码可以运行,但始终使用sign/emit,否则会发生一系列灾难。

你就是喜欢

class sample(QtCore.QThread):
     table_data_change = QtCore.pyqtSignal(dict)
     def __init__(self,main_win):
        self.main = main_win
        self.table_data_change.connect(self.main.change_fn)           
     def test(self):
        data = dict()
        data['btn'] = .....
        data['val'] = .....        
        self.table_data_change.emit(data)   

节省您的时间!