2015-06-24 3 views
1

Я запускаю приложение wxPython, которое импортирует множество модулей и пакетов в начале и собирает информацию о компьютере (сетевые интерфейсы, подключение к Интернету ..), поэтому требуется время, m показывая логотип в это время до его окончания. проблема заключается в том, что логотип выйдет из строя, если вы нажмете на него (потому что импорт находится на MainThread, и графический интерфейс не может отвечать на события). Как я могу показать логотип при импорте, не допуская краха GUI? (Я не хочу, чтобы пользователь мог нажать на логотип в любом случае)wxPython - отображение логотипа при импорте

ответ

0

Вдохновленный Тим Робертс в этой wxPython-users thread я первый попытался закрутить заставку в отдельном потоке, который не работает (WxWidgets жалуется на это не в основном потоке). Поэтому я сделал единственную очевидную вещь, которую я должен был сделать в первую очередь: сделать длинный запуск при запуске отдельной нитью.

Побочный эффект: поскольку всплеск теперь может реагировать на события, он будет исчезать при нажатии.

import wx 

class long_running(object): 
    def __init__(self): 
     bitmap = wx.EmptyBitmap(300, 150, 127) 

     self.mainframe = wx.Frame(None, -1, 'mainframe') 
     self.splash = wx.SplashScreen(bitmap, wx.SPLASH_TIMEOUT, 20000, self.mainframe) 


    def start(self): 
     import time 

     # mimicking something taking very long time on startup 
     for i in range(20): 
      time.sleep(0.5) 
      print i 
     wx.CallAfter(self.continue_) 

    def continue_(self): 
     #Destroy the splash screen. 
     if self.splash: 
      self.splash.Hide() 
#    self.splash.Destroy() 

     self.mainframe.Show() 


if __name__ == '__main__': 
    import thread 
    app = wx.App() 

    long_rnn = long_running() 

    # Begin loading the application. 
    thread.start_new_thread(long_rnn.start,()) 
    # Application loaded. 

    app.MainLoop() 
0

В недавнем проекте (на Windows7 и WxPython 2.9.5.1): для отображения wx.SplashScreen в то время как модули импорта мы сделали следующее:

У нас есть основной модуль, который в начале делает import wx, создайте wx.App и отобразите заставку. Только после показа заставки мы начинаем импортировать «тяжелые» модули. Самый первый запуск займет 40 секунд. На самом деле приложение выйдет из строя, если пользователь нажмет на заставку. Лучше сказать, Windows отображает окно сообщения (EDIT2) с «Python.exe перестала работать». Если пользователь нажимает кнопку «Завершить», приложение фактически завершит/сработает. Если пользователь ничего не делает, приложение запустится нормально. Так что в Windows нет «реального» сбоя. Это также не произойдет, когда вы начинаете второй раз (потому что вещи кешируются)? При последующих запусках время запуска составляет 5 секунд. Извините, никакого реального ответа, но слишком долго для комментария.

EDIT: добавлен минимальный рабочий пример: нажмите на каждую секунду или две секунды на всплеск, пока он отображается, чтобы заставить Windows показать диалог «Python перестала работать». Диалог просто исчезнет, ​​когда вернется long_running().

# -*- coding: utf-8 -*- 

def long_running(): 
    import time 
    time.sleep(10) 

    # does not show "Python ... stopped working ..." 
    #for _ in range(20): 
    # time.sleep(0.5) 
    # wx.Yield() 

if __name__ == '__main__': 
    import wx 
    app = wx.App() 

    bitmap = wx.EmptyBitmap(300, 150, 127) 

    splash = wx.SplashScreen(bitmap, wx.SPLASH_TIMEOUT, 20000, None) 

    # Begin loading the application. 
    long_running() 
    # Application loaded. 

    #Destroy the splash screen. 
    splash.Hide() 
    splash.Destroy() 

    app.MainLoop() 
+0

Я работаю с окнами 7 и Python 2.6.6 – ori

+0

Добавлен минимальный пример и частичное решение. Частично, потому что вы обычно не сможете разделить свою задачу до '' wx.Yield() '' между ними. – nepix32

+0

Сшитый с [wxPython-users] (https://groups.google.com/forum/#!topic/wxpython-users/b1-POONqceQ). – nepix32