Interface graphique Python (personnalisée) exécutée dans JMPSalut tout le monde,
J'ai un package Python personnalisé qui utilise des interfaces graphiques pour obtenir la saisie de l'utilisateur. Je souhaite maintenant exécuter ce package à partir de JMP18.
PY_SCRIPT = "
from mydummy.util import jmp
from mydummy.request import this_data
df = this_data().GUI()
jmp_source = jmp.df2jmp(df, 'MY DT')
";
EXECUTE = Python Execute({}, {jmp_source}, PY_SCRIPT);
If(EXECUTE == 0,
DT = Eval(Parse(jmp_source));
,
DT = New Table();
);En général, ce script fonctionne. Il crée l'interface graphique, traite les données en Python, les convertit en un script de table JMP et à partir de là, je peux utiliser JSL comme d'habitude pour l'analyse des données/les graphiques.
Cependant, Python Execute (ainsi que Run Programm) bloque toujours tout dans JMP. Ainsi, lorsque l'interface graphique est ouverte et que le code Python est en cours d'exécution, je ne peux plus rien faire dans JMP. Existe-t-il un moyen de démarrer une nouvelle instance de l'instance '~JMP\JMPPRO\18\jmp_python.exe' ?
J'ai aussi essayé un script python utilisant subprocess.Popen. Si j'attends le retour, j'ai les mêmes problèmes.
Mon interface graphique a besoin du thread principal, donc le threading n'est pas non plus possible - d'une manière ou d'une autre, je dois créer une nouvelle instance ~jmp_python.exe ou jsl peut le gérer.
Des suggestions ? Est-ce possible ?
Merci
Automatisation et scriptsRe : (personnalisée) GUI Python exécutée dans JMPL'intégration JMP Python s'exécute sur le thread principal, c'est pourquoi votre interface utilisateur prend le relais et bloque JMP. Vous pouvez essayer un sous-processus pour spécifier et lancer une copie de jmp_python.exe lancée en ligne de commande. C'est pourquoi les variables jmp.PYTHON_EXE et jmp.PYTHONW_EXE existent. (Je pense que PYTHONW_EXE peut être 19+). Mais à partir du sous-processus, vous ne pourrez pas utiliser le package saut .
D'autres problèmes que vous pouvez rencontrer lors de l'exécution d'une interface graphique Python sont qu'elle prend le relais de la boucle principale et que la fermeture de la dernière boîte de dialogue peut provoquer le blocage de JMP, car la sortie de la boucle principale de l'interface graphique Python peut supprimer des éléments de menu, des poignées de fenêtre, ... dont JMP dépend. C'est précaire, car vous essayez de charger une boîte à outils d'interface utilisateur différente via Python qui est intégrée dans une application d'interface utilisateur graphique...
Je pense qu'à l'heure actuelle, la meilleure façon de procéder est d'écrire l'interface graphique à l'aide de boîtes de dialogue et de fenêtres créées par JSL qui peuvent être appelées à partir de Python à l'aide de jmp.run_jsl. Vous pouvez le faire dans l'exemple de script pyDigest.py où un sélecteur de répertoire JSL est utilisé pour obtenir le chemin d'accès à un répertoire.
jmp.run_jsl('''
localPath = Pick Directory("Choose Directory to checksum");
// Pick Directory on windows returns a leading / use Convert File Path()
If( Host is("Windows"),
localpath = Convert File Path( localPath, windows )
);
L'utilisation des fonctions de dialogue et de fenêtre de JMP est compatible. Nous étudions le problème de l'interface utilisateur externe.
Re : (personnalisée) GUI Python exécutée dans JMPRunProgram bloque JMP car, sans ReadFunction, il collecte toutes les sorties avant de les renvoyer. Il peut également être utilisé avec une ReadFunction qui est appelée lorsque JMP est inactif ou pendant un wait(0), ce qui permet à JMP d'effectuer d'autres tâches tant qu'il y a un certain temps d'inactivité. Créer une vidéo dans JMP avec FFmpeg contient un exemple d'une simple ReadFunction qui lit le programme externe et écrit ce qu'elle lit dans le journal JMP.