2015-02-20 3 views
1

У меня есть кнопка, которая импортирует модуль с классом. Класс (varClass) создает окно.Как проверить, существует ли экземпляр, если переменная не существует?

Если я нажимаю кнопку еще раз, я стараюсь это:

if var: 
    var.toggleUI() 
else : 
    var = varClass() 

Но вар Безразлично»существует в первый раз, вы создаете окно после открытия Maya. Как я могу заставить это работать?

+2

Вы имеете в виду вы получаете 'NameError' e xception? –

ответ

4

Вы могли поймать NameError исключение:

try: 
    var.toggleUI() 
except NameError: 
    var = varClass() 

Если вам необходимо позвонить toggleUI в первый раз, тоже, просто попробовать сам имя:

try: 
    var 
except NameError: 
    var = varClass() 

var.toggleUI() 

Я не знаком с Maja, но если вы сначала определите имя в другом месте и просто установите его на None, тогда ваш код будет работать, если не лучше.

+0

Установка на None, как сказал ранее MrGumble, не сработает.Он должен выполняться вне моей кнопки в файле инициализации. Это было бы полезно для почти 40 инструментов, над которыми я работаю. Спасибо! – darkgaze

+0

Да, я имел в виду, чтобы вы установили его «Нет» вне обработчика. :-) –

4

использование Исключения:

try: 
    var.toggleUI() 
except NameError: 
    var = varClass() 
    var.toggleUI() 
-3

По умолчанию ваш var, и использовать его в качестве теста:

var = None 
if var is None: 
    var = varClass() 
var.toggleUI() 
+1

Я думаю, что ваш ответ бесполезен. Я не могу сделать var = None, я выполняю скрипт внутри кнопки. Если я это сделаю, переменная всегда будет установлена ​​на None. – darkgaze

+0

Задайте '' var = None'' в скрипте, содержащем кнопку, а не в пределах этой кнопки. Таким образом, экземпляр '' varClass'' хранится во всей области вызывающего скрипта. – MrGumble

0

Если вы делаете это внутри кнопки, вы должны разгрузить управление var к модулю, который вы импортируете. Пусть модуль обрабатывает экземпляр, а кнопка позволяет модулю выполнять тяжелый подъем. Неправильный импорт не повреждает, пока импорт не имеет побочных эффектов (чего не должно быть, если вы делаете это правильно).

Модуль делает что-то вроде этого:

class SampleGui(object): 
    # all sorts of good stuff here 

_sample_gui_instance = None 
def get_instance(): 
    _sample_gui_instance = sample_gui_instance or SampleGui() 
    return _sample_gui_instance 

и кнопка просто делает

import SampleGuiModule 
SampleGuiModule.get_instance().toggleUI() 

Это та же проверка, как те, в чей-нибудь ответ, но я думаю, делегируя управление экземпляра к модулю, а не к кнопке, вы можете выполнить любой уровень сложности или инициализации и поделиться ею между кнопками, горячими клавишами или другими сценариями прозрачно.

Я сохранил несколько символов, используя or вместо if... is None; это будет сложно по какой-то причине SampleGui тесты истинности как ложные. Но это сделает только это, если вы сделаете это за собой.

возможно полезно: maya callbacks cheat sheet

0

Вы можете использовать функцию реж

a=5 
'a' in dir() 
'b' in dir() 

Это напечатает

True 
False 

Так что в вашем случае

if 'var' in dir(): 
    var.toggleUI() 
else : 
    var = varClass() 
Смежные вопросы