В настоящее время я пытаюсь показать значение в 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()
Благодарю.
Я написал следующий код для версии 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()
И вот пример 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
.
Нажмите эту картинку, чтобы воспроизвести анимацию GIF!
QtCore.SIGNAL('wasChanged()')
делает работу. Если это окно не выбрано - значение перестает обновляться.