question of undo Error

Hi. i am a newbie studying max python scirpt.
I am writing this post because of the undo problem of max Pyside.

If you create the UI of the code below
You can not use undo (Ctrl + Z) after creating a box

#=======================================
# Error Scirpt
#=======================================
from PySide import QtGui
from PySide import QtCore
import MaxPlus as mp
import pymxs
 
 
class BaseWindow():
 
    def __init__(self, title='custom_UI', width=300, height=100):
        self.win = QtGui.QWidget( parent = mp.GetQMaxWindow() )
        self.win.resize(width, height)
        self.win.setWindowTitle(title)
        self.main_layout = QtGui.QVBoxLayout()
        self.win.setLayout(self.main_layout)
        self.btn = QtGui.QPushButton('MakeBox')
        self.main_layout.addWidget(self.btn )
 
    def get_window(self):
        return self.win
 
 
    def show(self):
        self.win.show()
 
 
if __name__ =='__main__':
    def makeBox(evt=None):
        ns = pymxs.__ContextExpr('undoon')
        try :
            shape = mp.Factory.CreateGeomObject(mp.ClassIds.Box)
            node = mp.Factory.CreateNode( shape )
        finally :
            ns = pymxs.__ContextExpr('undooff')
 
    win = BaseWindow()
    win.show()
    win.btn.clicked.connect(makeBox)

but Using this code below
You can use the undo (Ctrl + Z) function.

# not Error scirpt
 
 
def test(evt=None):
    ns = pymxs.__ContextExpr('undoon')
    try :
        shape = mp.Factory.CreateGeomObject(mp.ClassIds.Box)
        node = mp.Factory.CreateNode( shape )
    finally :
        ns = pymxs.__ContextExpr('undooff')
 
if __name__ =='__main__':
    test(evt=None)

The only difference is that you just connect to the pyside button with make box funtion.
What is the solution of this?

I searched the internet all day yesterday. I do not know.
so. I upload this question. Please help me.

version : 3ds Max 2017