我正在尝试创建一个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应用程序是否可以这样做。欢迎各种意见。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