(自定义)在 JMP 中执行的 Python GUI大家好,
我有一个自定义 Python 包,它使用 GUI 来获取用户输入。我现在想从 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();
);总体来说,这个脚本是有效的。它创建 GUI,用 Python 处理数据,将其转换为 JMP-Table-Script,然后我就可以像往常一样使用 JSL 进行数据分析/图形处理。
但是,Python Execute(以及 Run Programm)总是会冻结 JMP 中的所有内容。因此,当 GUI 打开并且 Python 代码正在运行时,我无法再在 JMP 中执行任何操作。有没有办法启动“~JMP\JMPPRO\18\jmp_python.exe”实例的新实例?
我还尝试使用 subprocess.Popen 的 python 脚本。如果我等待返回,我确实会遇到同样的问题。
我的 GUI 需要主线程,因此线程化也是不可能的 - 我需要以某种方式创建一个新的 ~jmp_python.exe 实例或者 jsl 可以处理它。
有什么建议吗?可以吗?
谢谢
自动化和脚本回复:(自定义)在 JMP 中执行的 Python GUIJMP Python Integration 在主线程上运行,这就是您的 UI 接管并阻止 JMP 的原因。您可以尝试使用子进程来指定并启动 jmp_python.exe 的命令行启动副本。这就是 jmp.PYTHON_EXE 和 jmp.PYTHONW_EXE 变量存在的原因。(我认为 PYTHONW_EXE 可能是 19+)。但是从子进程中您将无法使用跳转包。
运行 Python GUI 时您可能会发现的其他问题是它接管了主循环,当最后一个对话框关闭时可能会导致 JMP 崩溃,因为退出 Python GUI 主循环可能会删除 JMP 所依赖的菜单项、窗口句柄……这很危险,因为您正尝试通过嵌入在 GUI 应用程序中的 Python 加载不同的 UI 工具包……
我认为目前最好的方法是使用 JSL 创建的对话框和窗口编写 GUI,可以使用 jmp.run_jsl 从 Python 调用这些对话框和窗口。您可以在 pyDigest.py 示例脚本中执行此操作,其中使用 JSL 目录选择器获取目录的路径。
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 )
);
使用 JMP 的对话框和窗口功能是兼容的。我们正在调查外部 UI 问题。
回复:(自定义)在 JMP 中执行的 Python GUIRunProgram 冻结 JMP,因为如果没有 ReadFunction,它会在返回之前收集所有输出。它还可以与在 JMP 空闲时或在 wait(0) 期间调用的 ReadFunction 一起使用,这样只要有空闲时间,JMP 就可以执行其他工作。 使用 FFmpeg 在 JMP 中制作视频有一个简单的 ReadFunction 示例,它从外部程序读取并将读取的内容写入 JMP 日志。