在R提示符下运行Qt事件循环

时间:2016-07-11 16:43:01

标签: python r pyqt

我正在尝试创建一个Qt应用程序,它可以通过PyQt和rPython包与R通信,并在R提示符处于活动状态时保持响应。

这是一个最小的PyQt4脚本,它在窗口中创建一个按钮,当您单击它时会打印出“clicked”。

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Ui_simple(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Test")
        Dialog.resize(200,200)
        self.pushButton = QPushButton(Dialog)
        QObject.connect(self.pushButton, SIGNAL("clicked()"), self.clicked)

    def clicked(self):
        print "Clicked"

class main(object):
    def __init__(self):
        self.app = QApplication([])
        self.Dialog = QDialog()
        self.ui = Ui_simple()
        self.ui.setupUi(self.Dialog)    
        self.Dialog.show()

从Python提示符运行时,应用程序在创建并显示QDialog对象时变为活动状态。 python提示返回。然后,我可以exec_应用程序对象,当我退出对话框时,我得到提示:

>>> import simple
>>> a = simple.main()
>>> Clicked [python prompt is back now, I'm clicking the button]
Clicked
>>> a.app.exec_()
Clicked

这种行为 - 在等待Python文本提示输入时是交互式的 - 是因为PyQt4安装了等待键盘输入和处理事件的input hook

我想要做的是通过rPython包从R调用的Qt对话框具有相同的行为。以下显示对话框,但直到exec_调用才会显示,并且在退出应用程序退出对话框窗口之前R提示不会返回:

> require(rPython)
Loading required package: rPython
Loading required package: RJSONIO
> python.load("simple.py")
> python.exec("a = main()")     # nothing happens
> python.exec("a.app.exec_()") # dialog appears, R blocked
Clicked
Clicked   # click the buttons
Clicked
    0    # kill window now
> # back to R prompt

我的问题的解决方案将涉及在运行a=main()时出现的对话框,并且此时R会再次出现。

有一些基于Qt的R软件包似乎可以创建在R提示处于活动状态时保持交互的对话框,但它们大部分都在C中,我不确定这是否会产生很大的影响。例如,请参阅qtutils

qtbase中有一些事件循环处理,但我不确定从rPython调用的Qt应用程序是否可以执行此类操作。欢迎所有想法。

0 个答案:

没有答案