Форум сайта python.su
Здравствуйте!
Есть два класса: первый - фрэйм, основное окно программы, второй - фрейм, панель с текстом и логотипом. Необходимо сделать чтобы во время загрузки основновного окна появлялся логотип, а после исчезал. Подскажите, пожалуйста, как лучше это реализовать? Обязательно ли в данном случае применять многопоточность или создавать несколько процессов? Потому как у меня возникают проблемы с mainloop'ами.
if __name__ == ‘__main__’:
logoapp = wx.App(False)
logo = LogoFrame()
logo.Show(True)
logoapp.MainLoop()
app = wx.App(False)
frame = AuiFrame()
frame.Show(True)
logo.Close()
frame.OpenFiles()
app.MainLoop()
Отредактировано (Фев. 22, 2012 09:08:58)
Офлайн
Хех решал такой вопрос недавно. Не мало времени убил. Я применял многопоточность, а иначе будет зависание программы. Хотя не знаю что у вас за логотип, но я гивку использовал (типа сигнализирующая, ждите идет загрузка).
Если ж у вас логотип тупо картинка, то скорей всего через wx.Yield можно решить проблему (не затрагивая многопоточность).
Так же я сталкивался с проблемой что рисовать контролы можно только из основного потока. Т.е. если ты использовать будешь многопоточность то ты должен из второстепенного потока вызвать пользовательское событие (которое будет обрабатываться из основного)
Читать про Yield PostEvent. Так же взгляни на эту тему http://python.su/forum/viewtopic.php?id=13502
Чет не просмотрел даже код сначала MainLoop вроде как бесконечный цикл, и не будет выполняться
app = wx.App(False)
пока не будет закрыт первый фрэим
Отредактировано (Фев. 21, 2012 19:13:57)
Офлайн
Piton23Да, все верно - не будет. Это я так, для полноты представления вставил данный кусок кода :)
Чет не просмотрел даже код сначала MainLoop вроде как бесконечный цикл, и не будет выполняться
app = wx.App(False)
пока не будет закрыт первый фрэим
Офлайн
В демонстрашке wxpython есть пример: AdvancedSplash.py
Офлайн
pyuserЕсть, но все равно придется использовать многопоточность.
В демонстрашке wxpython есть пример: AdvancedSplash.py
Офлайн
Сделал с помощью мультипроцессинга. Может кому понадобится:
class MainFrame(wx.Frame)
bla bla bla
class LogoFrame(wx.Frame):
def __init__(self, parent = None):
wx.Frame.__init__(self, parent, -1, “Logo Frame”,
style =
wx.FRAME_SHAPED
| wx.SIMPLE_BORDER
| wx.FRAME_NO_TASKBAR
| wx.STAY_ON_TOP
)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.bmp = wx.Image(os.path.expanduser('~/.Apex/logo.png')).ConvertToBitmap()
w, h = self.bmp.GetWidth(), self.bmp.GetHeight()
self.SetClientSize( (w, h) )
self.Center()
def OnPaint(self, evt):
dc = wx.PaintDC(self)
wx.StaticBitmap(self, -1, self.bmp, (1, 1), (self.bmp.GetWidth(), self.bmp.GetHeight()))
def showLogo():
lapp = wx.App(False)
logo = LogoFrame()
logo.Show(True)
lapp.MainLoop()
if __name__ == ‘__main__’:
p = multiprocessing.Process(target = showLogo)
p.start()
app = wx.App(False)
frame = MainFrame()
frame.Show(True)
p.terminate()
app.MainLoop()
Офлайн