Есть ли возможность получить данные из окна пользовательского интерфейса в переменную?

Я видел, что можно распечатать данные, которые были записаны в окне пользовательского интерфейса, однако, когда я искал в Интернете, ни один из вариантов не был таким, чтобы получить данные в переменную.

Это очень простой код окна - '

def printTxtField ( fieldID ):

    print cmds.textField( fieldID, query=True, text=True)

winID = 'kevsUI'


if cmds.window(winID, exists=True):

    cmds.deleteUI(winID)


cmds.window(winID)

cmds.columnLayout()


whatUSay = cmds.textField()
cmds.button(label='Confirm', command='printTxtField(whatUSay)')

cmds.showWindow()

'

Я хочу получить данные из текстового поля в переменную после нажатия кнопки подтверждения.

Вверху в строке cmds.button вы можете увидеть команду «print TxtField». Я знаю, что если есть возможность напечатать то, что было написано в текстовом поле, то должна быть возможность вместо этого поместить это в переменную. Однако я не нашел его. Кто-нибудь знает, как это сделать?

Извините за пред. вопрос.


person ErezProductions    schedule 23.07.2015    source источник
comment
Я думаю, что ваш вопрос не ясен. Лично я не очень понимаю, что вы хотите сделать!!! :(   -  person mlwn    schedule 23.07.2015
comment
Как @mlwn, ваш вопрос вообще не ясен (например, ваш предыдущий вопрос здесь, где были опубликованы некоторые комментарии с целью получения разъяснений). Если вы хотите получить быстрый и хороший ответ, вам НУЖНО четко объяснить, что вы хотите. Что касается вашего вопроса, что такое данные (строка, int, изображения, видео кота...)? Что такое окно пользовательского интерфейса (здесь я вижу только кнопку)? что ты уже испробовал? Можете ли вы предоставить исполняемый и прокомментированный фрагмент кода? Можете ли вы предоставить скриншоты?   -  person DrHaze    schedule 23.07.2015


Ответы (3)


Вы должны использовать частичный модуль для передачи переменной через команду кнопки (или лямбда-функцию)

from functools import partial

Вот тот же вопрос: maya python + переменная Pass при нажатии кнопки

person DrWeeny    schedule 23.07.2015

Из документа Python:

print вычисляет каждое выражение по очереди и записывает полученный объект в стандартный вывод. Если объект не является строкой, он сначала преобразуется в строку с использованием правил преобразования строк. Затем записывается (результирующая или исходная) строка.


Подводя итог в нескольких словах:

Оператор print ожидает выражения после его написания. Это может быть строка, int, объект...

В вашем случае:

То, что вы печатаете в своей функции printTxtField, является возвращаемым значением функции (cmds.textField( fieldID, query=True, text=True)).

При написании этого:

cmds.textField( fieldID, query=True, text=True) вы говорите Майе:

  1. Найдите значение textField с именем fieldID
  2. Сделайте запрос к нему (флаг запроса установлен в True
  3. Запросите его текст (что в нем написано)
  4. Возвращает это значение

В заключение:

Вместо того, чтобы печатать возвращаемое значение, вы можете легко присвоить это значение переменной: myVar = cmds.textField( fieldID, query=True, text=True)


Ваш измененный код:

def printTxtField ( fieldID ):
    #here is the modification made
    myVar = cmds.textField( fieldID, query=True, text=True)

Я прокомментировал и реорганизовал ваш код, чтобы сделать его более чистым:

import maya.cmds as cmds

KEVS_TEXTFIELD_VALUE = None

####################################################
# This function retrieve the value of Kevs_TextField
# and set this value to KEVS_TEXTFIELD_VALUE
####################################################
def retrieveData():
    # We use the query flag on the text attribute
    KEVS_TEXTFIELD_VALUE = cmds.textField("Kevs_TextField", query=True, text=True)
    print u"KEVS_TEXTFIELD_VALUE =" + KEVS_TEXTFIELD_VALUE

####################################################
# This function will create a show a new UI
####################################################
def drawUI():
    winID = 'kevsUI'

    if cmds.window(winID, exists=True): #If the window exists
        cmds.deleteUI(winID)            #Delete it
    cmds.window(winID)                  #Then create a new one

    cmds.columnLayout("Kevs_ColLayout") #Create a columnLayout to sort our widgets  

    # Now let's add some widgets in our columnLayout
    cmds.textField("Kevs_TextField")    #Add a textfied in the columnLayout
    #Then create a button that calls the retrieveData function when pressed
    cmds.button("Kevs_Button", label="Confirm", command=retrieveData)
    cmds.showWindow() #Show the window


drawUI() # Let's create a new UI
person DrHaze    schedule 23.07.2015
comment
Ок, понял! Большое спасибо за ответ! - person ErezProductions; 23.07.2015
comment
И теперь, если я хочу изменить окно пользовательского интерфейса, чтобы вместо текстовых данных я получал числа, как мне это сделать? Потому что я пытался манипулировать кодом, но мне это не удалось. - person ErezProductions; 23.07.2015
comment
он пишет в команде (2 строки с конца), что retrieveData не является объявленной глобальной переменной.. - person ErezProductions; 24.07.2015
comment
cmds.intField("Kevs_IntField", query=True, value=True) см. комментарий @theodox к его ответу... Я отредактировал свой ответ относительно ошибки, моя ошибка. - person DrHaze; 24.07.2015

Это возможно, но есть несколько проблем в том, как вы это делаете. Пример @DrHaze показывает, что нужно делать правильно, а именно использовать настоящие функции Python вместо строк.

Вам также нужно будет подумать о видимости различных функций: легко заставить все работать в слушателе, где весь код находится в одном месте, но когда задействовано несколько функций или модулей, отслеживать имена виджетов графического интерфейса становится сложнее.

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

def window_example(title):
    if cmds.window(title, exists=True):
        cmds.deleteUI(title)
    win = cmds.window(title)
    cmds.columnLayout()
    whatUSay = cmds.textField()

    #defining this hear gives it access to 'whatUSay'
    def print_text_contents(ignore):
        print cmds.textField( whatUSay, query=True, text=True)

    cmds.button(label='Confirm', command=print_text_contents)
    cmds.showWindow(win)
window_example('kevsUI')

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

Вот дополнительная справочная информация с некоторыми различными стратегиями для проверки.

person theodox    schedule 23.07.2015
comment
Спасибо! А как насчет чисел в качестве входных данных вместо строк? Какие изменения будут в этом коде, который вы написали? только изменив его на intField вместо textField и т. д.? - person ErezProductions; 24.07.2015
comment
у каждого виджета будет другой флаг для получения его содержимого. Для текстовых полей это будет флаг «текст», для intFields это будет флаг «значение». Вам нужно будет проверить документы Maya на наличие правильных флагов для каждого виджета. - person theodox; 24.07.2015