2017-10-14 8 views
0

Je suis en train d'écrire une interface utilisateur en python pour 3DS Max 2018 et je ne peux pas avoir de saisie de texte, bien que tout ce que j'ai essayé jusqu'à présent fonctionne bien. Il ne semble tout simplement pas lire les frappes pour une raison quelconque. Ils sont enregistrés par Max à la place, ce qui fait les choses appropriées comme le lancement de l'éditeur de matériel quand j'appuie sur 'm' au lieu de taper un 'm'. J'ai essayé d'imprimer des pressions sur les touches et ça ressemble à du contrôle, du changement et de l'alternance. J'ai même essayé d'exécuter les exemples de scripts fournis avec Max et j'ai eu la même erreur, donc je réalise qu'il s'agit probablement d'un bug, mais je ne crois pas qu'Autodesk l'ait corrigé en ce moment, donc je suis à la recherche d'un solution de contournement ...3DS Max 2018 Pyside2 - L'entrée de texte ne fonctionne pas

Voici un exemple pour les tests:

from PySide2 import QtWidgets, QtCore, QtGui 
import MaxPlus 
import os 

class SampleUI(QtWidgets.QDialog): 
    def __init__(self, parent=MaxPlus.GetQMaxMainWindow()): 
     super(SampleUI, self).__init__(parent) 
     self.initUI() 

    def initUI(self): 
     self.testBtn = QtWidgets.QPushButton("Test") 
     mainLayout = QtWidgets.QHBoxLayout() 
     testBox = QtWidgets.QLineEdit("Test!") 
     mainLayout.addWidget(testBox) 
     self.setLayout(mainLayout) 

if __name__ == "__main__": 
    try: 
     ui.close() 
    except: 
     pass 

    ui = SampleUI() 
    ui.show() 

Répondre

0

Voici un ui simple que je trouve à la page du forum Autodesks:

http://help.autodesk.com/view/3DSMAX/2018/ENU/?guid=__developer_what_s_new_in_3ds_max_python_api_what_s_new_in_the_3ds_max_2018_p_html

Il y a beaucoup d'ambiguïté dans les docs max, alway s a été, mais j'espère que ça aide. J'ai fait des modifications dans un script différent, où je me suis ajouté aux contrôles pour pouvoir accéder aux contrôles et configurer les connexions dans une fonction différente et ça marche plutôt bien.

Ceci est très blasé et je sens toujours que l'implémentation de Python est maladroite et encombrante. Je préfère toujours travailler avec Maya Python, il a toujours été fiable, mais je dois travailler avec MaxPlus pour le moment.

from PySide2 import QtWidgets, QtCore, QtGui 
import MaxPlus 
import os 

class SuperDuperText(QtWidgets.QLineEdit): 
    def focusInEvent(self, event): 
     MaxPlus.CUI.DisableAccelerators() 

    def focusOutEvent(self, event): 
     MaxPlus.CUI.EnableAccelerators() 


class SuperDuperUI(QtWidgets.QDialog): 

def __init__(self, parent=MaxPlus.GetQMaxMainWindow()): 
    super(SuperDuperUI, self).__init__(parent) 
    self.setWindowTitle("Sample UI") 
    self.initUI() 


def initUI(self): 
    mainLayout = QtWidgets.QVBoxLayout() 

    maxScriptsDir = MaxPlus.PathManager.GetScriptsDir() 
    testLabel = QtWidgets.QLabel("Your scripts dir is: " + maxScriptsDir) 
    mainLayout.addWidget(testLabel) 

    testBtn = QtWidgets.QPushButton("This does nothing.") 
    mainLayout.addWidget(testBtn) 

    testEdit = SuperDuperText() 
    testEdit.setPlaceholderText("You can type in here if you like...") 
    mainLayout.addWidget(testEdit) 

    self.setLayout(mainLayout) 


if __name__ == "__main__": 

try: 
    ui.close() 
except: 
    pass 

ui = SuperDuperUI() 
ui.show() 
+0

Ceci est une solution assez propre, il suce juste que vous devez sous-classer chaque widget. Cependant, j'ai été en contact avec Autodesk et ils m'ont donné accès à une excellente fonction qui résout complètement ce "bug" et devrait être dans la prochaine version. Je ne sais pas comment ça ne l'a pas fait dans la première version, mais je suppose que c'est l'inconvénient d'un déploiement annuel! – Spencer

0

soupir enfin trouvé: https://help.autodesk.com/view/3DSMAX/2018/ENU/?guid=__developer_troubleshooting_3ds_max_python_a_html

« pour capturer l'entrée du clavier pour vos fenêtres Qt, vous mu st désactiver les 3ds Max raccourcis clavier en appelant les points suivants lorsque votre contrôle de l'interface utilisateur se concentrer: »

La commande de référence est: MaxPlus.CUI.DisableAccelerators()

Et ne pas oublier de défaire quand votre script perd le focus: MaxPlus.CUI.EnableAccelerators()