Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的非阻塞图像查看器函数?_Python_Image_User Interface - Fatal编程技术网

Python中的非阻塞图像查看器函数?

Python中的非阻塞图像查看器函数?,python,image,user-interface,Python,Image,User Interface,我想要一个Python可访问的函数show_image(…),它启动一个相当简单的图像查看器,其中图像被指定为(例如)一个NumPy数组。重要的是,我不希望这个函数阻塞,而是希望脚本继续执行,同时保持窗口的交互性 我意识到,这个巨大的设计缺陷和被称为全局解释器锁(globalexplorerlock)的麻烦会阻碍任何基于Python的GUI与主线程中的Python代码并行运行,因此我显然需要启动一个线程来释放GIL,并用C/C++完成所有事情 我很乐意用Cython(或手写的C扩展模块)包装这样

我想要一个Python可访问的函数show_image(…),它启动一个相当简单的图像查看器,其中图像被指定为(例如)一个NumPy数组。重要的是,我不希望这个函数阻塞,而是希望脚本继续执行,同时保持窗口的交互性

我意识到,这个巨大的设计缺陷和被称为全局解释器锁(globalexplorerlock)的麻烦会阻碍任何基于Python的GUI与主线程中的Python代码并行运行,因此我显然需要启动一个线程来释放GIL,并用C/C++完成所有事情

我很乐意用Cython(或手写的C扩展模块)包装这样的东西,但我正在寻找合适的GUI解决方案。它应该是跨平台的,并且易于与Cython扩展一起构建(后者似乎排除了Qt/qmake/etc)

重要的是,我希望能够按需以这种方式启动多个窗口。似乎大多数GUI工具包都有一些类似于
run()
的函数,需要在主线程程序的
main()
末尾调用,这使得我不太清楚如何多次启动窗口。我想我每次都可以启动一个单独的GUI事件循环,但这似乎是一个灾难(我记得,至少GTK+明确不支持它)


我还要说,
fork()
'ing不是一个选项。

我个人使用的是
os.system(“xv foo.png&”)或任何小型图像查看器。根据详细信息,您还可以执行
g=os.popen(“xv-&”,“w”)
并将图像数据写入文件
g
。同样,根据具体情况,我有时会将我的程序设置为web服务器(几十行代码,例如Twisted),从那里提供图像,并在我的web浏览器中查看它们。我的观点是,您根本不需要任何GUI或多线程。

较新版本的
matplotlib
似乎有一个非阻塞
show()
:即使您不打算使用任何GUI工具包,您也应该真正了解它们是如何工作的,即使只是为了消除一些误解。GIL并不是您真正的主要问题,大多数GUI工具包都是单线程的,即使在没有GIL运行时的语言中也是如此,这是有充分理由的。因此,基本上你的代码模式是基于工具箱的方式来实现的。GUI保持交互性的基本方式是基于事件,并迫使程序员确保事件快速解决。这涉及到执行任何占用GUI线程很长时间的操作。最好将GUI线程视为持久的“主”线程,将其他所有线程视为工作线程,定期向GUI线程提供更新。(“打开一个新窗口”算作GUI更新。)GIL可能会对性能产生影响,因为工作线程将与输入事件处理程序竞争,但它肯定不是一个showstopper。珍雅:它不会有帮助。GUI将没有响应,无法完成重绘,而GUI线程没有GIL.millimoose:我知道它们是单线程的。如果我有一个相当长的NumPy或Theano计算,这将意味着一个没有响应的GUI长达几秒钟。我试过了。不知何故,OpenCV的
highgui
模块能够实现我想从C/C++中得到的东西。这就是我们现在正在做的,但它看起来真的很粗糙。它也不适合在以后更新相同的图像。您可能想看看这个: