如何使用PyQt在单击按钮时调用python脚本

如何使用PyQt在单击按钮时调用python脚本,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我使用PyQt4创建了一个表单,它有一个按钮。在这个按钮上,我想调用另一个python脚本,如下所示: File1.py: import sys from PyQt4 import QtCore, QtGui from file1_ui import Ui_Form class MyForm(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, paren

我使用PyQt4创建了一个表单,它有一个按钮。在这个按钮上,我想调用另一个python脚本,如下所示:

File1.py:

import sys
from PyQt4 import QtCore, QtGui


from file1_ui import Ui_Form


class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())
文件1_ui.py

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(400, 300)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(120, 200, 95, 20))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "Close", None, QtGui.QApplication.UnicodeUTF8))
File2.py

import sys
from PyQt4 import Qt
from taurus.qt.qtgui.application import TaurusApplication

app = TaurusApplication(sys.argv)
panel = Qt.QWidget()
layout = Qt.QHBoxLayout()
panel.setLayout(layout)

from taurus.qt.qtgui.panel import TaurusForm

panel = TaurusForm()

model = [ 'test/i1/1/%s' % p for p in props ]
panel.setModel(model)

panel.show()
sys.exit(app.exec_())

File1_ui.py是从Qtdesigner创建的,然后我使用File1.py来执行它。因此单独执行File2.py时会打开一个面板并显示一些属性。我希望在第一个表单(File1.py)中单击按钮时调用此脚本这是我使用Qtdesigner创建的。您能告诉我如何实现此功能吗?谢谢。

您需要对
File2.py
进行一些修改,以根据它是否独立运行来进行适当的调用。当您通过
File1.py
启动脚本时,已经有一个
QApplication
实例正在运行事件循环,因此尝试创建另一个实例并运行其事件循环将导致问题

首先,将脚本的核心部分移动到它自己的函数中。这将允许您从
File1.py
轻松调用它。然后,您可以处理脚本独立运行并且需要创建
QApplication
实例并启动其事件循环的情况。(我不熟悉您正在使用的taurus库,但您可能可以将
TaurusApplication
替换为
QtGui.QApplication

File2.py:

import sys
from PyQt4 import QtCore, QtGui

def runscript():
    panel = QtGui.QWidget()
    layout = QtGui.QHBoxLayout(panel)
    return panel # Must return reference or panel will be deleted upon return


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    panel = runscript()
    panel.show()
    sys.exit(app.exec_())

假设文件位于同一目录中,您只需编写
import File2
并使用
File2.runscript()
运行代码即可。然后,只需将函数连接到按钮
clicked()
信号即可运行它。这里唯一的问题是,如果直接连接到
runscript()
,则从
runscript()
函数返回的对
QWidget
的引用将丢失(并且对象将被删除)。因此,我创建了一个方法
launch\u script()
,它将引用保存在
MyForm

File1.py:

import sys
from PyQt4 import QtCore, QtGui

from file1_ui import Ui_Form
import File2

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        # This is a bit of a hack.
        self.ui.pushButton.clicked.connect(self.launch_script)

    def launch_script(self):
        self.panel = File2.runscript()
        self.panel.show()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

我没有使用Qt Designer,因此我不知道如何将信号连接到
launch\u script()
。我编写的代码应该可以工作,但显然违反了OOP原则,并且取决于软件指定的按钮小部件的名称。

感谢您的回复。当我尝试使用上面的代码时,它在File2.py中给了我一个错误,说“return在函数外”。你能告诉我它在指示什么吗。我不熟悉使用PyQt.Thank。该错误意味着您的return语句超出了函数的范围。检查缩进,可能存在不一致性,导致Python将返回解释为函数外部。