Maya Python - 使用 UI 中的数据

2024-03-20

我正在开发一个脚本程序,并且在用户界面方面遇到了一些困难。我制作了几个用户界面,所有这些用户界面似乎都可以单独工作,但我不知道如何将用户界面中输入的数据使用到另一个函数。我正在尝试获取枪类型(由用户选择)Bullet_Spray_Generator) 来影响随后调用哪个 UI。每种枪类型都需要一组不同的滑块值,因此我为每种枪类型制作了不同的 UI。我想我需要将从 BSG 中选择的数据传递到if函数以便调用正确的(第二个)UI,但运行它总是跳转到else函数并关闭窗口。到目前为止,这是我的代码:

import maya.cmds as cmds
from functools import partial


if (cmds.window("Bullet_Spray_Generator", exists = True)): 
    cmds.deleteUI("Bullet_Spray_Generator")
if (cmds.window("BSG2", exists = True)): 
    cmds.deleteUI("BSG2")

cmds.select(all=True)
cmds.delete()



def goShoot(numOfShots, distToTarget, *pArgs): 
    print "Begin"
    cmds.deleteUI("BSG2")
    createWall()

def cancelShoot(*pArgs):
    print "cancel"
    cmds.deleteUI("Bullet_Spray_Generator")


def createWall():
    cmds.select(all=True)
    cmds.delete()
    wall = cmds.polyCube(h=10, w=15, d=1, name='wall')
    cmds.move(0,5,0, 'wall')


def createGunUI(gunType, *pArgs):
    if (GunSelectCtrl == 'Pistol'):
        createPistolUI()
    elif (GunSelectCtrl == 'Shotgun'):
        createShotgunUI()
    elif (GunSelectCtrl == 'SMG'):
        createSMGUI()
    elif (GunSelectCtrl == 'Sniper Rifle'):
        createSniperUI()
    elif (GunSelectCtrl == 'RPG'):
        createRPGUI()
    else:
        print "Something went wrong"
        cancelShoot()



def createPistolUI():
    cmds.window("Pistol")
    cmds.columnLayout(adjustableColumn=True)

    cmds.deleteUI("Bullet_Spray_Generator")

    NumBulletsCtrl = cmds.intSliderGrp(label='Number of Shots',
    minValue=1, maxValue=9, value=4, field=True)

    DistCtrl = cmds.intSliderGrp(label='Distance to Target (metres)', 
    minValue=1, maxValue=50, value=25, field=True)

    cmds.button(label = "Fire", command = lambda *args: goShoot(cmds.intSliderGrp(NumBulletsCtrl, 
    query=True, value=True), cmds.intSliderGrp(DistCtrl, query=True, value=True), ))

    cmds.button(label = "Cancel", command = cancelShoot)

    cmds.showWindow("Pistol")

def createShotgunUI():
    cmds.window("Shotgun")
    cmds.columnLayout(adjustableColumn=True)

    cmds.deleteUI("Bullet_Spray_Generator")

    NumBulletsCtrl = cmds.intSliderGrp(label='Number of Shots',
    minValue=1, maxValue=4, value=2, field=True)

    DistCtrl = cmds.intSliderGrp(label='Distance to Target (metres)', 
    minValue=1, maxValue=50, value=25, field=True)

    cmds.button(label = "Fire", command = lambda *args: goShoot(cmds.intSliderGrp(NumBulletsCtrl, 
    query=True, value=True), cmds.intSliderGrp(DistCtrl, query=True, value=True), ))

    cmds.button(label = "Cancel", command = cancelShoot)

    cmds.showWindow("Shotgun")

def createSMGUI():
    cmds.window("SMG")
    cmds.columnLayout(adjustableColumn=True)

    cmds.deleteUI("Bullet_Spray_Generator")

    NumBulletsCtrl = cmds.intSliderGrp(label='Number of Shots',
    minValue=1, maxValue=20, value=4, field=True)

    DistCtrl = cmds.intSliderGrp(label='Distance to Target (metres)', 
    minValue=1, maxValue=50, value=25, field=True)

    cmds.button(label = "Fire", command = lambda *args: goShoot(cmds.intSliderGrp(NumBulletsCtrl, 
    query=True, value=True), cmds.intSliderGrp(DistCtrl, query=True, value=True), ))

    cmds.button(label = "Cancel", command = cancelShoot)

    cmds.showWindow("SMG")

