Самое простое решение - сделать переменную gui
глобальной:
def run ( *args ) :
global gui
gui = Gui() ;
gui.show() ;
Обычно объекты Qt удаляются, когда память не удерживается (например, использование self
в классе), поэтому я предполагаю, что он удаляет некоторые соединения так, как вы его создаете.
Это похоже на пластырь и может маскировать некоторые серьезные проблемы, особенно для более сложных интерфейсов.
Как правило, ваш основной класс должен на самом деле наследовать от QObject
, в основном один из следующих: QDialog
, QMainWindow
, QWidget
. Также важно объявить все объекты, унаследованные от QObject
с self
, чтобы они стали переменной экземпляра и могли быть доступны по всему классу. В противном случае вы рискуете удалить объект во время сборки мусора, потому что он ни к чему не относится, и Python считает, что с вами покончено.
В конце концов это будет выглядеть так:
import pymel.core as pm
import maya.OpenMayaUI as mui
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
from shiboken2 import wrapInstance
class Gui(QtWidgets.QWidget):
def __init__(self):
self.ui = 'template_uiE'
self.w = 500.00
self.h = 300.00
self.deleteGui(self.ui)
# Pointer
mayaMainWindow_ptr = mui.MQtUtil.mainWindow()
mayaMainWindow = wrapInstance(long(mayaMainWindow_ptr), QtWidgets.QWidget)
super(Gui, self).__init__(mayaMainWindow)
self.setObjectName(self.ui)
self.resize(self.w, self.h)
self.setWindowFlags(QtCore.Qt.Window)
# Grid Layout
self.button_QPushButton = QtWidgets.QPushButton()
self.button_QPushButton.setObjectName('button_QPushButton_uiE')
self.button_QPushButton.setText('Template Button')
self.button_QPushButton.clicked.connect(self.template_btnCmd)
# --> Insert
self.main_QHBoxLayout = QtWidgets.QVBoxLayout()
self.main_QHBoxLayout.addWidget(self.button_QPushButton)
self.setLayout(self.main_QHBoxLayout)
def deleteGui(self, ui):
if pm.window(ui, ex=True):
pm.deleteUI(ui)
def template_btnCmd(self):
print 'This is working...?'
def run(*args):
gui = Gui()
gui.show()
run()
Также несколько слов о стандартах кодирования: пожалуйста, придерживайтесь PEP8 или стандартов кодирования Google . Удалите все точки с запятой (;), так как это крайне непифоново и выглядит как двоеточие (:), это очень запутанно. Закройте пробел в вашем пустом пространстве, так как он занимает ненужное пространство и делает его более нечитаемым. Не смешивайте camelCase с именами snake_case, выбирайте одно или другое. Нет смысла развивать свой собственный стиль, когда другим трудно его прочитать: D