2013-08-22 57 views
0

我好這個問題困擾時,同時刷新的listctrl:如何使用setstringitem功能

我已經創建一個ListCtrl對象,TextCtrl對象,和一個按鈕。首先我將一些數據填入ListCtrl對象中,當我按下按鈕時,它會將一些字符串追加到TextCtrl對象中,並用SetStringItem來修改ListCtrl對象。

正如你可以在按鈕功能看,我在每一個循環加time.sleep(2)。當我按下按鈕時,每次插入字符串時都會刷新TextCtrl,但ListCtrl只會凍結,直到LOOP IS FINISHED,然後它會顯示正確的字符串。

我想知道如何在調用SetStringItem時立即刷新ListCtrl對象。

任何幫助深表謝意。

下面是代碼:

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()                                   

回答

1

的問題是,time.sleep塊的GUI,你需要做的就是,你正在嘗試的效果:

在您按下按鈕添加第一項&開始2秒wx.Timer與事件處理程序/

在事件處理程序中添加下一個字符串或者如果沒有更多的添加取消定時器。

1

我已經改變了我的代碼,這一點,和它的作品,感謝史蒂夫

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()