gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:16 27 4
gpt4 key购买 nike

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

文件 1.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))

文件2.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) 中。你能告诉我如何实现此功能吗?谢谢。

最佳答案

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

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

文件2.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_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 原则并且依赖于软件分配的按钮小部件的名称。

关于python - 如何使用 PyQt 在单击按钮时调用 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26867723/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com