def createSniperUI():
    cmds.window("Sniper")
    cmds.columnLayout(adjustableColumn=True)

    cmds.deleteUI("Bullet_Spray_Generator")

    NumBulletsCtrl = cmds.intSliderGrp(label='Number of Shots',
    minValue=1, maxValue=2, value=2, field=True)

    DistCtrl = cmds.intSliderGrp(label='Distance to Target (metres)', 
    minValue=1, maxValue=50, value=25, field=True)

    cmds.button(label = "Fire", command = lambda *args: goShoot(cmds.intSliderGrp(NumBulletsCtrl, 
    query=True, value=True), cmds.intSliderGrp(DistCtrl, query=True, value=True), ))

    cmds.button(label = "Cancel", command = cancelShoot)

    cmds.showWindow("Sniper")

def createRPGUI():
    cmds.window("RPG")
    cmds.columnLayout(adjustableColumn=True)

    cmds.deleteUI("Bullet_Spray_Generator")

    NumBulletsCtrl = cmds.intSliderGrp(label='Number of Shots',
    minValue=1, maxValue=1, value=1, field=True)

    DistCtrl = cmds.intSliderGrp(label='Distance to Target (metres)', 
    minValue=1, maxValue=50, value=25, field=True)

    cmds.button(label = "Fire", command = lambda *args: goShoot(cmds.intSliderGrp(NumBulletsCtrl, 
    query=True, value=True), cmds.intSliderGrp(DistCtrl, query=True, value=True), ))

    cmds.button(label = "Cancel", command = cancelShoot)

    cmds.showWindow("RPG")


def printNewMenuItem(item):
    print item
    return item


def createUI(): 
    cmds.window("Bullet_Spray_Generator")
    cmds.columnLayout(adjustableColumn=True)

    GunSelectCtrl = cmds.optionMenu(label='Gun', changeCommand=printNewMenuItem)
    cmds.menuItem(label='Pistol')
    cmds.menuItem(label='Shotgun')
    cmds.menuItem(label='SMG')
    cmds.menuItem(label='Sniper Rifle')
    cmds.menuItem(label='RPG')

    cmds.button(label = "Continue", command = partial(createGunUI, GunSelectCtrl))

    cmds.button(label = "Cancel", command = cancelShoot)

    cmds.showWindow("Bullet_Spray_Generator")

createUI()

任何帮助将不胜感激,非常感谢。


在 Maya 的 GUI 中传递复杂信息的最简单方法是将整个 UI 包装在 python 类中。该类可以“记住”您的所有字段、滑块等,以便您可以轻松地从一个或多个 GUI 项目收集信息并对其进行操作,而无需太多额外的工作。

class PistoUI(object):

    def __init__(self):
        self.window =  cmds.window("Pistol")
        cmds.columnLayout(adjustableColumn=True)
        self.bullet_count = cmds.intSliderGrp(label='Number of Shots', minValue=1, maxValue=9, value=4, field=True)
        self.distance = cmds.intSliderGrp(label='Distance to Target (metres)',  minValue=1, maxValue=50, value=25, field=True)
        cmds.button(label = "Fire", command = self.fire)
        cmds.button(label = "Cancel", command = self.cancel)
        cmds.showWindow(self.window)

    def fire(self, _ignore):
        bullets  =  cmds.intSliderGrp(self.bullet_count, q=True, v=True)
        distance = cmds.intSliderGrp(self.distance, q=True, v=True).
        goShoot(bullets, distance)

    def cancel(self, _ignore):
        cmds.deleteUI(self.window)

正如您在上面看到的,fire函数从活动窗口获取正确的字段并收集它们的值以传递给 goShoot 函数,而无需在布局步骤中进行任何额外工作以将值直接传递给函数。这比将所有部分都暴露在外要简单得多,也更优雅。它也更加独立 - 您可以在该方案中并排创建多个窗口,而不必担心按名称创建和删除它们。

更好的是,这些类非常适合区分逻辑差异和数据差异,因此您可以轻松重用重复代码:

