Выбор параметров в Mayagui в Python - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно создать графический интерфейс в Maya Python, где я должен использовать Sql-запрос, чтобы получить имя проекта, ОС, проект, путь.Например, в моем коде, если выбрано Projectname «Abc», тогда os, projectid и path должны быть выбраны в соответствии с выбранным именем проекта.как это сделать ??

Я получил имя проекта, но не могу получить другие параметры

import os,mysql.connector as mc , platform 
cmds.window(title='Test Window')
name = []
id = []  
Os = []
path = []
wpath = []
# Query for getting various projects from db 
cursor = db.cursor()
#selecting projectname
ans = cursor.fetchall()
cursor.close()
def projid(name):
  #selecting project id
   pid = cursor.fetchone()
   print "out"
   print pid



 def Getprojid(z):
   global pname
    pname =  cmds.optionMenu(z , query=True,value = True)


for ans1 in ans:
   name .append(ans1[0])

cmds.columnLayout()
polygonSelectMenu = cmds.optionMenu(w = 250, h = 30, label = "Project 
Selection:")
for proj in name:
   cmds.menuItem(label = proj)



cmds.button(label='click me Select project ', 
command='printTxtField(polygonSelectMenu)')

cmds.showWindow()

1 Ответ

0 голосов
/ 06 февраля 2019

Поскольку вы новичок в Python Maya Gui, вы должны позаботиться о нескольких вещах, когда пишете инструменты, включающие взаимодействие с пользовательским интерфейсом.

  • Разделите модуль пользовательского интерфейса и модуль ядра (часть функциональности ядра или уровень данных).
  • Если у вас есть какая-либо связь с базой данных, держите модуль БД отдельно, что в идеале должночитать, писать или обновлять базу данных.
  • Если возможно, вы можете также сохранить уровень взаимодействия или модуль для интеграции модуля ядра и пользовательского интерфейса вместе со слоем базы данных.

Может быть большегранулированные или организованные проекты, но для начала это поможет вам добиться цели.Ниже приведен пример вашего требования.

Здесь я предполагаю, что ваш проект и его соответствующие данные поступают из базы данных или любых других ресурсов.

#=========================================================================#
# db code:
#=========================================================================#

# This module can have your own implementation. I am just writing some example code.

def get_projects_data(*args, **kwargs):
    """ This should return all the records of the project table from your db.
    For filters you can pass them through kwargs.
    """
    return [{'id': 1021, 'name': 'Abc', 'os': 'some os', 'path': 'some path'},
            {'id': 1022, 'name': 'Def', 'os': 'some other os', 'path': 'some other path'}]


#=========================================================================#
# Ui Code:
#=========================================================================#

import maya.cmds as cmds

class ProjectUI(object):
    _name = 'ProjectManager'
    _title = 'Project Manager'


    def __init__(self, project_data=None):
        self.project_data = project_data
        self.win = None

        # Create the UI
        self.create_ui()

        # Try to populate the projects
        self.populate_projects()

        # Force update the details for first time
        self.update_project_details()

    def create_ui(self):
        """This will create required UI components
        """
        # First check if the ui exists, then close it
        self.close()

        # Now thw create the window
        self.win = cmds.window(self.name, title=self.title)
        # Creat a column layout with adjustable True and row spacing to 5
        cmds.columnLayout(adj=True, rs=5)

        # Create project option menu and add a change commang to trigger while
        # you chnage the projects from the option menu.
        self.project_om = cmds.optionMenu(
            label='Projects', ChangeCommand=self.update_project_details)

        # Create required text fields
        self.project_id_tf = cmds.textFieldGrp(label='Id', editable=False)     
        self.project_path_tf = cmds.textFieldGrp(label='Path', editable=False)
        self.project_os_tf = cmds.textFieldGrp(label='OS', editable=False)


    def populate_projects(self):
        """This should populate all the available projects in poject option menu.
        """
        # First check if we have any project data in hand. If not then we should 
        # exit right away.
        if not self.project_data:
            print('No project data found for populatin projects')
            retturn

        for data in project_data:
            prject = data.get('name')
            menuItem(label=project, parent=self.project_om)

    def update_project_details(self, project=''):
        """This should update all other project details in UI and must me
        triggered while changing projects from poject option menu.
        """
        if not self.project_data:
            retturn

        if not project:
            project = cmds.optionMenu(self.project_om, q=True, value=True)

        project_details = None
        for data in self.project_data:
            if project == data.get('name'):
                project_details = data
                break

        if not project_details:
            print('No project details found for %s' % project)
            return

        proj_id = project_details.get('id')
        proj_path = project_details.get('path')
        proj_os = project_details.get('os')

        cmds.textFieldGrp(self.project_id_tf, e=True, text='%s' % proj_id)
        cmds.textFieldGrp(self.project_path_tf, e=True, text=proj_path)
        cmds.textFieldGrp(self.project_os_tf, e=True, text=proj_os)

    def show(self):
        """Just show the UI if its created ever.
        """
        if self.win:
            cmds.showWindow(self.win)

    def close(self):
        """For deleting the UI if exists
        """
        if cmds.window(self._name, query=True, exists=True):
            cmds.deleteUi(self.name, window=True)

#=========================================================================#
# Integration Code:
#=========================================================================# 

def main():
    # First fetch the data
    data = get_projects_data()

    if not data:
        print('No project data fetched.')
        return

    win = ProjectUI(project_data=data)
    win.show()

    # Return the win just if you want an pointer to same
    return win

# Now just call the main method, whenever required
main()

Приведенный выше фрагмент кода является простопример.Это не проверено внутри майя.Но я надеюсь, что это даст вам отправную точку.Опять же, если вы не знакомы с классами, вы можете сделать то же самое процедурным способом, передав аргументы.Я настоятельно рекомендую PySide или PyQt вместе с PyMel для создания надежных и эффективных инструментов пользовательского интерфейса.

...