wxPython запускает мое приложение дважды при импорте подпакета - PullRequest
0 голосов
/ 17 мая 2009

Прошу прощения за словесное описание.

У меня есть приложение wxPython в файле с именем applicationwindow.py, которое находится в пакете с именем garlicsimwx. Когда я запускаю приложение, запуская вышеупомянутый файл, все это работает хорошо. Тем не менее, я создал файл rundemo.py в папке, содержащей пакет garlicsimwx, который также запускает приложение. Когда я использую rundemo.py, приложение запускается, однако, когда основной wx.Frame импортирует подпакет garlicsimwx, а именно simulations.life, по какой-то причине создается новый экземпляр моего приложения (т.е. выскочит одинаковое окно.)

Я пытался пошагово выполнять команды по очереди, и хотя ошибка возникает только после импорта подпакета, оператор import не вызывает ее напрямую. Только когда управление возвращается к PyApp.MainLoop, открывается второе окно.

Как мне это остановить?

Ответы [ 3 ]

4 голосов
/ 17 мая 2009

Я думаю, у вас есть код в одном из ваших модулей, который выглядит следующим образом:

import wx

class MyFrame(wx.Frame):
    def __init__(...):
       ...

frame = MyFrame(...)

Рамка будет создана при первом импорте этого модуля. Чтобы предотвратить это, используйте общий язык Python:

import wx

class MyFrame(wx.Frame):
    def __init__(...):
       ...

if __name__ == '__main__':
    frame = MyFrame(...)

Правильно ли я угадал?

0 голосов
/ 17 мая 2009

Понял: не было

if __name__=='__main__':

в моем rundemo файле. На самом деле это была проблема multiprocessing: новое окно было открыто в отдельном процессе.

0 голосов
/ 17 мая 2009

Вы можете создать глобальную логическую переменную типа g_window_was_drawn и проверить ее в функции, которая выполняет работу по созданию окна. Значение будет ложным в начале программы и изменится на True при первом создании окна. Функция, которая создает окно, проверит, если g_window_was_drawn уже истина, и если это так, она выдаст исключение. Тогда у вас будет хорошая трассировка стека, сообщающая вам, кто отвечает за выполнение этой функции.

Надеюсь, это поможет Вам найти это. Прошу прощения за устное решение;)

...