2009-05-17 2 views
0

Прошу прощения за словесное описание.wxPython запускает мое приложение дважды при импорте подпакета

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

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

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

ответ

4

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

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

Справедливая догадка Фрэнк, но нет; У меня есть бит 'if __name __ == '__ main __'', который вызывает мою функцию 'main()'. Фактически, эта ошибка происходит, даже если я прокомментирую эти две строки и вызывается 'main()' из 'rundemo.py'. –

+0

@ cool-RR: У вас может быть if __name__ == "__main__", но у вас также есть вызов функции, который происходит во время импорта. Вы должны пройти через свой сценарий и заверить, что это ПОЛНОСТЬЮ def и класс, и ничего больше. –

+0

@Frank: Извините, но не работает ли Python модуль только в первый раз, когда он импортируется? – Joril

0

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

Я надеюсь, что это поможет вам найти его. Я извиняюсь за словесным решение;)

+0

Не помогло - оказалось, что это отдельный процесс. –

+0

Но недостаток stacktrace дал вам ответ, не так ли? В обоих случаях это было выполнено, g_window_was_drawn было ложным, поэтому это были отдельные процессы. –

+0

На самом деле да, это действительно привело меня к такому ответу. Так что спасибо. –

0

Понял: Там не было

if __name__=='__main__': 

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

Смежные вопросы