【问题标题】:How to refresh listctrl simultaneously when using setstringitem function使用setstringitem函数时如何同时刷新listctrl
【发布时间】:2013-08-24 15:14:18
【问题描述】:

这个问题我很困扰:

我创建了一个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()                                                                                                                                        

【问题讨论】:

    标签: python wxpython wxwidgets listctrl


    【解决方案1】:

    我已经把我的代码改成了这个,它可以工作,谢谢 steve

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

    【讨论】:

      【解决方案2】:

      问题是 time.sleep 会阻塞您的 GUI,您需要做的是:

      按下按钮添加第一项并使用事件处理程序启动 2 秒 wx.Timer/

      在事件处理程序中添加下一个字符串,或者如果没有更多可以添加取消计时器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        • 2018-01-30
        相关资源
        最近更新 更多