2014-12-09 3 views
0

Я пытаюсь запустить приложение wxPython, но я хочу, чтобы баннер отображался перед его запуском.wxPython: Как запустить приложение wxPython из приложения wxPython?

Один из способов сделать это - запустить приложение wxPython, которое, в свою очередь, запустит другое приложение wxPython, причина этого делается потому, что часть приложения второго приложения wxPython должна выполнить некоторую обработку перед запуском и может принять когда-то.

Проблема в том, как запустить другое приложение и узнать, что он запущен?

В настоящее время я делаю это, какие блоки для всего сеанса работы с графическим интерфейсом:

subprocess.check_output(["python", "src/gui.py"], stderr=subprocess.STDOUT, shell=True) 

Я попытался сделать следующее, но кадр первого приложения, кажется, не закрывать:

loadCompleted, EVT_LOAD_COMPLETED = wx.lib.newevent.NewEvent() 
class MyRegion(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, title="My Region") 
     self.label = wx.StaticText(self, label="Hello, World!") 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.label, 0, wx.ALL, 5) 
     self.SetSizer(sizer) 
     self.startThread = Thread(target=self.Start) 
     self.startThread.start() 
     self.Bind(EVT_LOAD_COMPLETED, self.OnClose) 

    def OnClose(self, result): 
     self.Close() 

    def Start(self): 
     try: 
      subprocess.check_output(["python", "src/gui.py"], stderr=subprocess.STDOUT, shell=True) 
     except: 
      pass 
     wx.PostEvent(self, loadCompleted(result=(None))) 

if __name__ == "__main__": 
    app = wx.App() 
    frame = MyRegion(None) 
    frame.Show() 
    app.MainLoop() 

ответ

1

Я не думаю, что начать второе приложение wxPython - это путь. Вместо этого я просто загрузил бы баннер внутри вашего фрейма __init__, а затем выполнил вашу обработку. Когда обработка закончится, вы можете уничтожить баннер и показать основное приложение. Вот некоторые псевдо-код:

#
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Test") 

     banner = MyBanner() 

     # do a bunch of stuff 

     banner.Destroy() # or banner.Close() 

     self.Show() 

Теперь, если обработка занимает очень много времени, вы можете положить, что в нить и есть нить отправить сообщение обратно в пользовательский интерфейс, который сообщает ему, что нить закончен. Когда приложение получит сообщение, оно может закрыть баннер в обработчике и показать приложение в этой точке. Обратите внимание, что вам необходимо использовать поточно-безопасный метод, например wx.CallAfter или wx.PostEvent.

Заканчивать следующие статьи для идей: