在R promp上运行Qt事件循环

2024-04-25 21:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个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应用程序是否可以这样做。欢迎各种意见。你知道吗


Tags: importself应用程序maindefqtsimpledialog

热门问题