class WeaponUI(object):
    LABEL = 'weapon_name'  #default name
    SHOTS = (1, 9, 4)   # default shots
    RANGE = (1, 50, 25)  # default range

    def __init__(self):
        self.window =  cmds.window(title = self.LABEL)
        cmds.columnLayout(adjustableColumn=True)
        self.bullet_count = cmds.intSliderGrp(label='Number of Shots', minValue=self.SHOTS[0],
                                                    maxValue=self.SHOTS[1],
                                                    value=self.SHOTS[2], field=True)
        self.distance = cmds.intSliderGrp(label='Distance to Target (metres)',  
                                                    minValue=self.RANGE[0], 
                                                    maxValue=self.RANGE[1], 
                                                    value=self.RANGE[2], field=True)
        cmds.button(label = "Fire", command = self.fire)
        cmds.button(label = "Cancel", command = self.cancel)
        cmds.showWindow(self.window)


    def fire(self, _ignore):
        bullets  =  cmds.intSliderGrp(self.bullet_count, q=True, v=True)
        distance = cmds.intSliderGrp(self.distance, q=True, v=True).
        print "firing", self.LABEL
        goShoot(bullets, target)

    def cancel(self, _ignore):
        cmds.deleteUI(self.window)

class PistolUI(WeaponUI):
    LABEL = 'pistol'  
    SHOTS = (1, 9, 4)   
    RANGE = (1, 50, 25) 

class ShotgunUI(WeaponUI):
    LABEL = 'shotgun'  
    SHOTS = (1, 4, 2)  
    RANGE = (1, 50, 25) 

class SniperUI(WeaponUI):
    LABEL = 'sniper'  
    SHOTS = (1, 4, 2)  
    RANGE = (1, 50, 25) 

... 等等

