wxPython进度条崩溃,无法按预期工作

wxPython进度条崩溃,无法按预期工作,python,wxpython,Python,Wxpython,我正在尝试使用wx.Gauge实现一个简单的进度条。在转到我的原始代码之前,我想编写如下小脚本: import time for i in range(101): print i time.sleep(0.5) 上面的脚本只是延迟for循环。现在,该程序的相同概念挂起了我的Ubuntu 12.04LTS,并最终显示了完整的进度条。代码如下: # -*- coding: utf-8 -*- import wx import time class MainFrame ( wx.

我正在尝试使用
wx.Gauge
实现一个简单的进度条。在转到我的原始代码之前,我想编写如下小脚本:

import time
for i in range(101):
    print i
    time.sleep(0.5)
上面的脚本只是延迟for循环。现在,该程序的相同概念挂起了我的Ubuntu 12.04LTS,并最终显示了完整的进度条。代码如下:

# -*- coding: utf-8 -*- 
import wx
import time

class MainFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Progress Bar Example", pos = wx.DefaultPosition, size = wx.Size( 460,135 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer2 = wx.BoxSizer( wx.VERTICAL )

        self.progress = wx.Gauge( self, wx.ID_ANY, 100, wx.Point( 10,10 ), wx.Size( 400,-1 ), wx.GA_HORIZONTAL|wx.GA_SMOOTH )
        self.progress.SetValue( 0 ) 
        self.progress.SetForegroundColour( wx.Colour( 255, 255, 255 ) )

        bSizer2.Add( self.progress, 0, wx.ALL, 5 )

        self.start_again = wx.Button( self, wx.ID_ANY, u"START", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.start_again, 0, wx.ALL, 5 )


        self.SetSizer( bSizer2 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.start_again.Bind( wx.EVT_BUTTON, self.run_progreee_bar )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def run_progreee_bar( self, event ):
        self.progress.SetValue( 0 )
        for i in range(101):
            self.progress.SetValue( i )
            self.delay()
    def delay(self):
        time.sleep(0.5)

app  = wx.App()
frame = MainFrame(None)
frame.Show()
app.MainLoop()

我相信这个程序在语法上是正确的。我认为逻辑也是正确的。我在这段代码中遇到的问题是什么?

发生这种情况的原因是您的计数器的增长速度一直快于app.MainLoop()重新绘制进度条的速度。因此,如果您在按start之后尝试与小部件交互,它将挂起,直到循环结束并显示最终状态。在GUI编程中,您需要使用线程来执行这些任务。我把你的代码改了一点。现在应该可以用了

import wx, time, thread

class MainFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Progress Bar Example", pos = wx.DefaultPosition, size = wx.Size( 460,135 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer2 = wx.BoxSizer( wx.VERTICAL )

        self.progress = wx.Gauge( self, wx.ID_ANY, 100, wx.Point( 10,10 ), wx.Size( 400,-1 ), wx.GA_HORIZONTAL|wx.GA_SMOOTH )
        self.progress.SetValue( 0 ) 
        self.progress.SetForegroundColour( wx.Colour( 255, 255, 255 ) )

        bSizer2.Add( self.progress, 0, wx.ALL, 5 )

        self.start_again = wx.Button( self, wx.ID_ANY, u"START", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.start_again, 0, wx.ALL, 5 )


        self.SetSizer( bSizer2 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.start_again.Bind( wx.EVT_BUTTON, self.run_progreee_bar)

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def run_progreee_bar( self, event ):
        thread.start_new_thread(self.update_progress_bar, ())

    def update_progress_bar(self):
        self.start_again.Disable()
        self.progress.SetValue( 0 )
        for i in range(101):
            self.progress.SetValue( i )
            self.delay()
        self.start_again.Enable()

    def delay(self):
        time.sleep(0.5)

app  = wx.App()
frame = MainFrame(None)
frame.Show()
app.MainLoop()

您可能还想读一下这个。

可能有用,谢谢我没有想到使用线程。我现在可以看到我的计数器一直在增加。谢谢你的澄清。很乐意帮忙!只是提醒一下。请注意按钮。禁用和启用方法调用。这是很有用的,因为在短时间内单击按钮将同时启动多个线程,这将弄乱条。