我使用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_())
File1_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会打开一个面板并显示一些属性。我希望在单击按钮时调用此脚本在我使用Qtdesigner创建的第一种形式(file1.py)中。您可以告诉我如何实现此功能。谢谢。
答案 0 :(得分:0)
您需要对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()
信号即可运行它。这里唯一的问题是,如果直接连接到QWidget
,对runscript()
函数返回的runscript()
的引用将会丢失(并删除对象)。出于这个原因,我创建了一个方法launch_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_script()
的正确方法。我编写的代码应该可以工作,但显然违反了OOP原则,并且取决于软件分配的按钮小部件的名称。