The Foundry Nuke - отображает анимированное значение на QLabel

1

В настоящее время я пытаюсь показать значение в QLabel (QLineEdit тоже будет работать) на основе временной шкалы NUKE (или Maya).

Я использую Nuke для запуска кода, и я хотел бы отобразить значение, основанное на текущем фрейме, чтобы отобразить что-то вроде этого:

Текущий кадр равен 1001. Если я перейду на фрейм 1002, я бы хотел, чтобы QLabel изменился соответствующим образом.

Есть способ сделать это?

import PySide.QtGui as QtGui
import PySide.QtCore as QtCore

def test():
    class framePanel(QtGui.QWidget):
       super(framePanel, self).__init__(self):
           layout = QtGui.QVBoxLayout(self)
           self.label = QtGui.QLabel('This is frame 1001')
           layout.addWidget(self.label)

    framePanel = framePanel()
    framePanel.show()

test()

Благодарю.

Теги:
pyqt
pyside
qlabel
nuke

1 ответ

0
Лучший ответ

Я написал следующий код для версии Mac The Foundry Nuke 11.2v4, поэтому вместо PySide есть модуль PySide2 который предназначен для предыдущих версий Nuke. Кроме того, есть некоторые различия касательно QtWidgets vs QtGui. Для получения текущего кадра вам необходимо использовать nuke.frame().

Вот пример с QLabel:

import nuke
from PySide2 import QtGui, QtCore
from PySide2 import QtWidgets

def theTest():  
    class framePanel(QtWidgets.QWidget):
        label = QtWidgets.QLabel("The current frame is: %s" % nuke.frame())
        label.show()
theTest()

Изображение 174551

И вот пример QMessageBox с динамически меняющимся значением:

import nuke
import os.path
from PySide2 import QtGui, QtCore
from PySide2 import QtWidgets

def signalEmitter():
    qApplication = QtWidgets.QApplication.activeWindow()
    qApplication.emit(QtCore.SIGNAL('wasChanged()'))

nuke.addKnobChanged(signalEmitter, nodeClass='Viewer')
qmBox = QtWidgets.QMessageBox(None)
qmBox.setText('The current frame is: %s' % nuke.frame())
qmBox.connect(QtCore.SIGNAL("wasChanged()"), lambda: qmBox.setText('The current frame is: %s' % nuke.frame()))
qmBox.setModal(False)
qmBox.show()

QMessageBox не является modal.

Изображение 174551

Нажмите эту картинку, чтобы воспроизвести анимацию GIF!

  • 1
    Привет, большое спасибо за ответ. Это в основном то, что я хочу сделать, но я бы хотел, чтобы лейбл менялся в интерактивном режиме. Возможность прокручивать временную шкалу и видеть обновление ярлыка на лету без перезапуска кода. Вы знаете какой-нибудь способ сделать это?
  • 0
    Второй пример делает то, что вы хотели. Единственная проблема: это окно должно быть выбрано (чтобы быть в фокусе). QtCore.SIGNAL('wasChanged()') делает работу. Если это окно не выбрано - значение перестает обновляться.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню