Как обновить listctrl одновременно при использовании функции setstringitem

Я так обеспокоен этой проблемой:

Я создал ListCtrl объект, TextCtrl объект и кнопка. Сначала я заполняю некоторые данные в ListCtrl объект, когда я нажимаю кнопку, он добавит несколько строк в TextCtrl объект и использование SetStringItem модифицировать ListCtrl объект.

Как вы можете видеть в функции кнопки, я добавил time.sleep(2) в каждом цикле. Когда у меня есть, когда кнопка нажата, TextCtrl будет обновляться каждый раз, когда вставляются строки, но ListCtrl просто заморозьте, пока цикл не закончится, тогда он покажет правильные строки.

Я хочу знать, как обновить ListCtrl возражать, как только SetStringItem называется.

Любая помощь высоко ценится.

Вот код:

import wx                                                                                                       
import sys                                                                                      
import time                                                                                     

class Frame(wx.Frame):                                                                          
    def __init__(self, parent):                                                                 
        wx.Frame.__init__(self, parent, size=(450, 450))                                        
        self.panel = wx.Panel(self)                                                             
        self.dl = wx.ListCtrl(self,-1,size=(300,100),style=wx.LC_REPORT)                        

        self.dl.InsertColumn(0, 'File')                                                         
        self.dl.InsertColumn(1, 'Progress')                                                     
        self.dl.InsertColumn(2, 'State')                                                        

        for row in range(3):                                                                    
            labels = [l+str(row) for l in "FILE PERCENT STATE".split()]                         
            # sys.maxint inserts at the end of the list                                         
            index = self.dl.InsertStringItem(sys.maxint, labels[0])                             
            self.dl.SetStringItem(index, 1, labels[1])                                          
            self.dl.SetStringItem(index, 2, labels[2])                                          

        self.Show(True)                                                                         

        button2 = wx.Button(self, label=u"test", pos=(15, 200), size=(60, 25))                  
        self.Bind(wx.EVT_BUTTON, self.test, button2)                                            
        self.text = wx.TextCtrl(self, -1, pos=(80, 200), size=(200, 175), style=wx.TE_MULTILINE)
    def test(self,event):                                                                       
        for i in range(3):                                                                                                                                          
            self.dl.SetStringItem(i,1,"HELLO")                                                                                                            
            self.text.AppendText("HELLO")                                                       
            time.sleep(2)                                                                       

app = wx.App()                                                                                  
Frame(None)                                                                                     
app.MainLoop()                                                                                                                                        

2 ответа

Решение

Проблема в том, что time.sleep блокирует ваш GUI, что вам нужно сделать, чтобы получить желаемый эффект:

Нажмите кнопку, добавьте первый элемент и запустите 2-секундный wx.Timer с обработчиком событий /.

В обработчике событий добавьте следующую строку или, если больше не осталось, отмените таймер.

Я изменил свой код на это, и это работает, спасибо Стив

import wx
import sys
import time


class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, size=(450, 450))
        self.panel = wx.Panel(self)
        self.dl = wx.ListCtrl(self,-1,size=(300,100),style=wx.LC_REPORT)

        self.dl.InsertColumn(0, 'File')
        self.dl.InsertColumn(1, 'Progress')
        self.dl.InsertColumn(2, 'State')

        for row in range(3):
            labels = [l+str(row) for l in "FILE PERCENT STATE".split()]
            # sys.maxint inserts at the end of the list
            index = self.dl.InsertStringItem(sys.maxint, labels[0])
            self.dl.SetStringItem(index, 1, labels[1])
            self.dl.SetStringItem(index, 2, labels[2])

        self.Show(True)

        self.timer = wx.Timer(self,-1)
        #self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.Bind(wx.EVT_TIMER, self.test1, self.timer)
        button2 = wx.Button(self, label=u"test", pos=(15, 200), size=(60, 25))
        self.Bind(wx.EVT_BUTTON, self.test, button2)
        self.text = wx.TextCtrl(self, -1, pos=(80, 200), size=(200, 175), style=wx.TE_MULTILINE)
        self.z=0



    def test(self,event):
        self.timer.Start(3000)

    def test1(self,event):
        for i in range(1):
            self.dl.SetStringItem(self.z,1,"HELLO")
            self.text.AppendText("HELLO")
            self.z+=1           
            if self.z >2 :
               self.timer.Stop()  


app = wx.App()
Frame(None)
app.MainLoop()
Другие вопросы по тегам