我正在尝试创建一个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应用程序是否可以执行此类操作。欢迎所有想法。