2015-10-21 1 views
0

Два вопроса здесь. Я не понимаю, как заставить мой GUI-код работать как кнопка майя, а не работать в редакторе скриптов. Моя первая проблема заключается в том, есть ли какой-либо простой способ вызвать мой код в разделе if -main--? Прямо сейчас мне приходится бросать несколько строк, которые у меня есть, в свою собственную функцию и звонить таким образом. Вот что у меня есть:QT Gui Window появляется тогда исчезает в майя

from PySide import QtCore, QtGui, QtUiTools 
import maya.cmds as cmds 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(400, 300) 

     GUI STUFF HERE 


    def retranslateUi(self, Dialog): 
     SET TEXT STUFF 

    def closeBtn_clicked(self): 
     DO SOMETHING 

    def swapRefBtn_clicked(self): 
     DO SOMETHING 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication.instance() 
    if app is None: 
     app = QtGui.QApplication(sys.argv)  
    Dialog = QtGui.QDialog() 
    ui = Ui_Dialog() 
    ui.setupUi(Dialog) 
    Dialog.show() 
    app.exec_() 

Я делаю это как кнопка полки, которые, очевидно, не будет работать (есть в любом случае, чтобы получить доступ к сниппет в случае «--main--»?):

import swapRef as swap 
swap.main() 

Единственное исправление я нашел бросает все это в своей собственной функции, а затем просто называть его:

def main(): 
    import sys 
    app = QtGui.QApplication.instance() 
    if app is None: 
     app = QtGui.QApplication(sys.argv)  
    Dialog = QtGui.QDialog() 
    ui = Ui_Dialog() 
    ui.setupUi(Dialog) 
    Dialog.show() 
    app.exec_() 

... Тем не менее вопрос # 2, когда я делаю это изменение, мой GUI окно прямо сейчас всплывает и быстро пупс/исчезает , Я не уверен, почему бросать этот код в функцию и вызывать его, это приведет к изменению? Пожалуйста, помогите, я сидел на этом, не имея понятия, почему.

+0

Просто чтобы добавить, я провел некоторое исследование, и приложение app.exec() должно держать это окно. Почему он не удерживает его, когда я перемещаю часть if __main__ в свою собственную функцию и вызываю ее там, в отличие от того, что она работает нормально, когда она оставлена ​​как есть? – Zak44

ответ

1

Я не думаю, что вам нужно позвонить app.exec_(), если уже был экземпляр QApplication, созданный Maya. Я подозреваю, что, вероятно, этот вызов ничего не делает в этом случае, поэтому ваша функция возвращается (что хорошо, иначе блокирование остальной части майи).

Ваша проблема с исчезновением диалогового окна заключается в том, что вы не сохраняете ссылку на переменную Dialog, и поэтому это происходит при сборке мусора при завершении функции main. Вы должны вернуть Dialog из своей функции и сохранить ее где-то постоянным, чтобы предотвратить сбор мусора. Я подозреваю, что делать dialog = swap.main() будет достаточно (не забудьте добавить строку return Dialog)

+0

Спасибо! Это имеет смысл. Я не возвращал окно диалога. Вы уверены, что app.exec не нужен? Он работает без него, я думаю, я не понимаю, что, поскольку я думал, что это будет держать окно для взаимодействия. – Zak44

+0

@ sz200 Я думаю, майя будет называть 'app.exec _()' себя. Нет причин для создания экземпляра 'QApplication', но не для вызова' app.exec _() ' –