先把這個UI篇結束,然後在繼續通讀Max的Python模塊的文檔。
這一篇我是在Max2016上測試的,聽說從2017之後,開始支持ui文件(Qt designer.exe)的解析.
在Max2016目錄裏的Python2.7並沒有這個designer工具,我是在我自己安裝的2.7的環境裏找到的,它安靜的躺在PySide的文件夾裏等我輕輕的雙擊。
打開之後的界面是這樣的
之後。。。我就省略了,這種基礎UI佈局類的軟件都是基本操作。
然後簡單的做了一下功能按鈕,沒有想太多,就按之前DotNet做的那個醜UI做吧
然後保存一下,文件名ExpressiongMirror.ui,於是我們就得到了一個UI文件
在2017版應該提供了直接將這個UI文件變成圖形界面的接口。明天找時間重開一篇補充一下這個吧。
這個UI文件的內容我貼一下,其實就是個xml格式的文件
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>245</width>
<height>369</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QPushButton" name="ResetXFormToPolyBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>221</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>ResetXFormToPoly</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
<property name="default">
<bool>false</bool>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
<widget class="QPushButton" name="GetSampleBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>40</y>
<width>221</width>
<height>71</height>
</rect>
</property>
<property name="text">
<string>GetSample</string>
</property>
</widget>
<widget class="QPushButton" name="MirrorVertexBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>120</y>
<width>221</width>
<height>71</height>
</rect>
</property>
<property name="text">
<string>MirrorVertex</string>
</property>
</widget>
<widget class="QPushButton" name="GetLocalSampleBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>200</y>
<width>221</width>
<height>71</height>
</rect>
</property>
<property name="text">
<string>GetLocalSample</string>
</property>
</widget>
<widget class="QPushButton" name="MirrorLocalVertexBtn">
<property name="geometry">
<rect>
<x>10</x>
<y>280</y>
<width>221</width>
<height>71</height>
</rect>
</property>
<property name="text">
<string>MirrorLocalVertex</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>ResetXFormToPolyBtn</sender>
<signal>clicked()</signal>
<receiver>Form</receiver>
<slot>ResetXFormToPolyClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>215</x>
<y>19</y>
</hint>
<hint type="destinationlabel">
<x>240</x>
<y>23</y>
</hint>
</hints>
</connection>
<connection>
<sender>GetSampleBtn</sender>
<signal>clicked()</signal>
<receiver>Form</receiver>
<slot>GetSampleClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>216</x>
<y>77</y>
</hint>
<hint type="destinationlabel">
<x>243</x>
<y>77</y>
</hint>
</hints>
</connection>
<connection>
<sender>MirrorVertexBtn</sender>
<signal>clicked()</signal>
<receiver>Form</receiver>
<slot>MirrorVertexClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>209</x>
<y>153</y>
</hint>
<hint type="destinationlabel">
<x>241</x>
<y>155</y>
</hint>
</hints>
</connection>
<connection>
<sender>GetLocalSampleBtn</sender>
<signal>clicked()</signal>
<receiver>Form</receiver>
<slot>GetLocalSampleClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>211</x>
<y>243</y>
</hint>
<hint type="destinationlabel">
<x>241</x>
<y>243</y>
</hint>
</hints>
</connection>
<connection>
<sender>MirrorLocalVertexBtn</sender>
<signal>clicked()</signal>
<receiver>Form</receiver>
<slot>MirrorLocalVertexClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>216</x>
<y>311</y>
</hint>
<hint type="destinationlabel">
<x>243</x>
<y>313</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>ResetXFormToPolyClicked()</slot>
<slot>GetSampleClicked()</slot>
<slot>MirrorVertexClicked()</slot>
<slot>GetLocalSampleClicked()</slot>
<slot>MirrorLocalVertexClicked()</slot>
</slots>
</ui>
有興趣的可以看一下文件的內容,反正。。。我不太感興趣,也不想自己造“解析這個文件爲max2016及一下支持py的版本能用的文件“的輪子。
“生命苦短,我用派森”
這就是python的標語,輪子有人造好了,拿來主義,用就好了。(手動貼上那張牛頓圖)
找到我自己安裝的python2.7和PySide的目錄
在PySide的目錄上有個Scripts文件夾,裏面有個uic.py文件,它就是輪子。
爲了省略篇幅,我就直接吧我的ExpressiongMirror.ui複製到這個文件夾下。
然後(。。我的是win平臺。。。)按住Shift,右鍵,選擇在此處打開命令窗口.然後,也看到了,路徑已經cd好了。
輸入python uic.py ExpressiongMirror.ui -o ExpressiongMirror.py,按下偉大的Enter。我們的py文件就生成了,然後我把這UI和PY文件剪切走,還原我的原生態PySide目錄。
打開看一下ExpressiongMirror.py文件
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ExpressiongMirror.ui'
#
# Created: Thu Nov 8 00:12:47 2018
# by: pyside-uic 0.2.15 running on PySide 1.2.4
#
# WARNING! All changes made in this file will be lost!
from PySide import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(245, 369)
self.ResetXFormToPolyBtn = QtGui.QPushButton(Form)
self.ResetXFormToPolyBtn.setGeometry(QtCore.QRect(10, 10, 221, 23))
self.ResetXFormToPolyBtn.setAutoDefault(False)
self.ResetXFormToPolyBtn.setDefault(False)
self.ResetXFormToPolyBtn.setFlat(False)
self.ResetXFormToPolyBtn.setObjectName("ResetXFormToPolyBtn")
self.GetSampleBtn = QtGui.QPushButton(Form)
self.GetSampleBtn.setGeometry(QtCore.QRect(10, 40, 221, 71))
self.GetSampleBtn.setObjectName("GetSampleBtn")
self.MirrorVertexBtn = QtGui.QPushButton(Form)
self.MirrorVertexBtn.setGeometry(QtCore.QRect(10, 120, 221, 71))
self.MirrorVertexBtn.setObjectName("MirrorVertexBtn")
self.GetLocalSampleBtn = QtGui.QPushButton(Form)
self.GetLocalSampleBtn.setGeometry(QtCore.QRect(10, 200, 221, 71))
self.GetLocalSampleBtn.setObjectName("GetLocalSampleBtn")
self.MirrorLocalVertexBtn = QtGui.QPushButton(Form)
self.MirrorLocalVertexBtn.setGeometry(QtCore.QRect(10, 280, 221, 71))
self.MirrorLocalVertexBtn.setObjectName("MirrorLocalVertexBtn")
self.retranslateUi(Form)
QtCore.QObject.connect(self.ResetXFormToPolyBtn, QtCore.SIGNAL("clicked()"), Form.ResetXFormToPolyClicked)
QtCore.QObject.connect(self.GetSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetSampleClicked)
QtCore.QObject.connect(self.MirrorVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorVertexClicked)
QtCore.QObject.connect(self.GetLocalSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetLocalSampleClicked)
QtCore.QObject.connect(self.MirrorLocalVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorLocalVertexClicked)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
self.ResetXFormToPolyBtn.setText(QtGui.QApplication.translate("Form", "ResetXFormToPoly", None, QtGui.QApplication.UnicodeUTF8))
self.GetSampleBtn.setText(QtGui.QApplication.translate("Form", "GetSample", None, QtGui.QApplication.UnicodeUTF8))
self.MirrorVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorVertex", None, QtGui.QApplication.UnicodeUTF8))
self.GetLocalSampleBtn.setText(QtGui.QApplication.translate("Form", "GetLocalSample", None, QtGui.QApplication.UnicodeUTF8))
self.MirrorLocalVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorLocalVertex", None, QtGui.QApplication.UnicodeUTF8))
爲了簡單操作,我就直接在這個py文件裏繼續寫了,根據上篇博客,直接寫一個lei繼承這個類和QtGui.QWidget。。
注意 我刪除了上面的註釋
from PySide import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(245, 369)
self.ResetXFormToPolyBtn = QtGui.QPushButton(Form)
self.ResetXFormToPolyBtn.setGeometry(QtCore.QRect(10, 10, 221, 23))
self.ResetXFormToPolyBtn.setAutoDefault(False)
self.ResetXFormToPolyBtn.setDefault(False)
self.ResetXFormToPolyBtn.setFlat(False)
self.ResetXFormToPolyBtn.setObjectName("ResetXFormToPolyBtn")
self.GetSampleBtn = QtGui.QPushButton(Form)
self.GetSampleBtn.setGeometry(QtCore.QRect(10, 40, 221, 71))
self.GetSampleBtn.setObjectName("GetSampleBtn")
self.MirrorVertexBtn = QtGui.QPushButton(Form)
self.MirrorVertexBtn.setGeometry(QtCore.QRect(10, 120, 221, 71))
self.MirrorVertexBtn.setObjectName("MirrorVertexBtn")
self.GetLocalSampleBtn = QtGui.QPushButton(Form)
self.GetLocalSampleBtn.setGeometry(QtCore.QRect(10, 200, 221, 71))
self.GetLocalSampleBtn.setObjectName("GetLocalSampleBtn")
self.MirrorLocalVertexBtn = QtGui.QPushButton(Form)
self.MirrorLocalVertexBtn.setGeometry(QtCore.QRect(10, 280, 221, 71))
self.MirrorLocalVertexBtn.setObjectName("MirrorLocalVertexBtn")
self.retranslateUi(Form)
QtCore.QObject.connect(self.ResetXFormToPolyBtn, QtCore.SIGNAL("clicked()"), Form.ResetXFormToPolyClicked)
QtCore.QObject.connect(self.GetSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetSampleClicked)
QtCore.QObject.connect(self.MirrorVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorVertexClicked)
QtCore.QObject.connect(self.GetLocalSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetLocalSampleClicked)
QtCore.QObject.connect(self.MirrorLocalVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorLocalVertexClicked)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
#我忘了修改這個。。。在py裏直接修改了
Form.setWindowTitle(QtGui.QApplication.translate("Form", "ExpressiongMirror", None, QtGui.QApplication.UnicodeUTF8))
self.ResetXFormToPolyBtn.setText(QtGui.QApplication.translate("Form", "ResetXFormToPoly", None, QtGui.QApplication.UnicodeUTF8))
self.GetSampleBtn.setText(QtGui.QApplication.translate("Form", "GetSample", None, QtGui.QApplication.UnicodeUTF8))
self.MirrorVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorVertex", None, QtGui.QApplication.UnicodeUTF8))
self.GetLocalSampleBtn.setText(QtGui.QApplication.translate("Form", "GetLocalSample", None, QtGui.QApplication.UnicodeUTF8))
self.MirrorLocalVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorLocalVertex", None, QtGui.QApplication.UnicodeUTF8))
# add it by c.p.
class _GCProtector(object):
widgets = []
class MyWindow(QtGui.QWidget, Ui_Form):
def __init__(self):
super(MyWindow, self).__init__()
self.setupUi(self)
def ResetXFormToPolyClicked(self):
print "ResetXFormToPolyClicked"
def GetSampleClicked(self):
print "GetSampleClicked"
def MirrorVertexClicked(self):
print "MirrorVertexClicked"
def GetLocalSampleClicked(self):
print "GetLocalSampleClicked"
def MirrorLocalVertexClicked(self):
print "MirrorLocalVertexClicked"
def main():
app = QtGui.QApplication.instance()
if not app:
app = QtGui.QApplication([])
MaxPlus.FileManager.Reset(True)
form = MyWindow()
_GCProtector.widgets.append(form)
#爲了讓這個窗口一直浮於max主窗口之上,Max2016
MaxPlus.AttachQWidgetToMax(form)
form.show()
if __name__ == '__main__':
main()
這樣,我的py文件修改好了,然後我打開max2016在一個ms文件裏這麼寫道:
fname = "E:\\我的堅果雲\\MaxScriptsDev\\ExpressiongMirror.py"
python.ExecuteFile fname
Ctrl+E運行一下。。
於是就有了
到此,工具的UI篇就這麼恍恍惚惚的結束了吧