Цель wx.App, когда достаточно просто показать кадр, достаточно

1

Какая польза от класса wx.App (кроме того, что говорит документация), когда вы можете просто создать фрейм и .Show(True)?

Когда должен использоваться класс wx.App или почему вы не должны создавать фрейм и просто показывать его?

Теги:
wxwidgets
wxpython

3 ответа

3
Лучший ответ

Вы должны создать wx.App. Если вы попытаетесь создать экземпляр классов wxPython перед созданием приложения, он не сработает:

>>> import wx
>>> frame = wx.Frame(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 505, in __init__
    _windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
wx._core.PyNoAppError: The wx.App object must be created first!

Всегда будет один, и только один, wx.App. Инициализация его инициализирует wxPython - создает оконный поток и т.д.

  • 0
    ах ... похоже, что среда, которую я использовал, уже создала класс wx.App, отсюда и странное поведение, когда я пытался создать его сам, и то, как он будет работать лучше без его создания. Не забудьте сначала протестировать на чистом питоне! Спасибо!
2

Wx.App делает кучу за кулисами, чтобы заставить ваше приложение работать. Он выполняет основной цикл, который ждет пользователя, чтобы что-то сделать, а затем отвечает. Вы должны это иметь. Как упоминал FogleBird. Кстати, у вас НЕ должно быть больше одного. Это приведет к возникновению странных проблем, если они вообще будут работать.

  • 0
    Похоже, это сработало для создания более одного, я просто не знал, что один уже был создан. Но это, безусловно, заставляет происходить странные вещи! В том числе не перехватывает EVT_CLOSE и потоки не завершаются должным образом ...
  • 0
    О, вы можете создать более одного, но ваше приложение точно не будет работать правильно. Наверное, я плохо сформулировал это. Прости за это.
0

Подклассификация wx.App является допустимой причиной, когда вам нужно сделать некоторые дополнительные функции в своем приложении. Это относится к инициированию подключения к базе данных или подключению по сети, загрузке некоторых внешних данных/файлов перед запуском основного.

class MyApp(wx.App):
    def OnInit(self):
        # Do some work here
        return True
    def __init__(self):
        main_frame = MyFrame(*args, **kwargs)
        main_frame.Show()
    def OnExit(self):
        # Clean up and close the resources from the OnInit() method

Ещё вопросы

Сообщество Overcoder
Наверх
Меню