2013-08-22 3 views
0

사용할 때 동시에 listctrl 새로 고침 방법 :내가 지금이 문제로 고민하고 있습니다 setstringitem 기능

을 나는 ListCtrl 오브젝트하는 TextCtrl 객체 및 버튼을 만들했습니다. 먼저 ListCtrl 객체에 데이터를 입력합니다. 버튼을 누르면 TextCtrl 객체에 문자열이 추가되고 ListCtrl 객체를 수정하려면 SetStringItem 객체를 사용합니다.

버튼 기능에서 알 수 있듯이 각 루프에 time.sleep(2)을 추가했습니다. 단추를 눌렀을 때 문자열이 삽입 될 때마다 TextCtrl이 새로 고쳐 지지만 ListCtrl은 LOOP가 끝날 때까지 고정 된 다음 올바른 문자열을 표시합니다.

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