Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 21, 2012 18:17:10

Levelup
От:
Зарегистрирован: 2011-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython, Logo.

Здравствуйте!

Есть два класса: первый - фрэйм, основное окно программы, второй - фрейм, панель с текстом и логотипом. Необходимо сделать чтобы во время загрузки основновного окна появлялся логотип, а после исчезал. Подскажите, пожалуйста, как лучше это реализовать? Обязательно ли в данном случае применять многопоточность или создавать несколько процессов? Потому как у меня возникают проблемы с 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)

Офлайн

#2 Фев. 21, 2012 19:04:11

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

wxPython, Logo.

Хех решал такой вопрос недавно. Не мало времени убил. Я применял многопоточность, а иначе будет зависание программы. Хотя не знаю что у вас за логотип, но я гивку использовал (типа сигнализирующая, ждите идет загрузка).

Если ж у вас логотип тупо картинка, то скорей всего через wx.Yield можно решить проблему (не затрагивая многопоточность).
Так же я сталкивался с проблемой что рисовать контролы можно только из основного потока. Т.е. если ты использовать будешь многопоточность то ты должен из второстепенного потока вызвать пользовательское событие (которое будет обрабатываться из основного)

Читать про Yield PostEvent. Так же взгляни на эту тему http://python.su/forum/viewtopic.php?id=13502

Чет не просмотрел даже код сначала MainLoop вроде как бесконечный цикл, и не будет выполняться
app = wx.App(False)
пока не будет закрыт первый фрэим

Отредактировано (Фев. 21, 2012 19:13:57)

Офлайн

#3 Фев. 21, 2012 22:07:01

Levelup
От:
Зарегистрирован: 2011-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython, Logo.

Piton23
Чет не просмотрел даже код сначала MainLoop вроде как бесконечный цикл, и не будет выполняться
app = wx.App(False)
пока не будет закрыт первый фрэим
Да, все верно - не будет. Это я так, для полноты представления вставил данный кусок кода :)

Спасибо за информацию! Буду разбираться.



Офлайн

#4 Фев. 22, 2012 00:57:52

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wxPython, Logo.

В демонстрашке wxpython есть пример: AdvancedSplash.py



Офлайн

#5 Фев. 22, 2012 07:54:25

Levelup
От:
Зарегистрирован: 2011-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython, Logo.

pyuser
В демонстрашке wxpython есть пример: AdvancedSplash.py
Есть, но все равно придется использовать многопоточность.



Офлайн

#6 Фев. 24, 2012 12:06:52

Levelup
От:
Зарегистрирован: 2011-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython, Logo.

Сделал с помощью мультипроцессинга. Может кому понадобится:

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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version