我的方案如下:我使用pyqt小部件在第二个显示器上显示纯色全屏,并使用连续捕获图像的相机观察此显示。我对图像进行了一些处理,这是我感兴趣的数据。当使用qt4agg后端与ipython和matplotlib交互使用时,这非常有效。
% ipython -pylab
# ... import PatternDisplay, starting camera
pd = PatternDisplay(); pd.show(); pd.showColor(r=255,g=255,b=255)
imshow(cam.current_image)
我现在在控制台脚本中需要类似的行为:它应该显示PatternDisplay小部件,捕获图像,而不是更改PatternDisplay上的颜色并拍摄新图像,等等。
现在的问题是我的脚本中永远不会更新/重绘PatternDisplay,可能是因为PyQt永远不会有机会运行它的事件队列。我没有运气试图将我的脚本的线性工作者部分移动到QThread,因为我无法再与另一个Thread的PatternDisplay Widget进行通信。我试图复制ipython / matplotlib的实现,但是我没有完全理解它,它非常复杂 - 它避免了通过猴子修补运行QApplication主循环并以某种方式将QT移动到它自己的线程中。然后,如果用户输入了新命令,则使用QTimer定期检查。
难道没有一种简单的方法可以实现我想做的事情吗?如果需要,我很乐意提供更多信息。谢谢你的帮助!
答案 0 :(得分:2)
你需要的东西比IPython的工作更容易 - IPython使Qt应用程序和命令行同时交互。
我认为在Qt中执行此操作的方法是使用定时触发的计时器,并将信号连接到表示获取新图像的函数的“插槽”并将其放入在小部件中。所以你从事件循环中拉出来,而不是试图推动它。
我没有太多使用过Qt,所以我不能给出具体细节,但我想的越多,我认为这是正确的做法。
答案 1 :(得分:1)
我用ipython 0.10(代码here)以下列方式解决了同样的问题(即终端中的交互式ipython控制台和独立运行的GUI线程)
1.构造QApplication对象,但不要显式输入其事件循环
2.运行嵌入式IPython实例
3.运行您需要的UI代码,方法是实例化您的窗口并在其上调用show()
(例如here和yade.qt.Controller()
,我将其归结为F12
。(我没有找到一种方法如何让嵌入式shell在会话开始时运行命令,就好像用户输入了它一样)
(你也可以先show()
你的窗口,然后运行嵌入式ipython。它将为Qt提供事件循环。)
(BTW我也尝试从后台线程运行Qt4(使用python线程模块和Qt4.QThreads),但它拒绝以这种方式固执地运行。不要那么麻烦。)
缺点是在ipython繁忙时UI将被阻止。我希望为0.11找到更好的东西,它应该有更好的线程设置(I asked on ipython-users关于如何解锁UI)。
HTH,v。