有关 Maya GUI 连接的更多信息here http://techartsurvival.blogspot.com/2014/04/maya-callbacks-cheat-sheet.html and here http://techartsurvival.blogspot.com/2014/02/rescuing-maya-gui-from-itself.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maya Python - 使用 UI 中的数据 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 不可勾选的单选按钮与专有的复选框

    从 UI 角度来看 是拥有一组具有取消选中功能的单选按钮更好 还是拥有一组独占的复选框 意味着一次只能选中一个 更好 Update 我没想到对此会有如此负面的反应 如果我给出一个更接近其使用方式的示例 也许会有所帮助 我有一个充满数据绑定内
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 强制子类从超类调用 @Override 方法。超类中的方法必须有主体

    我愿意强行SubClasses to Override方法来自SuperClass 方法在SuperClass不可能abstract 因为我想提供一些基本的实现 这是我的代码示例 public abstract class GenericM
  • C26444 避免使用自定义构造和销毁未命名对象(es.84)

    谁能帮我解决问题吗 以前我只有一种类方法 它是无效的显示 向量与列表 字符串和过滤器 get display函数在里面 然后我决定将这些函数分成矢量 get 和 void display 但是当我返回一个新的修改向量时向量获取 出现错误 C
  • Python 函数定义中只有正斜杠吗? [复制]

    这个问题在这里已经有答案了 In the Python 3 8 编程常见问题解答 https docs python org 3 8 faq programming html how do i write a function with o
  • Java 中 null 对象的 hashcode 必须是什么?

    根据此评论post https stackoverflow com questions 11184041 how is hashcode calculated for null object hascode of null objects
  • 哪里可以找到免费的开源 Android 自定义控件?

    我正在寻找一些具有高级自定义 Android 控件的网站 库 项目 如果您知道其中之一 它们是免费且开源的吗 看一眼commonsguy github 存储库 https github com commonsguy 您可以在那里找到几个非常
  • PhantomJS 多个页面的意外加载行为

    我有一个脚本 如下 可以通过 3 个步骤来抓取网站 当设置为一次最多一页时效果很好 然而 当我将其增加到一次 2 个时 事情开始变得不稳定 onFinished 的触发时间比我预期的要早 并且页面尚未完全加载 因此 我的脚本的其余部分被破坏
  • 如何使视图变灰。具体来说是一个EditText?

    大家好 首先感谢您阅读本文 当我失去焦点时 我很难找到更改 EditText 的方法 我希望它在发生这种情况时变灰 但我不希望它被禁用 因为用户可以触摸它并稍后编辑文本 Anyone 问候 You can 为文本设置不同的颜色 http d
  • 显示目录列表控件中的文件

    有没有办法让用户使用 BrowseDlg 选择特定文件 我所能找到的是你只能选择一个文件夹 我相信文件选择是正在使用的 常见 功能之一 任何人都可以提供一些关于如何实现这一目标的建议 Thanks Update 我正在考虑为此创建一个 C
  • 如何使用 Uri 对象打开现有的 SQLite 数据库?

    我在用着Intent ACTION GET CONTENT选择一个文件 在方法中onActivityResult我得到的 Uri Uri selectedfile data getData 如何使用 Uri 对象selectedfile打开
  • 为什么 AVFoundation 不接受 iOS 设备上的平面像素缓冲区?

    我一直在努力找出我的代码有什么问题 我正在创建一个平面CVPixelBufferRef写信给AVAssetWriter 该像素缓冲区是通过其他一些过程手动创建的 即 我没有从相机或类似的东西获取这些样本 在 iOS 模拟器上 附加示例并创建
  • Xamarin Android 文件系统路径

    我正在尝试在 Android 文件系统上写入和读取文件 您认为这项任务很简单 但我似乎无法为实际存在的文件夹 路径找到正确的枚举器 我读过关于同一主题的几篇文章 但他们都没有给出这个问题的直接答案 而那些似乎已经解决了问题的人 却采用了似乎
  • Python dict 具有基于键的默认值

    我需要一个字典 它会自动填充每个缺失的访问键的默认值 我发现了defaultdict以及其他一些方法来实现此目的 但我的情况的问题是我希望每个键的默认值特定于该键本身 例如 与defaultdict我可以实现这样的目标 from colle
  • WPF 矩形填充水平或垂直线

    我正在尝试创建一个充满水平线或垂直线的矩形 矩形的宽度是动态的 因此我无法使用图像画笔 如果有人知道任何解决方案 请告诉我 我想出了一个直接的方法来做到这一点 最后 我使用以下视觉画笔资源分别用水平 垂直或垂直虚线填充矩形
  • VC++ 中的异常错误 c0000005

    正在开发 VC 控制台应用程序 此应用程序从 Appdata Roaming 文件夹发送文件一段时间 发生的情况是出现此崩溃错误 Problem signature Problem Event Name APPCRASH Applicati
  • 我是否必须在 iOS 的 Objective-C 中保留块?

    我想创建一个方法 它接受一个块 将其保存在成员中 启动异步任务 然后在异步调用进行完成回调时调用该块 我必须保留该块吗 块内存的管理方式是否与任何其他对象相同 我可以合成一个属性来持有该方块吗 块与内存管理的其他对象类似 但又不相同 当创建
  • Xamarin 强迫我下载 Android SDK 和 NDK

    我的计算机上安装了 Android SDK 和 NDK 在自定义位置 我正在尝试在 Windows 环境中安装 xamarin 但安装程序想要强制我安装 SDK 和 NDK 看起来无法通过安装文件夹找到 有没有解决方案可以指定何时安装我的
  • 如何以 json 格式(双引号)漂亮打印(人类可读的打印)Python 字典? [复制]

    这个问题在这里已经有答案了 这是一个后续问题this one https stackoverflow com questions 16087662 pprint how to use double quotes to display str
  • 错误:程序类型已存在:com.google.android.gms.internal.measurement.zzdz

    我看过关于这个主题的几篇类似的文章 但没有一个适用于我的情况 我根据这些帖子收集到 这可能是由我的 Firebase 依赖项之一引起的 但我不确定如何解决此问题 清理 失效等工作已经完成 我的所有依赖项都已更新到最新版本 这是我的 grad
  • NodeJS 响应当我直接从 MySQL 获取时 MySQL 时区不同

    当我直接请求MySQL时 我得到UTC日期 我在MySQL服务器中设置UTC 但是使用NodeJS我得到UTC 2本地时区数据 为什么 如何设置 NodeJS 获取 UTC 我在初始化mysql连接时在index js中添加了时区 var
  • Maya Python - 使用 UI 中的数据

    我正在开发一个脚本程序 并且在用户界面方面遇到了一些困难 我制作了几个用户界面 所有这些用户界面似乎都可以单独工作 但我不知道如何将用户界面中输入的数据使用到另一个函数 我正在尝试获取枪类型 由用户选择 Bullet Spray Gener