使用线性运行的控制台应用程序中的pyqt小部件

时间:2011-07-04 16:49:21

标签: console pyqt ipython

我的方案如下:我使用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定期检查。

难道没有一种简单的方法可以实现我想做的事情吗?如果需要,我很乐意提供更多信息。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

你需要的东西比IPython的工作更容易 - IPython使Qt应用程序和命令行同时交互。

认为在Qt中执行此操作的方法是使用定时触发的计时器,并将信号连接到表示获取新图像的函数的“插槽”并将其放入在小部件中。所以你从事件循环中拉出来,而不是试图推动它。

我没有太多使用过Qt,所以我不能给出具体细节,但我想的越多,我认为这是正确的做法。

答案 1 :(得分:1)

我用ipython 0.10(代码here)以下列方式解决了同样的问题(即终端中的交互式ipython控制台和独立运行的GUI线程)  1.构造QApplication对象,但不要显式输入其事件循环  2.运行嵌入式IPython实例  3.运行您需要的UI代码,方法是实例化您的窗口并在其上调用show()(例如hereyade.qt.Controller(),我将其归结为F12。(我没有找到一种方法如何让嵌入式shell在会话开始时运行命令,就好像用户输入了它一样)

(你也可以先show()你的窗口,然后运行嵌入式ipython。它将为Qt提供事件循环。)

(BTW我也尝试从后台线程运行Qt4(使用python线程模块和Qt4.QThreads),但它拒绝以这种方式固执地运行。不要那么麻烦。)

缺点是在ipython繁忙时UI将被阻止。我希望为0.11找到更好的东西,它应该有更好的线程设置(I asked on ipython-users关于如何解锁UI)。

HTH,v。