2012-05-30 3 views
0

Я откинул свою проблему до примера кода, показанного в этом сообщении. Обратите внимание, что я не вызываю app.MainLoop(), потому что это не интерактивное окно; Я хочу, чтобы он всплывал в начале, показывал некоторые индикаторы выполнения, когда происходит работа, и исчезает, когда завершается.wxPython - Как заставить UI обновить?

Мое (ограниченное) понимание wxPython и wx.Yield() привело меня к мысли, что вызов wx.Yield() после того, как некоторые работы пользовательского интерфейса сбросят эти изменения на дисплей. Это не происходит - когда я запускаю этот скрипт, есть серый ящик, где должен быть «Hello World».

Что я делаю неправильно?

import wx 

class MyFrame(wx.Frame): 
    def __init__(self, parent, id): 
     wx.Frame.__init__(self, parent, id, size=(400,400)) 
     self.panel = wx.Panel(self, -1) 
     wx.StaticText(self.panel, -1, "Hello World", (20,20)) 
     wx.Yield() 


class MyApp(wx.App): 
    def OnInit(self): 
     self.frame = MyFrame(None, -1) 
     self.frame.Show(True) 
     self.SetTopWindow(self.frame) 
     return True 


def run(): 
    app = MyApp(redirect=False) 
    import time; time.sleep(5) 

run() 

ответ

0

вместо wx.Yield()

просто позвоните self.Update()

+0

Я просто попробовал это; получил тот же результат, что и выше. – Doug

+1

Хммм угадайте свое право ... Я не знаю, что вам, возможно, придется добавить MainLoop, и вы можете просто показать модально, а затем закрыть или что-нибудь убить wx.App ... не уверен, действительно –

2

Вы должны быть податливость или обновление на регулярной основе, так что, когда ваш менеджер OS/окно посылает перерисовывает сообщения в ваше приложение, оно может справиться с ними. Я не уверен на 100% о wxPython, поскольку я не использовал его в последнее время, но я не думаю, что вы можете делать то, что хотите, без основного цикла, чтобы обрабатывать сообщения соответствующим образом.

Вы могли бы найти что-нибудь полезное о заправке основного цикла, однако (как и объяснения того, почему главный цикл важен): http://wiki.wxpython.org/MainLoopAsThread

0

Без MainLoop нет событий будет уволен, а также .Refresh не будет работать ,

Возможно, wxSplashscreen может быть тем, что вы ищете. Пример: http://wiki.wxpython.org/SplashScreen

0

Не то, чтобы после всего этого времени был сделан оригинальный плакат, но wx.Yield() выполнил бы эту работу. Он просто должен быть в нужном месте, как и self.Show()
Следующие выходы показывают индикатор выполнения, который обновляется.

import wx 
import time 
class MyFrame(wx.Frame): 
    def __init__(self, parent, id): 
     wx.Frame.__init__(self, parent, id, size=(290,200)) 
     self.panel = wx.Panel(self, -1) 
     wx.StaticText(self.panel, -1, "Hello World", (20,20)) 
     self.gauge = wx.Gauge(self.panel, -1, 50, pos=(20,50), size=(250, 20)) 
     self.Show() 
     n = 0 
     while n < 50: 
      n = n+1 
      self.gauge.SetValue(n) 
      wx.Yield() 
      time.sleep(1) 

class MyApp(wx.App): 
    def OnInit(self): 
     self.frame = MyFrame(None, -1) 
     self.SetTopWindow(self.frame) 
     return True 

def run(): 
    app = MyApp() 

run() 
Смежные вопросы