2024-06-08 01:08:54 发布
网友
我试图使用wx.Gauge实现一个简单的进度条。在开始我的原始代码之前,我想编写如下小脚本:
wx.Gauge
import time for i in range(101): print i time.sleep(0.5)
上面的脚本只是延迟for循环。现在程序的相同概念是挂起我的Ubuntu12.04LTS,最后显示完整的进度条。代码如下:
我相信程序在语法上是正确的。我认为逻辑也是正确的。我的代码有什么问题?在
发生这种情况的原因是你的计数器的增长速度一直快于应用程序主循环()可以重新绘制进度条。因此,如果您在按下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()
您可能还需要阅读这个article。在
发生这种情况的原因是你的计数器的增长速度一直快于应用程序主循环()可以重新绘制进度条。因此,如果您在按下start之后尝试与小部件交互,它将挂起,直到循环结束并显示最终状态。您需要使用线程来在GUI编程中执行这些任务。我改变了你的密码。现在应该可以用了。在
您可能还需要阅读这个article。在
相关问题 更多 >
编程相关推荐